Remove storage textures from vertex tests

The template change in test/tint/builtins/gen/gen.wgsl.tmpl removes the
remaining usages of storage textures in vertex shaders in Tint end2end
tests, replacing them instead with a VertexOutput object to prevent DCE.
The template is the only manually modified file in this change, the rest
were created with:
./tools/run gen
./tools/run tests --generate-expected

Binding numbers and entry point ordering had to be slightly shuffled to
work around: crbug.com/42250109

Bug: 344846829
Change-Id: I6c2c80b78168a13c6c545e7a0dc924d64997ff0e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/193260
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Natalie Chouinard <chouinard@google.com>
diff --git a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl
index f13d44a..e22ab39 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<r8unorm, read>) -> vec3<u32>
-fn textureDimensions_00229f() {
+fn textureDimensions_00229f() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_00229f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_00229f();
+  prevent_dce = textureDimensions_00229f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_00229f();
+  prevent_dce = textureDimensions_00229f();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_00229f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.dxc.hlsl
index 9819f9a..492cc11 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_00229f() {
+uint3 textureDimensions_00229f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_00229f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_00229f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_00229f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_00229f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_00229f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_00229f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.fxc.hlsl
index 9819f9a..492cc11 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_00229f() {
+uint3 textureDimensions_00229f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_00229f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_00229f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_00229f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_00229f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_00229f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_00229f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.msl
index 0266662..88ce825 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_00229f(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_00229f(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_00229f(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_00229f(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_00229f(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_00229f(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_00229f(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_00229f(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.spvasm
index eae0111..d865f9f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_00229f "textureDimensions_00229f"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_00229f = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_00229f = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_00229f
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_00229f
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_00229f
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_00229f
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_00229f
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_00229f
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.wgsl
index d49f90c..da76e54 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00229f.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r8unorm, read>;
 
-fn textureDimensions_00229f() {
+fn textureDimensions_00229f() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_00229f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_00229f();
+  prevent_dce = textureDimensions_00229f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_00229f();
+  prevent_dce = textureDimensions_00229f();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_00229f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl
index 09762ee..d96b636 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
 
 // fn textureDimensions(texture: texture_multisampled_2d<i32>) -> vec2<u32>
-fn textureDimensions_00348c() {
+fn textureDimensions_00348c() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_00348c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_00348c();
+  prevent_dce = textureDimensions_00348c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_00348c();
+  prevent_dce = textureDimensions_00348c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_00348c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.dxc.hlsl
index afffc74..15206a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_00348c() {
+uint2 textureDimensions_00348c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_00348c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_00348c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_00348c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_00348c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_00348c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_00348c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.fxc.hlsl
index afffc74..15206a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_00348c() {
+uint2 textureDimensions_00348c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_00348c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_00348c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_00348c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_00348c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_00348c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_00348c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.glsl
index 7a23e77..d3f95f7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp isampler2DMS arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_00348c() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_00348c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2DMS arg_0_1;
+uvec2 textureDimensions_00348c() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_00348c() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_00348c();
+  prevent_dce.inner = textureDimensions_00348c();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp isampler2DMS arg_0_1;
+uvec2 textureDimensions_00348c() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_00348c() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_00348c();
+  prevent_dce.inner = textureDimensions_00348c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isampler2DMS arg_0_1;
+uvec2 textureDimensions_00348c() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_00348c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.msl
index a1204f5..1a78c68 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_00348c(texture2d_ms<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_00348c(texture2d_ms<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_ms<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_00348c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_ms<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_00348c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_ms<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_00348c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_ms<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_00348c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_ms<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_ms<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_ms<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_00348c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_ms<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_00348c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.spvasm
index 6a14db2..515bfbe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_00348c "textureDimensions_00348c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 1 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 1 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_00348c = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_00348c = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_00348c
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_00348c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_00348c
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_00348c
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_00348c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_00348c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.wgsl
index 7ec345a..6375abb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/00348c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_multisampled_2d<i32>;
 
-fn textureDimensions_00348c() {
+fn textureDimensions_00348c() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_00348c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_00348c();
+  prevent_dce = textureDimensions_00348c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_00348c();
+  prevent_dce = textureDimensions_00348c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_00348c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl
index cc5f408..4e4e26d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32uint, read_write>) -> u32
-fn textureDimensions_01e21e() {
+fn textureDimensions_01e21e() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_01e21e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_01e21e();
+  prevent_dce = textureDimensions_01e21e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_01e21e();
+  prevent_dce = textureDimensions_01e21e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_01e21e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.dxc.hlsl
index 7f22762..fdae3af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_01e21e() {
+uint textureDimensions_01e21e() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_01e21e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_01e21e();
+  prevent_dce.Store(0u, asuint(textureDimensions_01e21e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_01e21e();
+  prevent_dce.Store(0u, asuint(textureDimensions_01e21e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_01e21e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.fxc.hlsl
index 7f22762..fdae3af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_01e21e() {
+uint textureDimensions_01e21e() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_01e21e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_01e21e();
+  prevent_dce.Store(0u, asuint(textureDimensions_01e21e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_01e21e();
+  prevent_dce.Store(0u, asuint(textureDimensions_01e21e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_01e21e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.msl
index 5593c47..2166c55 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_01e21e(texture1d<uint, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_01e21e(texture1d<uint, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_01e21e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_01e21e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_01e21e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_01e21e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_01e21e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_01e21e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.spvasm
index 0261eb4..0cd6f97 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,71 +22,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_01e21e "textureDimensions_01e21e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_01e21e = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_01e21e = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_01e21e
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_01e21e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_01e21e
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_01e21e
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_01e21e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_01e21e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.wgsl
index 280bf97..edd5ec9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01e21e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32uint, read_write>;
 
-fn textureDimensions_01e21e() {
+fn textureDimensions_01e21e() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_01e21e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_01e21e();
+  prevent_dce = textureDimensions_01e21e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_01e21e();
+  prevent_dce = textureDimensions_01e21e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_01e21e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl
index 36ae5f3..10bd349 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8uint, read_write>) -> u32
-fn textureDimensions_01edb1() {
+fn textureDimensions_01edb1() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_01edb1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_01edb1();
+  prevent_dce = textureDimensions_01edb1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_01edb1();
+  prevent_dce = textureDimensions_01edb1();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_01edb1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.dxc.hlsl
index a28a5e3..4881e2c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_01edb1() {
+uint textureDimensions_01edb1() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_01edb1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_01edb1();
+  prevent_dce.Store(0u, asuint(textureDimensions_01edb1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_01edb1();
+  prevent_dce.Store(0u, asuint(textureDimensions_01edb1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_01edb1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.fxc.hlsl
index a28a5e3..4881e2c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_01edb1() {
+uint textureDimensions_01edb1() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_01edb1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_01edb1();
+  prevent_dce.Store(0u, asuint(textureDimensions_01edb1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_01edb1();
+  prevent_dce.Store(0u, asuint(textureDimensions_01edb1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_01edb1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.glsl
index e21cfc8..2662bf2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_01edb1() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_01edb1();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_01edb1() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_01edb1() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_01edb1();
+  prevent_dce.inner = textureDimensions_01edb1();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_01edb1() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_01edb1() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_01edb1();
+  prevent_dce.inner = textureDimensions_01edb1();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_01edb1() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_01edb1();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.msl
index 39b6cb9..6e2f615 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_01edb1(texture1d<uint, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_01edb1(texture1d<uint, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_01edb1(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_01edb1(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_01edb1(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_01edb1(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_01edb1(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_01edb1(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.spvasm
index e2c9a5f..d63ac24 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_01edb1 "textureDimensions_01edb1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_01edb1 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_01edb1 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_01edb1
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_01edb1
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_01edb1
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_01edb1
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_01edb1
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_01edb1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.wgsl
index dc518a5..1e4c90c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/01edb1.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8uint, read_write>;
 
-fn textureDimensions_01edb1() {
+fn textureDimensions_01edb1() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_01edb1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_01edb1();
+  prevent_dce = textureDimensions_01edb1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_01edb1();
+  prevent_dce = textureDimensions_01edb1();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_01edb1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl
index 0135d2e..62ad640 100644
--- a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_1d<i32>;
 
 // fn textureDimensions(texture: texture_1d<i32>, level: u32) -> u32
-fn textureDimensions_022903() {
+fn textureDimensions_022903() -> u32{
   var arg_1 = 1u;
   var res: u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_022903();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_022903();
+  prevent_dce = textureDimensions_022903();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_022903();
+  prevent_dce = textureDimensions_022903();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_022903();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.dxc.hlsl
index 03d1821..eddcc38 100644
--- a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_022903() {
+uint textureDimensions_022903() {
   uint arg_1 = 1u;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_022903();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_022903();
+  prevent_dce.Store(0u, asuint(textureDimensions_022903()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_022903();
+  prevent_dce.Store(0u, asuint(textureDimensions_022903()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_022903();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.fxc.hlsl
index 03d1821..eddcc38 100644
--- a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_022903() {
+uint textureDimensions_022903() {
   uint arg_1 = 1u;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_022903();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_022903();
+  prevent_dce.Store(0u, asuint(textureDimensions_022903()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_022903();
+  prevent_dce.Store(0u, asuint(textureDimensions_022903()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_022903();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.glsl
index 0c00216..7bc7e10 100644
--- a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_022903() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_022903();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2D arg_0_1;
+uint textureDimensions_022903() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_022903() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_022903();
+  prevent_dce.inner = textureDimensions_022903();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isampler2D arg_0_1;
+uint textureDimensions_022903() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_022903() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_022903();
+  prevent_dce.inner = textureDimensions_022903();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp isampler2D arg_0_1;
+uint textureDimensions_022903() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_022903();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.msl
index bcb14cd..435949f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_022903(texture1d<int, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_022903(texture1d<int, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_022903(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_022903(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_022903(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_022903(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_022903(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_022903(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.spvasm
index bae6a93..b436979 100644
--- a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,76 +22,102 @@
                OpName %textureDimensions_022903 "textureDimensions_022903"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_022903 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_uint Function %24
+%textureDimensions_022903 = OpFunction %uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %9
+        %res = OpVariable %_ptr_Function_uint Function %9
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %uint %26 %27
-               OpStore %res %25
-         %31 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %32 = OpLoad %uint %res
-               OpStore %31 %32
+         %27 = OpLoad %15 %arg_0
+         %28 = OpLoad %uint %arg_1
+         %26 = OpImageQuerySizeLod %uint %27 %28
+               OpStore %res %26
+         %30 = OpLoad %uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_022903
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_022903
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %uint %textureDimensions_022903
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %52 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %53 = OpFunctionCall %uint %textureDimensions_022903
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_022903
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_022903
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.wgsl
index 6e4a7b7..33c47bf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/022903.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_1d<i32>;
 
-fn textureDimensions_022903() {
+fn textureDimensions_022903() -> u32 {
   var arg_1 = 1u;
   var res : u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_022903();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_022903();
+  prevent_dce = textureDimensions_022903();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_022903();
+  prevent_dce = textureDimensions_022903();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_022903();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl
index 32f1c63..38b928d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16uint, read_write>) -> vec3<u32>
-fn textureDimensions_0276ec() {
+fn textureDimensions_0276ec() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0276ec();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0276ec();
+  prevent_dce = textureDimensions_0276ec();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0276ec();
+  prevent_dce = textureDimensions_0276ec();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0276ec();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.dxc.hlsl
index b6e46d1..c0c408a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0276ec() {
+uint3 textureDimensions_0276ec() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0276ec();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0276ec();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0276ec()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0276ec();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0276ec()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0276ec();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.fxc.hlsl
index b6e46d1..c0c408a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0276ec() {
+uint3 textureDimensions_0276ec() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0276ec();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0276ec();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0276ec()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0276ec();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0276ec()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0276ec();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.glsl
index 669e6d9..a98be2c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_0276ec() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0276ec();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_0276ec() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_0276ec() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0276ec();
+  prevent_dce.inner = textureDimensions_0276ec();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_0276ec() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_0276ec() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0276ec();
+  prevent_dce.inner = textureDimensions_0276ec();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_0276ec() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0276ec();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.msl
index f68db04..8821e88 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0276ec(texture3d<uint, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_0276ec(texture3d<uint, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_0276ec(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_0276ec(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_0276ec(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0276ec(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0276ec(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0276ec(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.spvasm
index 1a0ad29..5edc249 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_0276ec "textureDimensions_0276ec"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0276ec = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_0276ec = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_0276ec
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_0276ec
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_0276ec
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_0276ec
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_0276ec
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_0276ec
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.wgsl
index 635fb14..54a716f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0276ec.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16uint, read_write>;
 
-fn textureDimensions_0276ec() {
+fn textureDimensions_0276ec() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0276ec();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0276ec();
+  prevent_dce = textureDimensions_0276ec();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0276ec();
+  prevent_dce = textureDimensions_0276ec();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0276ec();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl
index d1c5f01..b216927 100644
--- a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32float, read_write>) -> vec2<u32>
-fn textureDimensions_029589() {
+fn textureDimensions_029589() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_029589();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_029589();
+  prevent_dce = textureDimensions_029589();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_029589();
+  prevent_dce = textureDimensions_029589();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_029589();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.dxc.hlsl
index 49e14a0..56af906 100644
--- a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_029589() {
+uint2 textureDimensions_029589() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_029589();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_029589();
+  prevent_dce.Store2(0u, asuint(textureDimensions_029589()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_029589();
+  prevent_dce.Store2(0u, asuint(textureDimensions_029589()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_029589();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.fxc.hlsl
index 49e14a0..56af906 100644
--- a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_029589() {
+uint2 textureDimensions_029589() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_029589();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_029589();
+  prevent_dce.Store2(0u, asuint(textureDimensions_029589()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_029589();
+  prevent_dce.Store2(0u, asuint(textureDimensions_029589()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_029589();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.msl
index 3acfc54..fcfd0be 100644
--- a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_029589(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_029589(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_029589(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_029589(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_029589(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_029589(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_029589(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_029589(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.spvasm
index dd47a0a..abdc244 100644
--- a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,74 +21,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_029589 "textureDimensions_029589"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_029589 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_029589 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_029589
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_029589
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_029589
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_029589
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_029589
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_029589
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.wgsl
index 15ae9ca..8eb21b8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/029589.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32float, read_write>;
 
-fn textureDimensions_029589() {
+fn textureDimensions_029589() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_029589();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_029589();
+  prevent_dce = textureDimensions_029589();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_029589();
+  prevent_dce = textureDimensions_029589();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_029589();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl
index 0d621b6..0ac27d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16sint, read>) -> u32
-fn textureDimensions_0329b0() {
+fn textureDimensions_0329b0() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0329b0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0329b0();
+  prevent_dce = textureDimensions_0329b0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0329b0();
+  prevent_dce = textureDimensions_0329b0();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0329b0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.dxc.hlsl
index 5fc2c73..f18e490 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0329b0() {
+uint textureDimensions_0329b0() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0329b0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0329b0();
+  prevent_dce.Store(0u, asuint(textureDimensions_0329b0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0329b0();
+  prevent_dce.Store(0u, asuint(textureDimensions_0329b0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0329b0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.fxc.hlsl
index 5fc2c73..f18e490 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0329b0() {
+uint textureDimensions_0329b0() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0329b0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0329b0();
+  prevent_dce.Store(0u, asuint(textureDimensions_0329b0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0329b0();
+  prevent_dce.Store(0u, asuint(textureDimensions_0329b0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0329b0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.glsl
index 0e9c2a5..62f1a63 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_0329b0() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0329b0();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_0329b0() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_0329b0() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0329b0();
+  prevent_dce.inner = textureDimensions_0329b0();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_0329b0() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_0329b0() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0329b0();
+  prevent_dce.inner = textureDimensions_0329b0();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_0329b0() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0329b0();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.msl
index 4238c80..1584c2b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0329b0(texture1d<int, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_0329b0(texture1d<int, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_0329b0(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_0329b0(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_0329b0(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0329b0(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0329b0(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0329b0(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.spvasm
index 01197e2..354158c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_0329b0 "textureDimensions_0329b0"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0329b0 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_0329b0 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_0329b0
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_0329b0
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_0329b0
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_0329b0
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_0329b0
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_0329b0
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.wgsl
index cf3fa12..c0df005 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0329b0.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16sint, read>;
 
-fn textureDimensions_0329b0() {
+fn textureDimensions_0329b0() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0329b0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0329b0();
+  prevent_dce = textureDimensions_0329b0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0329b0();
+  prevent_dce = textureDimensions_0329b0();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0329b0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl
index a4a9a45..72f716d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16float, read_write>) -> u32
-fn textureDimensions_033195() {
+fn textureDimensions_033195() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_033195();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_033195();
+  prevent_dce = textureDimensions_033195();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_033195();
+  prevent_dce = textureDimensions_033195();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_033195();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.dxc.hlsl
index 8a61ef4..6112cb2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_033195() {
+uint textureDimensions_033195() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_033195();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_033195();
+  prevent_dce.Store(0u, asuint(textureDimensions_033195()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_033195();
+  prevent_dce.Store(0u, asuint(textureDimensions_033195()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_033195();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.fxc.hlsl
index 8a61ef4..6112cb2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_033195() {
+uint textureDimensions_033195() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_033195();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_033195();
+  prevent_dce.Store(0u, asuint(textureDimensions_033195()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_033195();
+  prevent_dce.Store(0u, asuint(textureDimensions_033195()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_033195();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.glsl
index b0c09b7..2169da3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_033195() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_033195();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_033195() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_033195() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_033195();
+  prevent_dce.inner = textureDimensions_033195();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_033195() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_033195() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_033195();
+  prevent_dce.inner = textureDimensions_033195();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_033195() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_033195();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.msl
index b64f227..7058000 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_033195(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_033195(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_033195(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_033195(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_033195(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_033195(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_033195(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_033195(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.spvasm
index 0443bb6..cc2dd95 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_033195 "textureDimensions_033195"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_033195 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_033195 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_033195
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_033195
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_033195
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_033195
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_033195
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_033195
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.wgsl
index 5542882..4a5a263 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033195.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16float, read_write>;
 
-fn textureDimensions_033195() {
+fn textureDimensions_033195() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_033195();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_033195();
+  prevent_dce = textureDimensions_033195();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_033195();
+  prevent_dce = textureDimensions_033195();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_033195();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl
index 659cbc5..b2a0efd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8unorm, read>) -> u32
-fn textureDimensions_033ea7() {
+fn textureDimensions_033ea7() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_033ea7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_033ea7();
+  prevent_dce = textureDimensions_033ea7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_033ea7();
+  prevent_dce = textureDimensions_033ea7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_033ea7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.dxc.hlsl
index 05be229..41bc76b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_033ea7() {
+uint textureDimensions_033ea7() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_033ea7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_033ea7();
+  prevent_dce.Store(0u, asuint(textureDimensions_033ea7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_033ea7();
+  prevent_dce.Store(0u, asuint(textureDimensions_033ea7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_033ea7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.fxc.hlsl
index 05be229..41bc76b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_033ea7() {
+uint textureDimensions_033ea7() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_033ea7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_033ea7();
+  prevent_dce.Store(0u, asuint(textureDimensions_033ea7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_033ea7();
+  prevent_dce.Store(0u, asuint(textureDimensions_033ea7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_033ea7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.glsl
index a3d7300..281f13fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_033ea7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_033ea7();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uint textureDimensions_033ea7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_033ea7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_033ea7();
+  prevent_dce.inner = textureDimensions_033ea7();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uint textureDimensions_033ea7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_033ea7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_033ea7();
+  prevent_dce.inner = textureDimensions_033ea7();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8) uniform highp readonly image2D arg_0;
+uint textureDimensions_033ea7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_033ea7();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.msl
index b38ca7a..792d02d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_033ea7(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_033ea7(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_033ea7(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_033ea7(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_033ea7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_033ea7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_033ea7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_033ea7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.spvasm
index 2c45041..8ad547c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_033ea7 "textureDimensions_033ea7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_033ea7 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_033ea7 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_033ea7
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_033ea7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_033ea7
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_033ea7
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_033ea7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_033ea7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.wgsl
index 302de0f..6f9b649 100644
--- a/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/033ea7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8unorm, read>;
 
-fn textureDimensions_033ea7() {
+fn textureDimensions_033ea7() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_033ea7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_033ea7();
+  prevent_dce = textureDimensions_033ea7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_033ea7();
+  prevent_dce = textureDimensions_033ea7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_033ea7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl
index 28441b4..830c590 100644
--- a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8sint, read_write>) -> u32
-fn textureDimensions_038847() {
+fn textureDimensions_038847() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_038847();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_038847();
+  prevent_dce = textureDimensions_038847();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_038847();
+  prevent_dce = textureDimensions_038847();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_038847();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.dxc.hlsl
index f8f12b5..bcd9624 100644
--- a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_038847() {
+uint textureDimensions_038847() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_038847();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_038847();
+  prevent_dce.Store(0u, asuint(textureDimensions_038847()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_038847();
+  prevent_dce.Store(0u, asuint(textureDimensions_038847()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_038847();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.fxc.hlsl
index f8f12b5..bcd9624 100644
--- a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_038847() {
+uint textureDimensions_038847() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_038847();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_038847();
+  prevent_dce.Store(0u, asuint(textureDimensions_038847()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_038847();
+  prevent_dce.Store(0u, asuint(textureDimensions_038847()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_038847();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.glsl
index c004d6f..df78138 100644
--- a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_038847() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_038847();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_038847() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_038847() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_038847();
+  prevent_dce.inner = textureDimensions_038847();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_038847() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_038847() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_038847();
+  prevent_dce.inner = textureDimensions_038847();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_038847() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_038847();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.msl
index 7cb0219..5c4c0a7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_038847(texture1d<int, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_038847(texture1d<int, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_038847(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_038847(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_038847(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_038847(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_038847(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_038847(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.spvasm
index 3919de4..5cfb77b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_038847 "textureDimensions_038847"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_038847 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_038847 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_038847
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_038847
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_038847
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_038847
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_038847
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_038847
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.wgsl
index 0909e14..f26a5dc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/038847.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8sint, read_write>;
 
-fn textureDimensions_038847() {
+fn textureDimensions_038847() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_038847();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_038847();
+  prevent_dce = textureDimensions_038847();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_038847();
+  prevent_dce = textureDimensions_038847();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_038847();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl
index 00e4e6b..464f22a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8snorm, read_write>) -> vec2<u32>
-fn textureDimensions_03f81e() {
+fn textureDimensions_03f81e() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_03f81e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_03f81e();
+  prevent_dce = textureDimensions_03f81e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_03f81e();
+  prevent_dce = textureDimensions_03f81e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_03f81e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.dxc.hlsl
index f93ef04..57eca16 100644
--- a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_03f81e() {
+uint2 textureDimensions_03f81e() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_03f81e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_03f81e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_03f81e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_03f81e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_03f81e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_03f81e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.fxc.hlsl
index f93ef04..57eca16 100644
--- a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_03f81e() {
+uint2 textureDimensions_03f81e() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_03f81e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_03f81e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_03f81e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_03f81e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_03f81e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_03f81e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.glsl
index fdbd2b5..a0b9769 100644
--- a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_03f81e() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_03f81e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_03f81e() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_03f81e() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_03f81e();
+  prevent_dce.inner = textureDimensions_03f81e();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_03f81e() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_03f81e() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_03f81e();
+  prevent_dce.inner = textureDimensions_03f81e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_03f81e() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_03f81e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.msl
index 2a22d32..873686f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_03f81e(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_03f81e(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_03f81e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_03f81e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_03f81e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_03f81e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_03f81e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_03f81e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.spvasm
index 32307c1..4d494e2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_03f81e "textureDimensions_03f81e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_03f81e = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_03f81e = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_03f81e
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_03f81e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_03f81e
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_03f81e
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_03f81e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_03f81e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.wgsl
index 67bc805..cc0a946 100644
--- a/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/03f81e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8snorm, read_write>;
 
-fn textureDimensions_03f81e() {
+fn textureDimensions_03f81e() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_03f81e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_03f81e();
+  prevent_dce = textureDimensions_03f81e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_03f81e();
+  prevent_dce = textureDimensions_03f81e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_03f81e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl
index a229885..2432731 100644
--- a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16float, read>) -> vec2<u32>
-fn textureDimensions_07f1ba() {
+fn textureDimensions_07f1ba() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_07f1ba();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_07f1ba();
+  prevent_dce = textureDimensions_07f1ba();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_07f1ba();
+  prevent_dce = textureDimensions_07f1ba();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_07f1ba();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.dxc.hlsl
index dfd2e4d..b6aa069 100644
--- a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_07f1ba() {
+uint2 textureDimensions_07f1ba() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_07f1ba();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_07f1ba();
+  prevent_dce.Store2(0u, asuint(textureDimensions_07f1ba()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_07f1ba();
+  prevent_dce.Store2(0u, asuint(textureDimensions_07f1ba()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_07f1ba();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.fxc.hlsl
index dfd2e4d..b6aa069 100644
--- a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_07f1ba() {
+uint2 textureDimensions_07f1ba() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_07f1ba();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_07f1ba();
+  prevent_dce.Store2(0u, asuint(textureDimensions_07f1ba()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_07f1ba();
+  prevent_dce.Store2(0u, asuint(textureDimensions_07f1ba()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_07f1ba();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.glsl
index 882e555..aa719e8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_07f1ba() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_07f1ba();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_07f1ba() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_07f1ba() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_07f1ba();
+  prevent_dce.inner = textureDimensions_07f1ba();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_07f1ba() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_07f1ba() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_07f1ba();
+  prevent_dce.inner = textureDimensions_07f1ba();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_07f1ba() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_07f1ba();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.msl
index 58f33c0..acac22d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_07f1ba(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_07f1ba(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_07f1ba(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_07f1ba(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_07f1ba(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_07f1ba(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_07f1ba(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_07f1ba(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.spvasm
index 552a06e..2d41a9a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_07f1ba "textureDimensions_07f1ba"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_07f1ba = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_07f1ba = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_07f1ba
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_07f1ba
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_07f1ba
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_07f1ba
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_07f1ba
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_07f1ba
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.wgsl
index ed1556f..5a6396f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/07f1ba.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16float, read>;
 
-fn textureDimensions_07f1ba() {
+fn textureDimensions_07f1ba() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_07f1ba();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_07f1ba();
+  prevent_dce = textureDimensions_07f1ba();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_07f1ba();
+  prevent_dce = textureDimensions_07f1ba();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_07f1ba();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl
index eee5edf..f71c2d7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8unorm, read>) -> vec2<u32>
-fn textureDimensions_088918() {
+fn textureDimensions_088918() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_088918();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_088918();
+  prevent_dce = textureDimensions_088918();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_088918();
+  prevent_dce = textureDimensions_088918();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_088918();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.dxc.hlsl
index 3e4a80b..652b912 100644
--- a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_088918() {
+uint2 textureDimensions_088918() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_088918();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_088918();
+  prevent_dce.Store2(0u, asuint(textureDimensions_088918()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_088918();
+  prevent_dce.Store2(0u, asuint(textureDimensions_088918()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_088918();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.fxc.hlsl
index 3e4a80b..652b912 100644
--- a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_088918() {
+uint2 textureDimensions_088918() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_088918();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_088918();
+  prevent_dce.Store2(0u, asuint(textureDimensions_088918()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_088918();
+  prevent_dce.Store2(0u, asuint(textureDimensions_088918()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_088918();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.glsl
index 20836f0..3668eb6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_088918() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_088918();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_088918() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_088918() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_088918();
+  prevent_dce.inner = textureDimensions_088918();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_088918() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_088918() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_088918();
+  prevent_dce.inner = textureDimensions_088918();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_088918() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_088918();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.msl
index 67459cc..ce5e302 100644
--- a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_088918(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_088918(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_088918(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_088918(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_088918(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_088918(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_088918(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_088918(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.spvasm
index 5a9bda4..81ccf40 100644
--- a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_088918 "textureDimensions_088918"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_088918 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_088918 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_088918
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_088918
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_088918
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_088918
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_088918
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_088918
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.wgsl
index 06a622a..d998ab3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/088918.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8unorm, read>;
 
-fn textureDimensions_088918() {
+fn textureDimensions_088918() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_088918();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_088918();
+  prevent_dce = textureDimensions_088918();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_088918();
+  prevent_dce = textureDimensions_088918();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_088918();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl
index 6955cb9..95d3f41 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_3d<f32>;
 
 // fn textureDimensions(texture: texture_3d<f32>, level: u32) -> vec3<u32>
-fn textureDimensions_0890c6() {
+fn textureDimensions_0890c6() -> vec3<u32>{
   var arg_1 = 1u;
   var res: vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0890c6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0890c6();
+  prevent_dce = textureDimensions_0890c6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0890c6();
+  prevent_dce = textureDimensions_0890c6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0890c6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.dxc.hlsl
index 93cdf69..28a1e209 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0890c6() {
+uint3 textureDimensions_0890c6() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0890c6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0890c6();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0890c6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0890c6();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0890c6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0890c6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.fxc.hlsl
index 93cdf69..28a1e209 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0890c6() {
+uint3 textureDimensions_0890c6() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0890c6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0890c6();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0890c6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0890c6();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0890c6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0890c6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.glsl
index add8ded..4870995 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.glsl
@@ -1,48 +1,26 @@
 #version 310 es
-
-uniform highp sampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_0890c6() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0890c6();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_0890c6() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_0890c6() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0890c6();
+  prevent_dce.inner = textureDimensions_0890c6();
 }
 
 void main() {
@@ -52,19 +30,24 @@
 #version 310 es
 
 uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_0890c6() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_0890c6() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0890c6();
+  prevent_dce.inner = textureDimensions_0890c6();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -72,3 +55,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_0890c6() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0890c6();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.msl
index f655a1a..8d1db9a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0890c6(texture3d<float, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_0890c6(texture3d<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint3 res = uint3(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1), tint_symbol_1.get_depth(arg_1));
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_0890c6(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_0890c6(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_0890c6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0890c6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0890c6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0890c6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.spvasm
index 9aee0f6..f948546 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_0890c6 "textureDimensions_0890c6"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %30 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_0890c6 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v3uint Function %30
+%textureDimensions_0890c6 = OpFunction %v3uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v3uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v3uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %34 = OpLoad %v3uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v3uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v3uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_0890c6
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_0890c6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v3uint %textureDimensions_0890c6
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %55 = OpFunctionCall %v3uint %textureDimensions_0890c6
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v3uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_0890c6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_0890c6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.wgsl
index 52814c2..a6c9939 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0890c6.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-fn textureDimensions_0890c6() {
+fn textureDimensions_0890c6() -> vec3<u32> {
   var arg_1 = 1u;
   var res : vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0890c6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0890c6();
+  prevent_dce = textureDimensions_0890c6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0890c6();
+  prevent_dce = textureDimensions_0890c6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0890c6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl
index a690e71..2066fe0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32sint, read>) -> vec2<u32>
-fn textureDimensions_08e371() {
+fn textureDimensions_08e371() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_08e371();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_08e371();
+  prevent_dce = textureDimensions_08e371();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_08e371();
+  prevent_dce = textureDimensions_08e371();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_08e371();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.dxc.hlsl
index 8c9d1923..703f0d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_08e371() {
+uint2 textureDimensions_08e371() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_08e371();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_08e371();
+  prevent_dce.Store2(0u, asuint(textureDimensions_08e371()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_08e371();
+  prevent_dce.Store2(0u, asuint(textureDimensions_08e371()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_08e371();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.fxc.hlsl
index 8c9d1923..703f0d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_08e371() {
+uint2 textureDimensions_08e371() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_08e371();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_08e371();
+  prevent_dce.Store2(0u, asuint(textureDimensions_08e371()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_08e371();
+  prevent_dce.Store2(0u, asuint(textureDimensions_08e371()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_08e371();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.msl
index 1dbf58e..34a9b97 100644
--- a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_08e371(texture2d<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_08e371(texture2d<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_08e371(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_08e371(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_08e371(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_08e371(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_08e371(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_08e371(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.spvasm
index ccae3a4..52ff49f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,74 +21,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_08e371 "textureDimensions_08e371"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_08e371 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_08e371 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_08e371
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_08e371
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_08e371
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_08e371
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_08e371
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_08e371
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.wgsl
index 402fc85..82497f4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/08e371.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32sint, read>;
 
-fn textureDimensions_08e371() {
+fn textureDimensions_08e371() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_08e371();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_08e371();
+  prevent_dce = textureDimensions_08e371();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_08e371();
+  prevent_dce = textureDimensions_08e371();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_08e371();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl
index 4a7b581..78e5185 100644
--- a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32uint, write>) -> u32
-fn textureDimensions_09140b() {
+fn textureDimensions_09140b() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_09140b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_09140b();
+  prevent_dce = textureDimensions_09140b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_09140b();
+  prevent_dce = textureDimensions_09140b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_09140b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.dxc.hlsl
index 614aad2..6fdea37 100644
--- a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_09140b() {
+uint textureDimensions_09140b() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_09140b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_09140b();
+  prevent_dce.Store(0u, asuint(textureDimensions_09140b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_09140b();
+  prevent_dce.Store(0u, asuint(textureDimensions_09140b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_09140b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.fxc.hlsl
index 614aad2..6fdea37 100644
--- a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_09140b() {
+uint textureDimensions_09140b() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_09140b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_09140b();
+  prevent_dce.Store(0u, asuint(textureDimensions_09140b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_09140b();
+  prevent_dce.Store(0u, asuint(textureDimensions_09140b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_09140b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.glsl
index d8670d9..8e15e69 100644
--- a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_09140b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_09140b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_09140b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_09140b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_09140b();
+  prevent_dce.inner = textureDimensions_09140b();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_09140b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_09140b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_09140b();
+  prevent_dce.inner = textureDimensions_09140b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_09140b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_09140b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.msl
index 5811c2f..b5a1c78 100644
--- a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_09140b(texture1d<uint, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_09140b(texture1d<uint, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_09140b(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_09140b(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_09140b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_09140b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_09140b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_09140b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.spvasm
index 1db4e59..79b4996 100644
--- a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_09140b "textureDimensions_09140b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_09140b = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_09140b = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_09140b
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_09140b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_09140b
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_09140b
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_09140b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_09140b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.wgsl
index 19513a6..42f4919 100644
--- a/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/09140b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32uint, write>;
 
-fn textureDimensions_09140b() {
+fn textureDimensions_09140b() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_09140b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_09140b();
+  prevent_dce = textureDimensions_09140b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_09140b();
+  prevent_dce = textureDimensions_09140b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_09140b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl
index c04ab51..0b2ded0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16uint, read_write>) -> vec2<u32>
-fn textureDimensions_0973c9() {
+fn textureDimensions_0973c9() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0973c9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0973c9();
+  prevent_dce = textureDimensions_0973c9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0973c9();
+  prevent_dce = textureDimensions_0973c9();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0973c9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.dxc.hlsl
index 5d0b6e5..83d668e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0973c9() {
+uint2 textureDimensions_0973c9() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0973c9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0973c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0973c9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0973c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0973c9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0973c9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.fxc.hlsl
index 5d0b6e5..83d668e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0973c9() {
+uint2 textureDimensions_0973c9() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0973c9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0973c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0973c9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0973c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0973c9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0973c9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.glsl
index 2b1d226..8f45b27 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_0973c9() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0973c9();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_0973c9() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_0973c9() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0973c9();
+  prevent_dce.inner = textureDimensions_0973c9();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_0973c9() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_0973c9() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0973c9();
+  prevent_dce.inner = textureDimensions_0973c9();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_0973c9() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0973c9();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.msl
index 3907589..420e0be 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0973c9(texture2d<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_0973c9(texture2d<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_0973c9(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_0973c9(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_0973c9(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0973c9(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0973c9(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0973c9(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.spvasm
index 7417b2d..a363b39 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_0973c9 "textureDimensions_0973c9"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0973c9 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_0973c9 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_0973c9
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_0973c9
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_0973c9
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_0973c9
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_0973c9
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_0973c9
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.wgsl
index 4a3ee65..4c30e2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0973c9.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16uint, read_write>;
 
-fn textureDimensions_0973c9() {
+fn textureDimensions_0973c9() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0973c9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0973c9();
+  prevent_dce = textureDimensions_0973c9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0973c9();
+  prevent_dce = textureDimensions_0973c9();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0973c9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl
index 4109db3..e032f58 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32float, write>) -> vec2<u32>
-fn textureDimensions_0baa0d() {
+fn textureDimensions_0baa0d() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0baa0d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0baa0d();
+  prevent_dce = textureDimensions_0baa0d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0baa0d();
+  prevent_dce = textureDimensions_0baa0d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0baa0d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.dxc.hlsl
index 41e827d..a8b3209 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0baa0d() {
+uint2 textureDimensions_0baa0d() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0baa0d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0baa0d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0baa0d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0baa0d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0baa0d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0baa0d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.fxc.hlsl
index 41e827d..a8b3209 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0baa0d() {
+uint2 textureDimensions_0baa0d() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0baa0d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0baa0d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0baa0d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0baa0d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0baa0d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0baa0d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.glsl
index 7b201ae..089b7ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_0baa0d() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0baa0d();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_0baa0d() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_0baa0d() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0baa0d();
+  prevent_dce.inner = textureDimensions_0baa0d();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_0baa0d() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_0baa0d() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0baa0d();
+  prevent_dce.inner = textureDimensions_0baa0d();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_0baa0d() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0baa0d();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.msl
index 165cb68..31ace63 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0baa0d(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_0baa0d(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_0baa0d(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_0baa0d(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_0baa0d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0baa0d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0baa0d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0baa0d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.spvasm
index 2dee716..4598beb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_0baa0d "textureDimensions_0baa0d"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0baa0d = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_0baa0d = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_0baa0d
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_0baa0d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_0baa0d
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_0baa0d
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_0baa0d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_0baa0d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.wgsl
index 35d4e6e..fd39459 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0baa0d.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32float, write>;
 
-fn textureDimensions_0baa0d() {
+fn textureDimensions_0baa0d() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0baa0d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0baa0d();
+  prevent_dce = textureDimensions_0baa0d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0baa0d();
+  prevent_dce = textureDimensions_0baa0d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0baa0d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl
index 74930be..ce541f3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16float, write>) -> u32
-fn textureDimensions_0c0b0c() {
+fn textureDimensions_0c0b0c() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0c0b0c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce = textureDimensions_0c0b0c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce = textureDimensions_0c0b0c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0c0b0c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.dxc.hlsl
index a3a30ed..e050ec6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0c0b0c() {
+uint textureDimensions_0c0b0c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0c0b0c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce.Store(0u, asuint(textureDimensions_0c0b0c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce.Store(0u, asuint(textureDimensions_0c0b0c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0c0b0c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.fxc.hlsl
index a3a30ed..e050ec6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0c0b0c() {
+uint textureDimensions_0c0b0c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0c0b0c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce.Store(0u, asuint(textureDimensions_0c0b0c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce.Store(0u, asuint(textureDimensions_0c0b0c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0c0b0c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.glsl
index 0fbe840..cb90f2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_0c0b0c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0c0b0c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_0c0b0c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_0c0b0c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce.inner = textureDimensions_0c0b0c();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_0c0b0c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_0c0b0c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce.inner = textureDimensions_0c0b0c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_0c0b0c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0c0b0c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.msl
index 51203b8..ee2a558 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0c0b0c(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_0c0b0c(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_0c0b0c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_0c0b0c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_0c0b0c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0c0b0c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0c0b0c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0c0b0c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.spvasm
index 2a0cc16..30f4862 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_0c0b0c "textureDimensions_0c0b0c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0c0b0c = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_0c0b0c = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_0c0b0c
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_0c0b0c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_0c0b0c
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_0c0b0c
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_0c0b0c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_0c0b0c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.wgsl
index 2849ca8..2d464fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0c0b0c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16float, write>;
 
-fn textureDimensions_0c0b0c() {
+fn textureDimensions_0c0b0c() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0c0b0c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce = textureDimensions_0c0b0c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0c0b0c();
+  prevent_dce = textureDimensions_0c0b0c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0c0b0c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl
index 5d3f90a..d8a37bf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32uint, read>) -> vec2<u32>
-fn textureDimensions_0d4a7c() {
+fn textureDimensions_0d4a7c() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0d4a7c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce = textureDimensions_0d4a7c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce = textureDimensions_0d4a7c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0d4a7c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.dxc.hlsl
index 0c4b1e1..2731228 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0d4a7c() {
+uint2 textureDimensions_0d4a7c() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0d4a7c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0d4a7c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0d4a7c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0d4a7c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.fxc.hlsl
index 0c4b1e1..2731228 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0d4a7c() {
+uint2 textureDimensions_0d4a7c() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0d4a7c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0d4a7c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0d4a7c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0d4a7c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.glsl
index 28badc4..d835f56 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_0d4a7c() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0d4a7c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_0d4a7c() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_0d4a7c() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce.inner = textureDimensions_0d4a7c();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_0d4a7c() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_0d4a7c() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce.inner = textureDimensions_0d4a7c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_0d4a7c() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0d4a7c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.msl
index c19f060..424a739 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0d4a7c(texture2d<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_0d4a7c(texture2d<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_0d4a7c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_0d4a7c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_0d4a7c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0d4a7c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0d4a7c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0d4a7c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.spvasm
index 58f200c..d92dcbe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_0d4a7c "textureDimensions_0d4a7c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0d4a7c = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_0d4a7c = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_0d4a7c
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_0d4a7c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_0d4a7c
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_0d4a7c
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_0d4a7c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_0d4a7c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.wgsl
index a6ca5b0..3356f21 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0d4a7c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32uint, read>;
 
-fn textureDimensions_0d4a7c() {
+fn textureDimensions_0d4a7c() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0d4a7c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce = textureDimensions_0d4a7c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0d4a7c();
+  prevent_dce = textureDimensions_0d4a7c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0d4a7c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl
index 42ffc99..84f1f0a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8unorm, read_write>) -> vec3<u32>
-fn textureDimensions_0de70c() {
+fn textureDimensions_0de70c() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0de70c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0de70c();
+  prevent_dce = textureDimensions_0de70c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0de70c();
+  prevent_dce = textureDimensions_0de70c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0de70c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.dxc.hlsl
index b4ab1a7..4f17617 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0de70c() {
+uint3 textureDimensions_0de70c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0de70c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0de70c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0de70c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0de70c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0de70c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0de70c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.fxc.hlsl
index b4ab1a7..4f17617 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0de70c() {
+uint3 textureDimensions_0de70c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0de70c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0de70c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0de70c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0de70c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_0de70c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0de70c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.glsl
index d572036..400252c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_0de70c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_0de70c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_0de70c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_0de70c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_0de70c();
+  prevent_dce.inner = textureDimensions_0de70c();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_0de70c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_0de70c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_0de70c();
+  prevent_dce.inner = textureDimensions_0de70c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_0de70c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_0de70c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.msl
index 146536e..cf42ff93 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0de70c(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_0de70c(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_0de70c(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_0de70c(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_0de70c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0de70c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0de70c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0de70c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.spvasm
index b3f7811..bf0f402 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_0de70c "textureDimensions_0de70c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0de70c = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_0de70c = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_0de70c
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_0de70c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_0de70c
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_0de70c
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_0de70c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_0de70c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.wgsl
index 2192c30..38177ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0de70c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8unorm, read_write>;
 
-fn textureDimensions_0de70c() {
+fn textureDimensions_0de70c() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0de70c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0de70c();
+  prevent_dce = textureDimensions_0de70c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0de70c();
+  prevent_dce = textureDimensions_0de70c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0de70c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl
index 97b8acb..ba65bb8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<u32>
-fn textureDimensions_0ff9a4() {
+fn textureDimensions_0ff9a4() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0ff9a4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce = textureDimensions_0ff9a4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce = textureDimensions_0ff9a4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0ff9a4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.dxc.hlsl
index c285a4b..5b339c1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0ff9a4() {
+uint2 textureDimensions_0ff9a4() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0ff9a4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0ff9a4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0ff9a4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0ff9a4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.fxc.hlsl
index c285a4b..5b339c1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_0ff9a4() {
+uint2 textureDimensions_0ff9a4() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_0ff9a4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0ff9a4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_0ff9a4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_0ff9a4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.msl
index 5f57612..bf8f831 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_0ff9a4(depthcube_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_0ff9a4(depthcube_array<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depthcube_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_0ff9a4(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depthcube_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_0ff9a4(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depthcube_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_0ff9a4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depthcube_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_0ff9a4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depthcube_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depthcube_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depthcube_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_0ff9a4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depthcube_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_0ff9a4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.spvasm
index 535ebcd..93e1620 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,81 +22,108 @@
                OpName %textureDimensions_0ff9a4 "textureDimensions_0ff9a4"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_0ff9a4 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_0ff9a4 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_0ff9a4
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_0ff9a4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_0ff9a4
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_0ff9a4
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_0ff9a4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_0ff9a4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.wgsl
index b2098ae..7c4485e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/0ff9a4.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-fn textureDimensions_0ff9a4() {
+fn textureDimensions_0ff9a4() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0ff9a4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce = textureDimensions_0ff9a4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_0ff9a4();
+  prevent_dce = textureDimensions_0ff9a4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_0ff9a4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl
index 08a8932..8c6f1dab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32float, read>) -> vec2<u32>
-fn textureDimensions_135176() {
+fn textureDimensions_135176() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_135176();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_135176();
+  prevent_dce = textureDimensions_135176();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_135176();
+  prevent_dce = textureDimensions_135176();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_135176();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.dxc.hlsl
index 8151f67..52ab676 100644
--- a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_135176() {
+uint2 textureDimensions_135176() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_135176();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_135176();
+  prevent_dce.Store2(0u, asuint(textureDimensions_135176()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_135176();
+  prevent_dce.Store2(0u, asuint(textureDimensions_135176()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_135176();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.fxc.hlsl
index 8151f67..52ab676 100644
--- a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_135176() {
+uint2 textureDimensions_135176() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_135176();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_135176();
+  prevent_dce.Store2(0u, asuint(textureDimensions_135176()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_135176();
+  prevent_dce.Store2(0u, asuint(textureDimensions_135176()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_135176();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.glsl
index da300a7..9a0c5dc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp readonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_135176() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_135176();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_135176() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_135176() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_135176();
+  prevent_dce.inner = textureDimensions_135176();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_135176() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_135176() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_135176();
+  prevent_dce.inner = textureDimensions_135176();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_135176() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_135176();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.msl
index e138e38..39a23de 100644
--- a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_135176(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_135176(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_135176(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_135176(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_135176(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_135176(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_135176(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_135176(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.spvasm
index 6502d22..76ae818 100644
--- a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_135176 "textureDimensions_135176"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_135176 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_135176 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_135176
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_135176
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_135176
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_135176
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_135176
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_135176
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.wgsl
index ef6e8bc..32edd3d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/135176.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32float, read>;
 
-fn textureDimensions_135176() {
+fn textureDimensions_135176() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_135176();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_135176();
+  prevent_dce = textureDimensions_135176();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_135176();
+  prevent_dce = textureDimensions_135176();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_135176();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl
index 354ad1c..e86ca22 100644
--- a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d<f32>;
 
 // fn textureDimensions(texture: texture_2d<f32>, level: u32) -> vec2<u32>
-fn textureDimensions_13f8db() {
+fn textureDimensions_13f8db() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_13f8db();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_13f8db();
+  prevent_dce = textureDimensions_13f8db();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_13f8db();
+  prevent_dce = textureDimensions_13f8db();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_13f8db();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.dxc.hlsl
index 1f589e0..a096bce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_13f8db() {
+uint2 textureDimensions_13f8db() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_13f8db();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_13f8db();
+  prevent_dce.Store2(0u, asuint(textureDimensions_13f8db()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_13f8db();
+  prevent_dce.Store2(0u, asuint(textureDimensions_13f8db()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_13f8db();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.fxc.hlsl
index 1f589e0..a096bce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_13f8db() {
+uint2 textureDimensions_13f8db() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_13f8db();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_13f8db();
+  prevent_dce.Store2(0u, asuint(textureDimensions_13f8db()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_13f8db();
+  prevent_dce.Store2(0u, asuint(textureDimensions_13f8db()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_13f8db();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.glsl
index d440cf9..7f99b4e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_13f8db() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_13f8db();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_13f8db() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_13f8db() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_13f8db();
+  prevent_dce.inner = textureDimensions_13f8db();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_13f8db() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_13f8db() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_13f8db();
+  prevent_dce.inner = textureDimensions_13f8db();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_13f8db() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_13f8db();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.msl
index 730c597..75cd057 100644
--- a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_13f8db(texture2d<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_13f8db(texture2d<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_13f8db(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_13f8db(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_13f8db(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_13f8db(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_13f8db(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_13f8db(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.spvasm
index f0d0db8..2418480 100644
--- a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_13f8db "textureDimensions_13f8db"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %30 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_13f8db = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %30
+%textureDimensions_13f8db = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v2uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %34 = OpLoad %v2uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v2uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v2uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_13f8db
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_13f8db
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v2uint %textureDimensions_13f8db
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_13f8db
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_13f8db
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_13f8db
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.wgsl
index 44663ef..72a34f5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/13f8db.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-fn textureDimensions_13f8db() {
+fn textureDimensions_13f8db() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_13f8db();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_13f8db();
+  prevent_dce = textureDimensions_13f8db();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_13f8db();
+  prevent_dce = textureDimensions_13f8db();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_13f8db();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl
index 0fb6c64..e6c5842 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16sint, write>) -> vec2<u32>
-fn textureDimensions_1417dd() {
+fn textureDimensions_1417dd() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1417dd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1417dd();
+  prevent_dce = textureDimensions_1417dd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1417dd();
+  prevent_dce = textureDimensions_1417dd();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1417dd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.dxc.hlsl
index a5152f2..ab8eb1b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1417dd() {
+uint2 textureDimensions_1417dd() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1417dd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1417dd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1417dd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1417dd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1417dd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1417dd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.fxc.hlsl
index a5152f2..ab8eb1b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1417dd() {
+uint2 textureDimensions_1417dd() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1417dd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1417dd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1417dd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1417dd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1417dd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1417dd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.glsl
index 3d7782d..8add6b7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_1417dd() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_1417dd();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_1417dd() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_1417dd() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_1417dd();
+  prevent_dce.inner = textureDimensions_1417dd();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_1417dd() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_1417dd() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_1417dd();
+  prevent_dce.inner = textureDimensions_1417dd();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_1417dd() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_1417dd();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.msl
index 8300973..2ab5da6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_1417dd(texture2d<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_1417dd(texture2d<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_1417dd(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_1417dd(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_1417dd(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_1417dd(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_1417dd(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_1417dd(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.spvasm
index f7a2035..43924f6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_1417dd "textureDimensions_1417dd"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_1417dd = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_1417dd = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_1417dd
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_1417dd
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_1417dd
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_1417dd
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_1417dd
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_1417dd
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.wgsl
index d4cc637..d928894 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1417dd.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16sint, write>;
 
-fn textureDimensions_1417dd() {
+fn textureDimensions_1417dd() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1417dd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1417dd();
+  prevent_dce = textureDimensions_1417dd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1417dd();
+  prevent_dce = textureDimensions_1417dd();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1417dd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl
index 0a3b3ed..05f0cda 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32sint, write>) -> vec3<u32>
-fn textureDimensions_15aa17() {
+fn textureDimensions_15aa17() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_15aa17();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_15aa17();
+  prevent_dce = textureDimensions_15aa17();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_15aa17();
+  prevent_dce = textureDimensions_15aa17();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_15aa17();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.dxc.hlsl
index 75f401b..12b2b97 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_15aa17() {
+uint3 textureDimensions_15aa17() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_15aa17();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_15aa17();
+  prevent_dce.Store3(0u, asuint(textureDimensions_15aa17()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_15aa17();
+  prevent_dce.Store3(0u, asuint(textureDimensions_15aa17()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_15aa17();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.fxc.hlsl
index 75f401b..12b2b97 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_15aa17() {
+uint3 textureDimensions_15aa17() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_15aa17();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_15aa17();
+  prevent_dce.Store3(0u, asuint(textureDimensions_15aa17()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_15aa17();
+  prevent_dce.Store3(0u, asuint(textureDimensions_15aa17()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_15aa17();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.glsl
index 53f090b..e656722 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_15aa17() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_15aa17();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_15aa17() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_15aa17() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_15aa17();
+  prevent_dce.inner = textureDimensions_15aa17();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_15aa17() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_15aa17() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_15aa17();
+  prevent_dce.inner = textureDimensions_15aa17();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_15aa17() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_15aa17();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.msl
index 48288f6..2216002 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_15aa17(texture3d<int, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_15aa17(texture3d<int, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_15aa17(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_15aa17(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_15aa17(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_15aa17(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_15aa17(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_15aa17(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.spvasm
index 94c7bd8..619a299 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_15aa17 "textureDimensions_15aa17"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_15aa17 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_15aa17 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_15aa17
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_15aa17
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_15aa17
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_15aa17
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_15aa17
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_15aa17
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.wgsl
index 151d25a..e521c6e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15aa17.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32sint, write>;
 
-fn textureDimensions_15aa17() {
+fn textureDimensions_15aa17() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_15aa17();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_15aa17();
+  prevent_dce = textureDimensions_15aa17();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_15aa17();
+  prevent_dce = textureDimensions_15aa17();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_15aa17();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl
index 0b14d87..6376428 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d<u32>;
 
 // fn textureDimensions(texture: texture_2d<u32>, level: i32) -> vec2<u32>
-fn textureDimensions_15b577() {
+fn textureDimensions_15b577() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_15b577();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_15b577();
+  prevent_dce = textureDimensions_15b577();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_15b577();
+  prevent_dce = textureDimensions_15b577();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_15b577();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.dxc.hlsl
index 1c0e6ea..1996367 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_15b577() {
+uint2 textureDimensions_15b577() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_15b577();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_15b577();
+  prevent_dce.Store2(0u, asuint(textureDimensions_15b577()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_15b577();
+  prevent_dce.Store2(0u, asuint(textureDimensions_15b577()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_15b577();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.fxc.hlsl
index 1c0e6ea..1996367 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_15b577() {
+uint2 textureDimensions_15b577() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_15b577();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_15b577();
+  prevent_dce.Store2(0u, asuint(textureDimensions_15b577()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_15b577();
+  prevent_dce.Store2(0u, asuint(textureDimensions_15b577()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_15b577();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.glsl
index e36acb9..84766f4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_15b577() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_15b577();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_15b577() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_15b577() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_15b577();
+  prevent_dce.inner = textureDimensions_15b577();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_15b577() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_15b577() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_15b577();
+  prevent_dce.inner = textureDimensions_15b577();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_15b577() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_15b577();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.msl
index 4fbfe78..f4952ca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_15b577(texture2d<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_15b577(texture2d<uint, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_15b577(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_15b577(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_15b577(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_15b577(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_15b577(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_15b577(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.spvasm
index dfcfd7d..cd85257 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_15b577 "textureDimensions_15b577"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_15b577 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_15b577 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_15b577
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_15b577
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_15b577
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_15b577
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_15b577
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_15b577
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.wgsl
index c0263e4..3e30c07 100644
--- a/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/15b577.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d<u32>;
 
-fn textureDimensions_15b577() {
+fn textureDimensions_15b577() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_15b577();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_15b577();
+  prevent_dce = textureDimensions_15b577();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_15b577();
+  prevent_dce = textureDimensions_15b577();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_15b577();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl
index 5ca7020..38aa6d5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r8unorm, read_write>) -> vec2<u32>
-fn textureDimensions_18160d() {
+fn textureDimensions_18160d() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_18160d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_18160d();
+  prevent_dce = textureDimensions_18160d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_18160d();
+  prevent_dce = textureDimensions_18160d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_18160d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.dxc.hlsl
index 8d7086b..0a9df44 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_18160d() {
+uint2 textureDimensions_18160d() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_18160d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_18160d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18160d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_18160d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18160d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_18160d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.fxc.hlsl
index 8d7086b..0a9df44 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_18160d() {
+uint2 textureDimensions_18160d() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_18160d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_18160d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18160d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_18160d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18160d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_18160d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.msl
index 642939b..71df7a4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_18160d(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_18160d(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_18160d(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_18160d(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_18160d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_18160d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_18160d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_18160d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.spvasm
index 4039245..536ebfd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_18160d "textureDimensions_18160d"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_18160d = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_18160d = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_18160d
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_18160d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_18160d
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_18160d
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_18160d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_18160d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.wgsl
index fe96e98..7596745 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18160d.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r8unorm, read_write>;
 
-fn textureDimensions_18160d() {
+fn textureDimensions_18160d() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_18160d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_18160d();
+  prevent_dce = textureDimensions_18160d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_18160d();
+  prevent_dce = textureDimensions_18160d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_18160d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl
index 7f97102..813f3c9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r8unorm, write>) -> vec2<u32>
-fn textureDimensions_18f19f() {
+fn textureDimensions_18f19f() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_18f19f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_18f19f();
+  prevent_dce = textureDimensions_18f19f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_18f19f();
+  prevent_dce = textureDimensions_18f19f();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_18f19f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.dxc.hlsl
index 52a6582..e7f8023 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_18f19f() {
+uint2 textureDimensions_18f19f() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_18f19f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_18f19f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18f19f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_18f19f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18f19f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_18f19f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.fxc.hlsl
index 52a6582..e7f8023 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_18f19f() {
+uint2 textureDimensions_18f19f() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_18f19f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_18f19f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18f19f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_18f19f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_18f19f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_18f19f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.msl
index f3d2074..d0eee6b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_18f19f(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_18f19f(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_18f19f(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_18f19f(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_18f19f(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_18f19f(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_18f19f(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_18f19f(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.spvasm
index a58c448..a127b9b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_18f19f "textureDimensions_18f19f"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_18f19f = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_18f19f = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_18f19f
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_18f19f
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_18f19f
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_18f19f
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_18f19f
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_18f19f
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.wgsl
index 7762b88..2b185cc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/18f19f.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r8unorm, write>;
 
-fn textureDimensions_18f19f() {
+fn textureDimensions_18f19f() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_18f19f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_18f19f();
+  prevent_dce = textureDimensions_18f19f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_18f19f();
+  prevent_dce = textureDimensions_18f19f();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_18f19f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl
index f3631f9..013e658 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_3d<i32>;
 
 // fn textureDimensions(texture: texture_3d<i32>) -> vec3<u32>
-fn textureDimensions_1a2be7() {
+fn textureDimensions_1a2be7() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1a2be7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1a2be7();
+  prevent_dce = textureDimensions_1a2be7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1a2be7();
+  prevent_dce = textureDimensions_1a2be7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1a2be7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.dxc.hlsl
index f62c699..6f36e09 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1a2be7() {
+uint3 textureDimensions_1a2be7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1a2be7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1a2be7();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1a2be7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1a2be7();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1a2be7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1a2be7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.fxc.hlsl
index f62c699..6f36e09 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1a2be7() {
+uint3 textureDimensions_1a2be7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1a2be7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1a2be7();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1a2be7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1a2be7();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1a2be7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1a2be7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.glsl
index c1761c6..61107b4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_1a2be7() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_1a2be7();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_1a2be7() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_1a2be7() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_1a2be7();
+  prevent_dce.inner = textureDimensions_1a2be7();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_1a2be7() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_1a2be7() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_1a2be7();
+  prevent_dce.inner = textureDimensions_1a2be7();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_1a2be7() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_1a2be7();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.msl
index 15b42d5..8f83ba2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_1a2be7(texture3d<int, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_1a2be7(texture3d<int, access::sample> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_1a2be7(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_1a2be7(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_1a2be7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_1a2be7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_1a2be7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_1a2be7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.spvasm
index a973947..8cdeb42 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_1a2be7 "textureDimensions_1a2be7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
       %int_0 = OpConstant %int 0
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %27 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_1a2be7 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %27
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v3uint %23 %int_0
-               OpStore %res %22
-         %30 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %31 = OpLoad %v3uint %res
-               OpStore %30 %31
+%textureDimensions_1a2be7 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v3uint %25 %int_0
+               OpStore %res %24
+         %29 = OpLoad %v3uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v3uint %textureDimensions_1a2be7
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_1a2be7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v3uint %textureDimensions_1a2be7
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %53 = OpFunctionCall %v3uint %textureDimensions_1a2be7
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v3uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_1a2be7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_1a2be7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.wgsl
index 0121d1e..67664ad 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1a2be7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_3d<i32>;
 
-fn textureDimensions_1a2be7() {
+fn textureDimensions_1a2be7() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1a2be7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1a2be7();
+  prevent_dce = textureDimensions_1a2be7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1a2be7();
+  prevent_dce = textureDimensions_1a2be7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1a2be7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl
index b924d66..354d822 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16sint, read>) -> vec3<u32>
-fn textureDimensions_1b720f() {
+fn textureDimensions_1b720f() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1b720f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1b720f();
+  prevent_dce = textureDimensions_1b720f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1b720f();
+  prevent_dce = textureDimensions_1b720f();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1b720f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.dxc.hlsl
index fc46a8e..917df17 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1b720f() {
+uint3 textureDimensions_1b720f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1b720f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1b720f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1b720f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1b720f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1b720f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1b720f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.fxc.hlsl
index fc46a8e..917df17 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1b720f() {
+uint3 textureDimensions_1b720f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1b720f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1b720f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1b720f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1b720f();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1b720f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1b720f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.glsl
index 21433d4..440ac56 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16i) uniform highp readonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_1b720f() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_1b720f();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_1b720f() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_1b720f() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_1b720f();
+  prevent_dce.inner = textureDimensions_1b720f();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_1b720f() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_1b720f() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_1b720f();
+  prevent_dce.inner = textureDimensions_1b720f();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_1b720f() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_1b720f();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.msl
index 21ce3ca..430ad64 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_1b720f(texture3d<int, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_1b720f(texture3d<int, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_1b720f(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_1b720f(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_1b720f(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_1b720f(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_1b720f(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_1b720f(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.spvasm
index dd73469..042a20f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_1b720f "textureDimensions_1b720f"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_1b720f = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_1b720f = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_1b720f
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_1b720f
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_1b720f
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_1b720f
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_1b720f
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_1b720f
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.wgsl
index ad08efa..fbf9dca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1b720f.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16sint, read>;
 
-fn textureDimensions_1b720f() {
+fn textureDimensions_1b720f() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1b720f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1b720f();
+  prevent_dce = textureDimensions_1b720f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1b720f();
+  prevent_dce = textureDimensions_1b720f();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1b720f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl
index a523185..4fe882c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_3d<f32>;
 
 // fn textureDimensions(texture: texture_3d<f32>, level: i32) -> vec3<u32>
-fn textureDimensions_1bc428() {
+fn textureDimensions_1bc428() -> vec3<u32>{
   var arg_1 = 1i;
   var res: vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1bc428();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1bc428();
+  prevent_dce = textureDimensions_1bc428();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1bc428();
+  prevent_dce = textureDimensions_1bc428();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1bc428();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.dxc.hlsl
index faaf292..ea2f71c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1bc428() {
+uint3 textureDimensions_1bc428() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1bc428();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1bc428();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1bc428()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1bc428();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1bc428()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1bc428();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.fxc.hlsl
index faaf292..ea2f71c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1bc428() {
+uint3 textureDimensions_1bc428() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1bc428();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1bc428();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1bc428()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1bc428();
+  prevent_dce.Store3(0u, asuint(textureDimensions_1bc428()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1bc428();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.glsl
index 9e4c72f..9cdd54b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.glsl
@@ -1,48 +1,26 @@
 #version 310 es
-
-uniform highp sampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_1bc428() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_1bc428();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_1bc428() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_1bc428() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_1bc428();
+  prevent_dce.inner = textureDimensions_1bc428();
 }
 
 void main() {
@@ -52,19 +30,24 @@
 #version 310 es
 
 uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_1bc428() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_1bc428() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_1bc428();
+  prevent_dce.inner = textureDimensions_1bc428();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -72,3 +55,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_1bc428() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_1bc428();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.msl
index 3fd33c1..01a275e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_1bc428(texture3d<float, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_1bc428(texture3d<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint3 res = uint3(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1), tint_symbol_1.get_depth(arg_1));
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_1bc428(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_1bc428(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_1bc428(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_1bc428(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_1bc428(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_1bc428(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.spvasm
index a0866ed..1a140bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_1bc428 "textureDimensions_1bc428"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %31 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_1bc428 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v3uint Function %31
+%textureDimensions_1bc428 = OpFunction %v3uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v3uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %35 = OpLoad %v3uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v3uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v3uint %textureDimensions_1bc428
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_1bc428
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v3uint %textureDimensions_1bc428
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %57 = OpFunctionCall %v3uint %textureDimensions_1bc428
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v3uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_1bc428
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_1bc428
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.wgsl
index ed27abb..fb71abe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bc428.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-fn textureDimensions_1bc428() {
+fn textureDimensions_1bc428() -> vec3<u32> {
   var arg_1 = 1i;
   var res : vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1bc428();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1bc428();
+  prevent_dce = textureDimensions_1bc428();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1bc428();
+  prevent_dce = textureDimensions_1bc428();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1bc428();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl
index 428b25a..317cce5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d<f32>;
 
 // fn textureDimensions(texture: texture_2d<f32>, level: i32) -> vec2<u32>
-fn textureDimensions_1bd78c() {
+fn textureDimensions_1bd78c() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1bd78c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1bd78c();
+  prevent_dce = textureDimensions_1bd78c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1bd78c();
+  prevent_dce = textureDimensions_1bd78c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1bd78c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.dxc.hlsl
index c01ef34..2a7c536 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1bd78c() {
+uint2 textureDimensions_1bd78c() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1bd78c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1bd78c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1bd78c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1bd78c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1bd78c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1bd78c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.fxc.hlsl
index c01ef34..2a7c536 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1bd78c() {
+uint2 textureDimensions_1bd78c() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1bd78c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1bd78c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1bd78c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1bd78c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1bd78c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1bd78c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.glsl
index eb9b22e..2f41856 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_1bd78c() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_1bd78c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_1bd78c() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_1bd78c() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_1bd78c();
+  prevent_dce.inner = textureDimensions_1bd78c();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_1bd78c() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_1bd78c() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_1bd78c();
+  prevent_dce.inner = textureDimensions_1bd78c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_1bd78c() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_1bd78c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.msl
index fac9be9..523d6e0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_1bd78c(texture2d<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_1bd78c(texture2d<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_1bd78c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_1bd78c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_1bd78c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_1bd78c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_1bd78c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_1bd78c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.spvasm
index 51953b5..28e1c92 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_1bd78c "textureDimensions_1bd78c"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_1bd78c = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_1bd78c = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_1bd78c
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_1bd78c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_1bd78c
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_1bd78c
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_1bd78c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_1bd78c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.wgsl
index 4379939..53dcd1c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1bd78c.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-fn textureDimensions_1bd78c() {
+fn textureDimensions_1bd78c() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1bd78c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1bd78c();
+  prevent_dce = textureDimensions_1bd78c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1bd78c();
+  prevent_dce = textureDimensions_1bd78c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1bd78c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl
index e2af4d8..e20c58e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32float, read_write>) -> vec2<u32>
-fn textureDimensions_1e4024() {
+fn textureDimensions_1e4024() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1e4024();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1e4024();
+  prevent_dce = textureDimensions_1e4024();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1e4024();
+  prevent_dce = textureDimensions_1e4024();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1e4024();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.dxc.hlsl
index 73a5527..6a0932b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1e4024() {
+uint2 textureDimensions_1e4024() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1e4024();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1e4024();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1e4024()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1e4024();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1e4024()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1e4024();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.fxc.hlsl
index 73a5527..6a0932b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_1e4024() {
+uint2 textureDimensions_1e4024() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_1e4024();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_1e4024();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1e4024()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_1e4024();
+  prevent_dce.Store2(0u, asuint(textureDimensions_1e4024()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_1e4024();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.glsl
index 75eb648..1b2ba21 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_1e4024() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_1e4024();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp image2D arg_0;
+uvec2 textureDimensions_1e4024() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_1e4024() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_1e4024();
+  prevent_dce.inner = textureDimensions_1e4024();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp image2D arg_0;
+uvec2 textureDimensions_1e4024() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_1e4024() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_1e4024();
+  prevent_dce.inner = textureDimensions_1e4024();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32f) uniform highp image2D arg_0;
+uvec2 textureDimensions_1e4024() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_1e4024();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.msl
index c40b743..9728d43 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_1e4024(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_1e4024(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_1e4024(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_1e4024(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_1e4024(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_1e4024(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_1e4024(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_1e4024(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.spvasm
index 04c7a12..575e50b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_1e4024 "textureDimensions_1e4024"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_1e4024 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_1e4024 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_1e4024
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_1e4024
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_1e4024
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_1e4024
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_1e4024
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_1e4024
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.wgsl
index 04db7eb..adbbeb7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/1e4024.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32float, read_write>;
 
-fn textureDimensions_1e4024() {
+fn textureDimensions_1e4024() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1e4024();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_1e4024();
+  prevent_dce = textureDimensions_1e4024();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_1e4024();
+  prevent_dce = textureDimensions_1e4024();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_1e4024();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl
index 117fa41..441701f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16sint, read_write>) -> vec3<u32>
-fn textureDimensions_20eaad() {
+fn textureDimensions_20eaad() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_20eaad();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_20eaad();
+  prevent_dce = textureDimensions_20eaad();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_20eaad();
+  prevent_dce = textureDimensions_20eaad();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_20eaad();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.dxc.hlsl
index dccd0c8..fa5d0b5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_20eaad() {
+uint3 textureDimensions_20eaad() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_20eaad();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_20eaad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_20eaad()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_20eaad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_20eaad()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_20eaad();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.fxc.hlsl
index dccd0c8..fa5d0b5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_20eaad() {
+uint3 textureDimensions_20eaad() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_20eaad();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_20eaad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_20eaad()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_20eaad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_20eaad()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_20eaad();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.glsl
index 3fd6ab3..ca1be41 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_20eaad() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_20eaad();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_20eaad() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_20eaad() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_20eaad();
+  prevent_dce.inner = textureDimensions_20eaad();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_20eaad() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_20eaad() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_20eaad();
+  prevent_dce.inner = textureDimensions_20eaad();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_20eaad() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_20eaad();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.msl
index e030a03..23adb36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_20eaad(texture3d<int, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_20eaad(texture3d<int, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_20eaad(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_20eaad(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_20eaad(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_20eaad(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_20eaad(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_20eaad(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.spvasm
index c9e3ee7..e4c859d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_20eaad "textureDimensions_20eaad"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_20eaad = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_20eaad = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_20eaad
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_20eaad
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_20eaad
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_20eaad
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_20eaad
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_20eaad
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.wgsl
index c10d720..93ba5d4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20eaad.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16sint, read_write>;
 
-fn textureDimensions_20eaad() {
+fn textureDimensions_20eaad() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_20eaad();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_20eaad();
+  prevent_dce = textureDimensions_20eaad();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_20eaad();
+  prevent_dce = textureDimensions_20eaad();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_20eaad();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl
index 423c07b..3c53f56 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32float, read_write>) -> u32
-fn textureDimensions_20ecef() {
+fn textureDimensions_20ecef() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_20ecef();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_20ecef();
+  prevent_dce = textureDimensions_20ecef();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_20ecef();
+  prevent_dce = textureDimensions_20ecef();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_20ecef();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.dxc.hlsl
index 723ad29..31ab61ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_20ecef() {
+uint textureDimensions_20ecef() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_20ecef();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_20ecef();
+  prevent_dce.Store(0u, asuint(textureDimensions_20ecef()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_20ecef();
+  prevent_dce.Store(0u, asuint(textureDimensions_20ecef()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_20ecef();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.fxc.hlsl
index 723ad29..31ab61ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_20ecef() {
+uint textureDimensions_20ecef() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_20ecef();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_20ecef();
+  prevent_dce.Store(0u, asuint(textureDimensions_20ecef()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_20ecef();
+  prevent_dce.Store(0u, asuint(textureDimensions_20ecef()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_20ecef();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.glsl
index 331a3db..defb923 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_20ecef() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_20ecef();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp image2D arg_0;
+uint textureDimensions_20ecef() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_20ecef() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_20ecef();
+  prevent_dce.inner = textureDimensions_20ecef();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp image2D arg_0;
+uint textureDimensions_20ecef() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_20ecef() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_20ecef();
+  prevent_dce.inner = textureDimensions_20ecef();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32f) uniform highp image2D arg_0;
+uint textureDimensions_20ecef() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_20ecef();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.msl
index d332752..1b39faf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_20ecef(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_20ecef(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_20ecef(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_20ecef(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_20ecef(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_20ecef(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_20ecef(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_20ecef(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.spvasm
index 3be0e2d..aa54204f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_20ecef "textureDimensions_20ecef"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 R32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_20ecef = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_20ecef = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_20ecef
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_20ecef
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_20ecef
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_20ecef
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_20ecef
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_20ecef
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.wgsl
index 10234b6..0ec695a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/20ecef.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32float, read_write>;
 
-fn textureDimensions_20ecef() {
+fn textureDimensions_20ecef() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_20ecef();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_20ecef();
+  prevent_dce = textureDimensions_20ecef();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_20ecef();
+  prevent_dce = textureDimensions_20ecef();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_20ecef();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl
index 23f0233..79664f4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32float, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32float, read>) -> u32
-fn textureDimensions_212362() {
+fn textureDimensions_212362() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_212362();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_212362();
+  prevent_dce = textureDimensions_212362();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_212362();
+  prevent_dce = textureDimensions_212362();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_212362();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.dxc.hlsl
index 3e996b8..cdb9781 100644
--- a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_212362() {
+uint textureDimensions_212362() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_212362();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_212362();
+  prevent_dce.Store(0u, asuint(textureDimensions_212362()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_212362();
+  prevent_dce.Store(0u, asuint(textureDimensions_212362()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_212362();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.fxc.hlsl
index 3e996b8..cdb9781 100644
--- a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_212362() {
+uint textureDimensions_212362() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_212362();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_212362();
+  prevent_dce.Store(0u, asuint(textureDimensions_212362()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_212362();
+  prevent_dce.Store(0u, asuint(textureDimensions_212362()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_212362();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.glsl
index e6e6cb7..22e4949 100644
--- a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_212362() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_212362();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp readonly image2D arg_0;
+uint textureDimensions_212362() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_212362() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_212362();
+  prevent_dce.inner = textureDimensions_212362();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp readonly image2D arg_0;
+uint textureDimensions_212362() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_212362() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_212362();
+  prevent_dce.inner = textureDimensions_212362();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32f) uniform highp readonly image2D arg_0;
+uint textureDimensions_212362() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_212362();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.msl
index 90fe7bd..3b8b46f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_212362(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_212362(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_212362(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_212362(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_212362(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_212362(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_212362(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_212362(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.spvasm
index 8e7f0ac..e3cf4ec 100644
--- a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_212362 "textureDimensions_212362"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 R32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_212362 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_212362 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_212362
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_212362
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_212362
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_212362
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_212362
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_212362
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.wgsl
index a7e4b9f..a2490f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/212362.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32float, read>;
 
-fn textureDimensions_212362() {
+fn textureDimensions_212362() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_212362();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_212362();
+  prevent_dce = textureDimensions_212362();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_212362();
+  prevent_dce = textureDimensions_212362();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_212362();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl
index f268d2f..037079a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8unorm, write>) -> vec2<u32>
-fn textureDimensions_224113() {
+fn textureDimensions_224113() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_224113();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_224113();
+  prevent_dce = textureDimensions_224113();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_224113();
+  prevent_dce = textureDimensions_224113();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_224113();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.dxc.hlsl
index db35a75..a05aa54 100644
--- a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_224113() {
+uint2 textureDimensions_224113() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_224113();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_224113();
+  prevent_dce.Store2(0u, asuint(textureDimensions_224113()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_224113();
+  prevent_dce.Store2(0u, asuint(textureDimensions_224113()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_224113();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.fxc.hlsl
index db35a75..a05aa54 100644
--- a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_224113() {
+uint2 textureDimensions_224113() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_224113();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_224113();
+  prevent_dce.Store2(0u, asuint(textureDimensions_224113()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_224113();
+  prevent_dce.Store2(0u, asuint(textureDimensions_224113()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_224113();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.glsl
index 75882f0..9c589a0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_224113() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_224113();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_224113() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_224113() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_224113();
+  prevent_dce.inner = textureDimensions_224113();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_224113() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_224113() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_224113();
+  prevent_dce.inner = textureDimensions_224113();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_224113() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_224113();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.msl
index 494fc83..a04f564 100644
--- a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_224113(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_224113(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_224113(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_224113(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_224113(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_224113(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_224113(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_224113(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.spvasm
index abe175b..1a50806 100644
--- a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_224113 "textureDimensions_224113"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_224113 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_224113 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_224113
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_224113
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_224113
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_224113
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_224113
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_224113
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.wgsl
index a9ae5c4..9cb616d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/224113.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8unorm, write>;
 
-fn textureDimensions_224113() {
+fn textureDimensions_224113() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_224113();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_224113();
+  prevent_dce = textureDimensions_224113();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_224113();
+  prevent_dce = textureDimensions_224113();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_224113();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl
index e416f9a..e5786a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<u32>;
 
 // fn textureDimensions(texture: texture_cube_array<u32>, level: i32) -> vec2<u32>
-fn textureDimensions_22b5b6() {
+fn textureDimensions_22b5b6() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_22b5b6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_22b5b6();
+  prevent_dce = textureDimensions_22b5b6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_22b5b6();
+  prevent_dce = textureDimensions_22b5b6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_22b5b6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.dxc.hlsl
index 2de571c..cc0491f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_22b5b6() {
+uint2 textureDimensions_22b5b6() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_22b5b6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_22b5b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_22b5b6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_22b5b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_22b5b6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_22b5b6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.fxc.hlsl
index 2de571c..cc0491f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_22b5b6() {
+uint2 textureDimensions_22b5b6() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_22b5b6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_22b5b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_22b5b6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_22b5b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_22b5b6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_22b5b6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.msl
index af33532..9850018 100644
--- a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_22b5b6(texturecube_array<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_22b5b6(texturecube_array<uint, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_22b5b6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_22b5b6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_22b5b6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_22b5b6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_22b5b6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_22b5b6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.spvasm
index 964f061..6fa21ef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,81 +22,108 @@
                OpName %textureDimensions_22b5b6 "textureDimensions_22b5b6"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_22b5b6 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_22b5b6 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_22b5b6
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_22b5b6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_22b5b6
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_22b5b6
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_22b5b6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_22b5b6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.wgsl
index 30b9dd5..a9af9ca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/22b5b6.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<u32>;
 
-fn textureDimensions_22b5b6() {
+fn textureDimensions_22b5b6() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_22b5b6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_22b5b6();
+  prevent_dce = textureDimensions_22b5b6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_22b5b6();
+  prevent_dce = textureDimensions_22b5b6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_22b5b6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl
index 883c94d..969474c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_2d<f32>;
 
 // fn textureDimensions(texture: texture_2d<f32>) -> vec2<u32>
-fn textureDimensions_24db07() {
+fn textureDimensions_24db07() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_24db07();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_24db07();
+  prevent_dce = textureDimensions_24db07();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_24db07();
+  prevent_dce = textureDimensions_24db07();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_24db07();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.dxc.hlsl
index e9e7021..78831a5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_24db07() {
+uint2 textureDimensions_24db07() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_24db07();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_24db07();
+  prevent_dce.Store2(0u, asuint(textureDimensions_24db07()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_24db07();
+  prevent_dce.Store2(0u, asuint(textureDimensions_24db07()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_24db07();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.fxc.hlsl
index e9e7021..78831a5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_24db07() {
+uint2 textureDimensions_24db07() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_24db07();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_24db07();
+  prevent_dce.Store2(0u, asuint(textureDimensions_24db07()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_24db07();
+  prevent_dce.Store2(0u, asuint(textureDimensions_24db07()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_24db07();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.glsl
index 312491f..ded9ae2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_24db07() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_24db07();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_24db07() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_24db07() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_24db07();
+  prevent_dce.inner = textureDimensions_24db07();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_24db07() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_24db07() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_24db07();
+  prevent_dce.inner = textureDimensions_24db07();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_24db07() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_24db07();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.msl
index 7e2ded5..271c08f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_24db07(texture2d<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_24db07(texture2d<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_24db07(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_24db07(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_24db07(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_24db07(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_24db07(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_24db07(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.spvasm
index 163ff10..718bfa1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_24db07 "textureDimensions_24db07"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_24db07 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v2uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_24db07 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v2uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_24db07
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_24db07
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_24db07
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_24db07
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_24db07
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_24db07
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.wgsl
index 9e72532..8407ee7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/24db07.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-fn textureDimensions_24db07() {
+fn textureDimensions_24db07() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_24db07();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_24db07();
+  prevent_dce = textureDimensions_24db07();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_24db07();
+  prevent_dce = textureDimensions_24db07();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_24db07();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl
index 41f985a..7cb5fca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r8unorm, write>) -> vec2<u32>
-fn textureDimensions_25d284() {
+fn textureDimensions_25d284() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_25d284();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_25d284();
+  prevent_dce = textureDimensions_25d284();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_25d284();
+  prevent_dce = textureDimensions_25d284();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_25d284();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.dxc.hlsl
index 2df33a6..954b7a3d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_25d284() {
+uint2 textureDimensions_25d284() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_25d284();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_25d284();
+  prevent_dce.Store2(0u, asuint(textureDimensions_25d284()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_25d284();
+  prevent_dce.Store2(0u, asuint(textureDimensions_25d284()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_25d284();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.fxc.hlsl
index 2df33a6..954b7a3d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_25d284() {
+uint2 textureDimensions_25d284() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_25d284();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_25d284();
+  prevent_dce.Store2(0u, asuint(textureDimensions_25d284()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_25d284();
+  prevent_dce.Store2(0u, asuint(textureDimensions_25d284()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_25d284();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.msl
index 0cc7abc..bf55f6b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_25d284(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_25d284(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_25d284(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_25d284(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_25d284(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_25d284(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_25d284(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_25d284(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.spvasm
index d7124af..7a73f44 100644
--- a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,75 +21,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_25d284 "textureDimensions_25d284"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_25d284 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_25d284 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_25d284
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_25d284
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_25d284
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_25d284
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_25d284
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_25d284
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.wgsl
index 1c8be5f..d2a1b6d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/25d284.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r8unorm, write>;
 
-fn textureDimensions_25d284() {
+fn textureDimensions_25d284() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_25d284();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_25d284();
+  prevent_dce = textureDimensions_25d284();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_25d284();
+  prevent_dce = textureDimensions_25d284();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_25d284();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl
index efa2f61..157bccb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32uint, write>) -> vec2<u32>
-fn textureDimensions_2674d8() {
+fn textureDimensions_2674d8() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2674d8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2674d8();
+  prevent_dce = textureDimensions_2674d8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2674d8();
+  prevent_dce = textureDimensions_2674d8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2674d8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.dxc.hlsl
index db1134f..9daf4d5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2674d8() {
+uint2 textureDimensions_2674d8() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2674d8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2674d8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2674d8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2674d8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2674d8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2674d8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.fxc.hlsl
index db1134f..9daf4d5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2674d8() {
+uint2 textureDimensions_2674d8() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2674d8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2674d8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2674d8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2674d8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2674d8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2674d8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.msl
index 18ce3d7..b36fe51 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_2674d8(texture2d_array<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_2674d8(texture2d_array<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_2674d8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_2674d8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_2674d8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_2674d8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_2674d8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_2674d8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.spvasm
index 1cb5bed..b87d206 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,75 +21,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_2674d8 "textureDimensions_2674d8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_2674d8 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_2674d8 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_2674d8
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_2674d8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_2674d8
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_2674d8
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_2674d8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_2674d8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.wgsl
index 01373b9..05f137c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2674d8.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32uint, write>;
 
-fn textureDimensions_2674d8() {
+fn textureDimensions_2674d8() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2674d8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2674d8();
+  prevent_dce = textureDimensions_2674d8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2674d8();
+  prevent_dce = textureDimensions_2674d8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2674d8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl
index 8be3edf..6112dea 100644
--- a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32uint, read>) -> vec3<u32>
-fn textureDimensions_268ddb() {
+fn textureDimensions_268ddb() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_268ddb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_268ddb();
+  prevent_dce = textureDimensions_268ddb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_268ddb();
+  prevent_dce = textureDimensions_268ddb();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_268ddb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.dxc.hlsl
index 91d953b..fa006c0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_268ddb() {
+uint3 textureDimensions_268ddb() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_268ddb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_268ddb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_268ddb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_268ddb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_268ddb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_268ddb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.fxc.hlsl
index 91d953b..fa006c0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_268ddb() {
+uint3 textureDimensions_268ddb() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_268ddb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_268ddb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_268ddb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_268ddb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_268ddb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_268ddb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.glsl
index 5aa0605..47f3658 100644
--- a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp readonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_268ddb() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_268ddb();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_268ddb() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_268ddb() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_268ddb();
+  prevent_dce.inner = textureDimensions_268ddb();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_268ddb() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_268ddb() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_268ddb();
+  prevent_dce.inner = textureDimensions_268ddb();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_268ddb() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_268ddb();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.msl
index a392720..d99b9f9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_268ddb(texture3d<uint, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_268ddb(texture3d<uint, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_268ddb(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_268ddb(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_268ddb(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_268ddb(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_268ddb(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_268ddb(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.spvasm
index f2c58b6..1d902ee 100644
--- a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_268ddb "textureDimensions_268ddb"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_268ddb = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_268ddb = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_268ddb
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_268ddb
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_268ddb
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_268ddb
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_268ddb
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_268ddb
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.wgsl
index cf6d5a5..17b6461 100644
--- a/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/268ddb.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32uint, read>;
 
-fn textureDimensions_268ddb() {
+fn textureDimensions_268ddb() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_268ddb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_268ddb();
+  prevent_dce = textureDimensions_268ddb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_268ddb();
+  prevent_dce = textureDimensions_268ddb();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_268ddb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl
index e04f178..a1a0981 100644
--- a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_1d<f32>;
 
 // fn textureDimensions(texture: texture_1d<f32>) -> u32
-fn textureDimensions_26d6bf() {
+fn textureDimensions_26d6bf() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_26d6bf();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_26d6bf();
+  prevent_dce = textureDimensions_26d6bf();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_26d6bf();
+  prevent_dce = textureDimensions_26d6bf();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_26d6bf();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.dxc.hlsl
index 015dcfb..d48a53a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_26d6bf() {
+uint textureDimensions_26d6bf() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_26d6bf();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_26d6bf();
+  prevent_dce.Store(0u, asuint(textureDimensions_26d6bf()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_26d6bf();
+  prevent_dce.Store(0u, asuint(textureDimensions_26d6bf()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_26d6bf();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.fxc.hlsl
index 015dcfb..d48a53a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_26d6bf() {
+uint textureDimensions_26d6bf() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_26d6bf();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_26d6bf();
+  prevent_dce.Store(0u, asuint(textureDimensions_26d6bf()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_26d6bf();
+  prevent_dce.Store(0u, asuint(textureDimensions_26d6bf()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_26d6bf();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.glsl
index e66a583..91b8c22 100644
--- a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_26d6bf() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_26d6bf();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uint textureDimensions_26d6bf() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_26d6bf() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_26d6bf();
+  prevent_dce.inner = textureDimensions_26d6bf();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uint textureDimensions_26d6bf() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_26d6bf() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_26d6bf();
+  prevent_dce.inner = textureDimensions_26d6bf();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uint textureDimensions_26d6bf() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_26d6bf();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.msl
index e77f8e6..459dc64 100644
--- a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_26d6bf(texture1d<float, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_26d6bf(texture1d<float, access::sample> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_26d6bf(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_26d6bf(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_26d6bf(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_26d6bf(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_26d6bf(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_26d6bf(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.spvasm
index a6909e8..012cb47 100644
--- a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_26d6bf "textureDimensions_26d6bf"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %26 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_26d6bf = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %26
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySizeLod %uint %21 %int_0
-               OpStore %res %20
-         %29 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %30 = OpLoad %uint %res
-               OpStore %29 %30
+%textureDimensions_26d6bf = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySizeLod %uint %23 %int_0
+               OpStore %res %22
+         %28 = OpLoad %uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %uint %textureDimensions_26d6bf
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_26d6bf
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %uint %textureDimensions_26d6bf
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %52 = OpFunctionCall %uint %textureDimensions_26d6bf
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_26d6bf
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_26d6bf
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.wgsl
index 7711feb..4ae7859 100644
--- a/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/26d6bf.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
-fn textureDimensions_26d6bf() {
+fn textureDimensions_26d6bf() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_26d6bf();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_26d6bf();
+  prevent_dce = textureDimensions_26d6bf();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_26d6bf();
+  prevent_dce = textureDimensions_26d6bf();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_26d6bf();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl
index 9ef2e86..996e688 100644
--- a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r8unorm, read_write>) -> vec3<u32>
-fn textureDimensions_282978() {
+fn textureDimensions_282978() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_282978();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_282978();
+  prevent_dce = textureDimensions_282978();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_282978();
+  prevent_dce = textureDimensions_282978();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_282978();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.dxc.hlsl
index f664a39..84e64eb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_282978() {
+uint3 textureDimensions_282978() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_282978();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_282978();
+  prevent_dce.Store3(0u, asuint(textureDimensions_282978()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_282978();
+  prevent_dce.Store3(0u, asuint(textureDimensions_282978()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_282978();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.fxc.hlsl
index f664a39..84e64eb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_282978() {
+uint3 textureDimensions_282978() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_282978();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_282978();
+  prevent_dce.Store3(0u, asuint(textureDimensions_282978()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_282978();
+  prevent_dce.Store3(0u, asuint(textureDimensions_282978()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_282978();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.msl
index 3a2f5b8..a615175 100644
--- a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_282978(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_282978(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_282978(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_282978(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_282978(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_282978(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_282978(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_282978(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.spvasm
index 58c52c3..a8f745d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_282978 "textureDimensions_282978"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_282978 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_282978 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_282978
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_282978
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_282978
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_282978
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_282978
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_282978
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.wgsl
index 54b0c61..50f400e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/282978.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r8unorm, read_write>;
 
-fn textureDimensions_282978() {
+fn textureDimensions_282978() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_282978();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_282978();
+  prevent_dce = textureDimensions_282978();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_282978();
+  prevent_dce = textureDimensions_282978();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_282978();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl
index 637908a..3202895 100644
--- a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32float, read_write>) -> u32
-fn textureDimensions_283b58() {
+fn textureDimensions_283b58() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_283b58();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_283b58();
+  prevent_dce = textureDimensions_283b58();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_283b58();
+  prevent_dce = textureDimensions_283b58();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_283b58();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.dxc.hlsl
index e2fd40d..ce27940 100644
--- a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_283b58() {
+uint textureDimensions_283b58() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_283b58();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_283b58();
+  prevent_dce.Store(0u, asuint(textureDimensions_283b58()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_283b58();
+  prevent_dce.Store(0u, asuint(textureDimensions_283b58()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_283b58();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.fxc.hlsl
index e2fd40d..ce27940 100644
--- a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_283b58() {
+uint textureDimensions_283b58() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_283b58();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_283b58();
+  prevent_dce.Store(0u, asuint(textureDimensions_283b58()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_283b58();
+  prevent_dce.Store(0u, asuint(textureDimensions_283b58()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_283b58();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.glsl
index 9cd264e..4f7eb25 100644
--- a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_283b58() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_283b58();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_283b58() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_283b58() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_283b58();
+  prevent_dce.inner = textureDimensions_283b58();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_283b58() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_283b58() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_283b58();
+  prevent_dce.inner = textureDimensions_283b58();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_283b58() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_283b58();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.msl
index c33d80c..6fb6c82 100644
--- a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_283b58(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_283b58(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_283b58(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_283b58(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_283b58(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_283b58(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_283b58(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_283b58(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.spvasm
index f5a793b..15cfe30 100644
--- a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_283b58 "textureDimensions_283b58"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_283b58 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_283b58 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_283b58
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_283b58
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_283b58
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_283b58
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_283b58
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_283b58
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.wgsl
index bbb3a12..f06a83a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/283b58.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32float, read_write>;
 
-fn textureDimensions_283b58() {
+fn textureDimensions_283b58() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_283b58();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_283b58();
+  prevent_dce = textureDimensions_283b58();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_283b58();
+  prevent_dce = textureDimensions_283b58();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_283b58();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl
index 4714f67..3fcd9ed 100644
--- a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32float, read>) -> u32
-fn textureDimensions_284c27() {
+fn textureDimensions_284c27() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_284c27();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_284c27();
+  prevent_dce = textureDimensions_284c27();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_284c27();
+  prevent_dce = textureDimensions_284c27();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_284c27();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.dxc.hlsl
index 0ba48f3..31e71b3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_284c27() {
+uint textureDimensions_284c27() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_284c27();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_284c27();
+  prevent_dce.Store(0u, asuint(textureDimensions_284c27()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_284c27();
+  prevent_dce.Store(0u, asuint(textureDimensions_284c27()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_284c27();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.fxc.hlsl
index 0ba48f3..31e71b3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_284c27() {
+uint textureDimensions_284c27() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_284c27();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_284c27();
+  prevent_dce.Store(0u, asuint(textureDimensions_284c27()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_284c27();
+  prevent_dce.Store(0u, asuint(textureDimensions_284c27()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_284c27();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.msl
index 8b419a4..d837500 100644
--- a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_284c27(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_284c27(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_284c27(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_284c27(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_284c27(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_284c27(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_284c27(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_284c27(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.spvasm
index 256e8a4..57622f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,72 +22,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_284c27 "textureDimensions_284c27"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_284c27 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_284c27 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_284c27
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_284c27
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_284c27
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_284c27
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_284c27
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_284c27
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.wgsl
index 9ff4796..d4b5edb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/284c27.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32float, read>;
 
-fn textureDimensions_284c27() {
+fn textureDimensions_284c27() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_284c27();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_284c27();
+  prevent_dce = textureDimensions_284c27();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_284c27();
+  prevent_dce = textureDimensions_284c27();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_284c27();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl
index a49f1d0..29dc5d0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16sint, read_write>) -> vec2<u32>
-fn textureDimensions_2a58b7() {
+fn textureDimensions_2a58b7() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2a58b7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2a58b7();
+  prevent_dce = textureDimensions_2a58b7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2a58b7();
+  prevent_dce = textureDimensions_2a58b7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2a58b7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.dxc.hlsl
index 3ac97d2..b49bb21 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2a58b7() {
+uint2 textureDimensions_2a58b7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2a58b7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2a58b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2a58b7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2a58b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2a58b7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2a58b7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.fxc.hlsl
index 3ac97d2..b49bb21 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2a58b7() {
+uint2 textureDimensions_2a58b7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2a58b7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2a58b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2a58b7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2a58b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2a58b7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2a58b7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.glsl
index 477d0a0..0f86d67 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_2a58b7() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_2a58b7();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_2a58b7() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_2a58b7() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_2a58b7();
+  prevent_dce.inner = textureDimensions_2a58b7();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_2a58b7() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_2a58b7() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_2a58b7();
+  prevent_dce.inner = textureDimensions_2a58b7();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_2a58b7() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_2a58b7();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.msl
index 462c29e..3f4f520 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_2a58b7(texture2d_array<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_2a58b7(texture2d_array<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_2a58b7(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_2a58b7(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_2a58b7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_2a58b7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_2a58b7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_2a58b7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.spvasm
index 540d811..60d7087 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_2a58b7 "textureDimensions_2a58b7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_2a58b7 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_2a58b7 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_2a58b7
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_2a58b7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_2a58b7
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_2a58b7
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_2a58b7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_2a58b7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.wgsl
index 977747b..2fd5e75 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2a58b7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16sint, read_write>;
 
-fn textureDimensions_2a58b7() {
+fn textureDimensions_2a58b7() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2a58b7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2a58b7();
+  prevent_dce = textureDimensions_2a58b7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2a58b7();
+  prevent_dce = textureDimensions_2a58b7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2a58b7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl
index 898e488b..d88bea3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<bgra8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<bgra8unorm, read>) -> u32
-fn textureDimensions_2bafdf() {
+fn textureDimensions_2bafdf() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2bafdf();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2bafdf();
+  prevent_dce = textureDimensions_2bafdf();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2bafdf();
+  prevent_dce = textureDimensions_2bafdf();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2bafdf();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.dxc.hlsl
index 9bcdd38..eda2b73 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2bafdf() {
+uint textureDimensions_2bafdf() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2bafdf();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2bafdf();
+  prevent_dce.Store(0u, asuint(textureDimensions_2bafdf()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2bafdf();
+  prevent_dce.Store(0u, asuint(textureDimensions_2bafdf()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2bafdf();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.fxc.hlsl
index 9bcdd38..eda2b73 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2bafdf() {
+uint textureDimensions_2bafdf() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2bafdf();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2bafdf();
+  prevent_dce.Store(0u, asuint(textureDimensions_2bafdf()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2bafdf();
+  prevent_dce.Store(0u, asuint(textureDimensions_2bafdf()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2bafdf();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.glsl
index 3a797b2..de5fe89 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_2bafdf() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_2bafdf();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uint textureDimensions_2bafdf() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_2bafdf() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_2bafdf();
+  prevent_dce.inner = textureDimensions_2bafdf();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uint textureDimensions_2bafdf() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_2bafdf() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_2bafdf();
+  prevent_dce.inner = textureDimensions_2bafdf();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8) uniform highp readonly image2D arg_0;
+uint textureDimensions_2bafdf() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_2bafdf();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.msl
index 077ce35..057c229 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_2bafdf(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_2bafdf(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_2bafdf(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_2bafdf(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_2bafdf(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_2bafdf(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_2bafdf(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_2bafdf(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.spvasm
index 2ca0471..11028ca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_2bafdf "textureDimensions_2bafdf"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_2bafdf = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_2bafdf = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_2bafdf
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_2bafdf
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_2bafdf
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_2bafdf
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_2bafdf
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_2bafdf
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.wgsl
index 859e1bb..4054603 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2bafdf.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<bgra8unorm, read>;
 
-fn textureDimensions_2bafdf() {
+fn textureDimensions_2bafdf() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2bafdf();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2bafdf();
+  prevent_dce = textureDimensions_2bafdf();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2bafdf();
+  prevent_dce = textureDimensions_2bafdf();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2bafdf();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl
index ba66b1c..67d6a5e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8uint, read>) -> u32
-fn textureDimensions_2dc5c5() {
+fn textureDimensions_2dc5c5() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2dc5c5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce = textureDimensions_2dc5c5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce = textureDimensions_2dc5c5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2dc5c5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.dxc.hlsl
index 8850d148..18f3768 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2dc5c5() {
+uint textureDimensions_2dc5c5() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2dc5c5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce.Store(0u, asuint(textureDimensions_2dc5c5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce.Store(0u, asuint(textureDimensions_2dc5c5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2dc5c5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.fxc.hlsl
index 8850d148..18f3768 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2dc5c5() {
+uint textureDimensions_2dc5c5() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2dc5c5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce.Store(0u, asuint(textureDimensions_2dc5c5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce.Store(0u, asuint(textureDimensions_2dc5c5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2dc5c5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.glsl
index c15d342..5ddc117 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_2dc5c5() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_2dc5c5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_2dc5c5() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_2dc5c5() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce.inner = textureDimensions_2dc5c5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_2dc5c5() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_2dc5c5() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce.inner = textureDimensions_2dc5c5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_2dc5c5() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_2dc5c5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.msl
index cc64179..fc8a566 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_2dc5c5(texture1d<uint, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_2dc5c5(texture1d<uint, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_2dc5c5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_2dc5c5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_2dc5c5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_2dc5c5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_2dc5c5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_2dc5c5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.spvasm
index e741b4a..a49cca6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_2dc5c5 "textureDimensions_2dc5c5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_2dc5c5 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_2dc5c5 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_2dc5c5
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_2dc5c5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_2dc5c5
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_2dc5c5
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_2dc5c5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_2dc5c5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.wgsl
index 55916da..d652a63 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2dc5c5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8uint, read>;
 
-fn textureDimensions_2dc5c5() {
+fn textureDimensions_2dc5c5() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2dc5c5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce = textureDimensions_2dc5c5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2dc5c5();
+  prevent_dce = textureDimensions_2dc5c5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2dc5c5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl
index 9d97276..d8c444f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d<i32>;
 
 // fn textureDimensions(texture: texture_2d<i32>, level: i32) -> vec2<u32>
-fn textureDimensions_2e443d() {
+fn textureDimensions_2e443d() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2e443d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2e443d();
+  prevent_dce = textureDimensions_2e443d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2e443d();
+  prevent_dce = textureDimensions_2e443d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2e443d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.dxc.hlsl
index 579ff62..2efa093 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2e443d() {
+uint2 textureDimensions_2e443d() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2e443d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2e443d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2e443d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2e443d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2e443d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2e443d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.fxc.hlsl
index 579ff62..2efa093 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2e443d() {
+uint2 textureDimensions_2e443d() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2e443d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2e443d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2e443d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2e443d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2e443d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2e443d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.glsl
index 606ade4..a564de9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_2e443d() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_2e443d();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_2e443d() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_2e443d() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_2e443d();
+  prevent_dce.inner = textureDimensions_2e443d();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_2e443d() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_2e443d() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_2e443d();
+  prevent_dce.inner = textureDimensions_2e443d();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_2e443d() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_2e443d();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.msl
index 9c5e562..1403e69 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_2e443d(texture2d<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_2e443d(texture2d<int, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_2e443d(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_2e443d(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_2e443d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_2e443d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_2e443d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_2e443d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.spvasm
index c0566e5..0a8a51b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_2e443d "textureDimensions_2e443d"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_2e443d = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_2e443d = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_2e443d
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_2e443d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_2e443d
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_2e443d
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_2e443d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_2e443d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.wgsl
index a714fb7..e200a68 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2e443d.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d<i32>;
 
-fn textureDimensions_2e443d() {
+fn textureDimensions_2e443d() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2e443d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2e443d();
+  prevent_dce = textureDimensions_2e443d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2e443d();
+  prevent_dce = textureDimensions_2e443d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2e443d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl
index 6c934e5..94273d4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureDimensions(texture: texture_2d_array<f32>, level: i32) -> vec2<u32>
-fn textureDimensions_2fd2a4() {
+fn textureDimensions_2fd2a4() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2fd2a4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce = textureDimensions_2fd2a4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce = textureDimensions_2fd2a4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2fd2a4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.dxc.hlsl
index 4752e5f..4c9fdc4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2fd2a4() {
+uint2 textureDimensions_2fd2a4() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2fd2a4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2fd2a4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2fd2a4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2fd2a4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.fxc.hlsl
index 4752e5f..4c9fdc4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2fd2a4() {
+uint2 textureDimensions_2fd2a4() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2fd2a4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2fd2a4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_2fd2a4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2fd2a4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.glsl
index 0867453..8751208 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_2fd2a4() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_2fd2a4();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_2fd2a4() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_2fd2a4() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce.inner = textureDimensions_2fd2a4();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_2fd2a4() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_2fd2a4() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce.inner = textureDimensions_2fd2a4();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_2fd2a4() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_2fd2a4();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.msl
index 7b39587..82ada0d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_2fd2a4(texture2d_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_2fd2a4(texture2d_array<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_2fd2a4(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_2fd2a4(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_2fd2a4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_2fd2a4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_2fd2a4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_2fd2a4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.spvasm
index 1357b3d..64dbe5e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,81 +21,108 @@
                OpName %textureDimensions_2fd2a4 "textureDimensions_2fd2a4"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_2fd2a4 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_2fd2a4 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_2fd2a4
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_2fd2a4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_2fd2a4
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_2fd2a4
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_2fd2a4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_2fd2a4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.wgsl
index dcb3f65..6f9adbe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2fd2a4.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-fn textureDimensions_2fd2a4() {
+fn textureDimensions_2fd2a4() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2fd2a4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce = textureDimensions_2fd2a4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2fd2a4();
+  prevent_dce = textureDimensions_2fd2a4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2fd2a4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl
index 2a7d139..0335ceb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32float, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32float, read>) -> vec3<u32>
-fn textureDimensions_2ff32a() {
+fn textureDimensions_2ff32a() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2ff32a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2ff32a();
+  prevent_dce = textureDimensions_2ff32a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2ff32a();
+  prevent_dce = textureDimensions_2ff32a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2ff32a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.dxc.hlsl
index ace401e..7db40a9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2ff32a() {
+uint3 textureDimensions_2ff32a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2ff32a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2ff32a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_2ff32a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2ff32a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_2ff32a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2ff32a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.fxc.hlsl
index ace401e..7db40a9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_2ff32a() {
+uint3 textureDimensions_2ff32a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_2ff32a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_2ff32a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_2ff32a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_2ff32a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_2ff32a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_2ff32a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.glsl
index cc9f945..48728a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32f) uniform highp readonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_2ff32a() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_2ff32a();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_2ff32a() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_2ff32a() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_2ff32a();
+  prevent_dce.inner = textureDimensions_2ff32a();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_2ff32a() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_2ff32a() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_2ff32a();
+  prevent_dce.inner = textureDimensions_2ff32a();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_2ff32a() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_2ff32a();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.msl
index d99da69..23ae933 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_2ff32a(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_2ff32a(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_2ff32a(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_2ff32a(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_2ff32a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_2ff32a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_2ff32a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_2ff32a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.spvasm
index b4c1596..79dab7e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_2ff32a "textureDimensions_2ff32a"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_2ff32a = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_2ff32a = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_2ff32a
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_2ff32a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_2ff32a
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_2ff32a
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_2ff32a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_2ff32a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.wgsl
index fb2778e..61a3c82 100644
--- a/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/2ff32a.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32float, read>;
 
-fn textureDimensions_2ff32a() {
+fn textureDimensions_2ff32a() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2ff32a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_2ff32a();
+  prevent_dce = textureDimensions_2ff32a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_2ff32a();
+  prevent_dce = textureDimensions_2ff32a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_2ff32a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl
index 6c445fb..6b12772 100644
--- a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32uint, read>) -> vec2<u32>
-fn textureDimensions_305dd5() {
+fn textureDimensions_305dd5() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_305dd5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_305dd5();
+  prevent_dce = textureDimensions_305dd5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_305dd5();
+  prevent_dce = textureDimensions_305dd5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_305dd5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.dxc.hlsl
index 7301ab9..b1d14e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_305dd5() {
+uint2 textureDimensions_305dd5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_305dd5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_305dd5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_305dd5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_305dd5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_305dd5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_305dd5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.fxc.hlsl
index 7301ab9..b1d14e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_305dd5() {
+uint2 textureDimensions_305dd5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_305dd5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_305dd5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_305dd5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_305dd5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_305dd5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_305dd5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.glsl
index d56a8b3..0b3afa1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp readonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_305dd5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_305dd5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_305dd5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_305dd5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_305dd5();
+  prevent_dce.inner = textureDimensions_305dd5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_305dd5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_305dd5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_305dd5();
+  prevent_dce.inner = textureDimensions_305dd5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_305dd5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_305dd5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.msl
index 067fca1..10aaad7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_305dd5(texture2d_array<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_305dd5(texture2d_array<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_305dd5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_305dd5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_305dd5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_305dd5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_305dd5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_305dd5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.spvasm
index e95ac29..3d36098 100644
--- a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_305dd5 "textureDimensions_305dd5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_305dd5 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_305dd5 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_305dd5
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_305dd5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_305dd5
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_305dd5
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_305dd5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_305dd5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.wgsl
index 2a9aebf..b9c6491 100644
--- a/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/305dd5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32uint, read>;
 
-fn textureDimensions_305dd5() {
+fn textureDimensions_305dd5() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_305dd5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_305dd5();
+  prevent_dce = textureDimensions_305dd5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_305dd5();
+  prevent_dce = textureDimensions_305dd5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_305dd5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl
index 78f5bcb..c24bb4b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32uint, write>) -> vec3<u32>
-fn textureDimensions_31799c() {
+fn textureDimensions_31799c() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_31799c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_31799c();
+  prevent_dce = textureDimensions_31799c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_31799c();
+  prevent_dce = textureDimensions_31799c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_31799c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.dxc.hlsl
index a1563cd..da27bd4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_31799c() {
+uint3 textureDimensions_31799c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_31799c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_31799c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31799c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_31799c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31799c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_31799c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.fxc.hlsl
index a1563cd..da27bd4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_31799c() {
+uint3 textureDimensions_31799c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_31799c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_31799c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31799c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_31799c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31799c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_31799c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.glsl
index 4329040..ef359b4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32ui) uniform highp writeonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_31799c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_31799c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_31799c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_31799c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_31799c();
+  prevent_dce.inner = textureDimensions_31799c();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_31799c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_31799c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_31799c();
+  prevent_dce.inner = textureDimensions_31799c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_31799c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_31799c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.msl
index 25b88c9..b80c1b3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_31799c(texture3d<uint, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_31799c(texture3d<uint, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_31799c(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_31799c(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_31799c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_31799c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_31799c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_31799c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.spvasm
index 186b288..b89985f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_31799c "textureDimensions_31799c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_31799c = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_31799c = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_31799c
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_31799c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_31799c
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_31799c
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_31799c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_31799c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.wgsl
index 5c8505b..6708be9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31799c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32uint, write>;
 
-fn textureDimensions_31799c() {
+fn textureDimensions_31799c() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_31799c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_31799c();
+  prevent_dce = textureDimensions_31799c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_31799c();
+  prevent_dce = textureDimensions_31799c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_31799c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl
index 77ccb65..ea9cf9e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32uint, read_write>) -> vec3<u32>
-fn textureDimensions_31d00d() {
+fn textureDimensions_31d00d() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_31d00d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_31d00d();
+  prevent_dce = textureDimensions_31d00d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_31d00d();
+  prevent_dce = textureDimensions_31d00d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_31d00d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.dxc.hlsl
index a9fef03..e2ad60e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_31d00d() {
+uint3 textureDimensions_31d00d() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_31d00d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_31d00d();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31d00d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_31d00d();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31d00d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_31d00d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.fxc.hlsl
index a9fef03..e2ad60e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_31d00d() {
+uint3 textureDimensions_31d00d() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_31d00d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_31d00d();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31d00d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_31d00d();
+  prevent_dce.Store3(0u, asuint(textureDimensions_31d00d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_31d00d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.glsl
index 47fddb2..3e1dc1b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32ui) uniform highp uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_31d00d() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_31d00d();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp uimage3D arg_0;
+uvec3 textureDimensions_31d00d() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_31d00d() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_31d00d();
+  prevent_dce.inner = textureDimensions_31d00d();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32ui) uniform highp uimage3D arg_0;
+uvec3 textureDimensions_31d00d() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_31d00d() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_31d00d();
+  prevent_dce.inner = textureDimensions_31d00d();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32ui) uniform highp uimage3D arg_0;
+uvec3 textureDimensions_31d00d() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_31d00d();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.msl
index 2e0334f..9d16248 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_31d00d(texture3d<uint, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_31d00d(texture3d<uint, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_31d00d(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_31d00d(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_31d00d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_31d00d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_31d00d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_31d00d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.spvasm
index fd5158c..2b228f3a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_31d00d "textureDimensions_31d00d"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_31d00d = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_31d00d = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_31d00d
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_31d00d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_31d00d
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_31d00d
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_31d00d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_31d00d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.wgsl
index 7d3163a..726f817 100644
--- a/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/31d00d.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32uint, read_write>;
 
-fn textureDimensions_31d00d() {
+fn textureDimensions_31d00d() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_31d00d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_31d00d();
+  prevent_dce = textureDimensions_31d00d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_31d00d();
+  prevent_dce = textureDimensions_31d00d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_31d00d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl
index da4df51..bd7c063 100644
--- a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32sint, read_write>) -> vec2<u32>
-fn textureDimensions_325338() {
+fn textureDimensions_325338() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_325338();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_325338();
+  prevent_dce = textureDimensions_325338();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_325338();
+  prevent_dce = textureDimensions_325338();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_325338();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.dxc.hlsl
index da48caa..0392443 100644
--- a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_325338() {
+uint2 textureDimensions_325338() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_325338();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_325338();
+  prevent_dce.Store2(0u, asuint(textureDimensions_325338()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_325338();
+  prevent_dce.Store2(0u, asuint(textureDimensions_325338()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_325338();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.fxc.hlsl
index da48caa..0392443 100644
--- a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_325338() {
+uint2 textureDimensions_325338() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_325338();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_325338();
+  prevent_dce.Store2(0u, asuint(textureDimensions_325338()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_325338();
+  prevent_dce.Store2(0u, asuint(textureDimensions_325338()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_325338();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.glsl
index a0cc4e9..4fcb64d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_325338() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_325338();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_325338() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_325338() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_325338();
+  prevent_dce.inner = textureDimensions_325338();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_325338() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_325338() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_325338();
+  prevent_dce.inner = textureDimensions_325338();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_325338() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_325338();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.msl
index f8f07de..cf4d900 100644
--- a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_325338(texture2d<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_325338(texture2d<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_325338(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_325338(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_325338(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_325338(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_325338(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_325338(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.spvasm
index 530de1d..4051084 100644
--- a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_325338 "textureDimensions_325338"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_325338 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_325338 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_325338
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_325338
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_325338
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_325338
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_325338
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_325338
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.wgsl
index fe9bfc0..55aa260 100644
--- a/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/325338.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32sint, read_write>;
 
-fn textureDimensions_325338() {
+fn textureDimensions_325338() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_325338();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_325338();
+  prevent_dce = textureDimensions_325338();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_325338();
+  prevent_dce = textureDimensions_325338();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_325338();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl
index a42f424..bfec234 100644
--- a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<u32>;
 
 // fn textureDimensions(texture: texture_cube_array<u32>, level: u32) -> vec2<u32>
-fn textureDimensions_346fee() {
+fn textureDimensions_346fee() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_346fee();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_346fee();
+  prevent_dce = textureDimensions_346fee();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_346fee();
+  prevent_dce = textureDimensions_346fee();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_346fee();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.dxc.hlsl
index 974e53c..df79320 100644
--- a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_346fee() {
+uint2 textureDimensions_346fee() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_346fee();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_346fee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_346fee()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_346fee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_346fee()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_346fee();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.fxc.hlsl
index 974e53c..df79320 100644
--- a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_346fee() {
+uint2 textureDimensions_346fee() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_346fee();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_346fee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_346fee()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_346fee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_346fee()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_346fee();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.msl
index c46c34b..57fc86d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_346fee(texturecube_array<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_346fee(texturecube_array<uint, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_346fee(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_346fee(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_346fee(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_346fee(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_346fee(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_346fee(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.spvasm
index 0afbf3a..456fafe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 51
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,80 +22,106 @@
                OpName %textureDimensions_346fee "textureDimensions_346fee"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %32 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %37 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %47 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %53 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_346fee = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %32
+%textureDimensions_346fee = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %28 = OpLoad %11 %arg_0
-         %29 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %28 %29
-         %25 = OpVectorShuffle %v2uint %26 %26 0 1
-               OpStore %res %25
-         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %36 = OpLoad %v2uint %res
-               OpStore %35 %36
+         %30 = OpLoad %16 %arg_0
+         %31 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %30 %31
+         %27 = OpVectorShuffle %v2uint %28 %28 0 1
+               OpStore %res %27
+         %34 = OpLoad %v2uint %res
+               OpReturnValue %34
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %35
+         %38 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_346fee
+               OpStore %41 %42
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %37
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_346fee
-               OpReturnValue %5
+%compute_main = OpFunction %void None %35
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %46 = OpFunctionCall %v2uint %textureDimensions_346fee
+               OpStore %45 %46
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %43
+%vertex_main_inner = OpFunction %VertexOutput None %47
+         %50 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %53
+         %55 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %55 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_346fee
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %35
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_346fee
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %49 = OpLabel
-         %50 = OpFunctionCall %void %textureDimensions_346fee
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.wgsl
index f02e3e0..1308d19 100644
--- a/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/346fee.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<u32>;
 
-fn textureDimensions_346fee() {
+fn textureDimensions_346fee() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_346fee();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_346fee();
+  prevent_dce = textureDimensions_346fee();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_346fee();
+  prevent_dce = textureDimensions_346fee();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_346fee();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl
index 96967fe..399f816 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16uint, write>) -> vec3<u32>
-fn textureDimensions_35a7e5() {
+fn textureDimensions_35a7e5() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_35a7e5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_35a7e5();
+  prevent_dce = textureDimensions_35a7e5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_35a7e5();
+  prevent_dce = textureDimensions_35a7e5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_35a7e5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.dxc.hlsl
index f4b88b7..0f3f83d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_35a7e5() {
+uint3 textureDimensions_35a7e5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_35a7e5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_35a7e5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35a7e5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_35a7e5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35a7e5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_35a7e5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.fxc.hlsl
index f4b88b7..0f3f83d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_35a7e5() {
+uint3 textureDimensions_35a7e5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_35a7e5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_35a7e5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35a7e5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_35a7e5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35a7e5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_35a7e5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.glsl
index cc2cdb8..e33c0cf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_35a7e5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_35a7e5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_35a7e5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_35a7e5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_35a7e5();
+  prevent_dce.inner = textureDimensions_35a7e5();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_35a7e5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_35a7e5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_35a7e5();
+  prevent_dce.inner = textureDimensions_35a7e5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_35a7e5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_35a7e5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.msl
index 5b89c7d..085eab1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_35a7e5(texture3d<uint, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_35a7e5(texture3d<uint, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_35a7e5(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_35a7e5(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_35a7e5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_35a7e5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_35a7e5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_35a7e5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.spvasm
index 6eebebf..ef047c0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_35a7e5 "textureDimensions_35a7e5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_35a7e5 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_35a7e5 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_35a7e5
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_35a7e5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_35a7e5
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_35a7e5
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_35a7e5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_35a7e5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.wgsl
index c0733f8..52ce426 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35a7e5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16uint, write>;
 
-fn textureDimensions_35a7e5() {
+fn textureDimensions_35a7e5() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_35a7e5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_35a7e5();
+  prevent_dce = textureDimensions_35a7e5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_35a7e5();
+  prevent_dce = textureDimensions_35a7e5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_35a7e5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl
index a8ebf2f..16bbf34 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32uint, write>) -> vec3<u32>
-fn textureDimensions_35ee69() {
+fn textureDimensions_35ee69() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_35ee69();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_35ee69();
+  prevent_dce = textureDimensions_35ee69();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_35ee69();
+  prevent_dce = textureDimensions_35ee69();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_35ee69();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.dxc.hlsl
index 27b4273..cf0695f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_35ee69() {
+uint3 textureDimensions_35ee69() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_35ee69();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_35ee69();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35ee69()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_35ee69();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35ee69()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_35ee69();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.fxc.hlsl
index 27b4273..cf0695f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_35ee69() {
+uint3 textureDimensions_35ee69() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_35ee69();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_35ee69();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35ee69()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_35ee69();
+  prevent_dce.Store3(0u, asuint(textureDimensions_35ee69()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_35ee69();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.msl
index 14b224f..2837c04 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_35ee69(texture3d<uint, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_35ee69(texture3d<uint, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_35ee69(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_35ee69(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_35ee69(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_35ee69(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_35ee69(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_35ee69(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.spvasm
index 8fbfc75..7204bd8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_35ee69 "textureDimensions_35ee69"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_35ee69 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_35ee69 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_35ee69
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_35ee69
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_35ee69
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_35ee69
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_35ee69
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_35ee69
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.wgsl
index 1734c8e..f038514 100644
--- a/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/35ee69.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32uint, write>;
 
-fn textureDimensions_35ee69() {
+fn textureDimensions_35ee69() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_35ee69();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_35ee69();
+  prevent_dce = textureDimensions_35ee69();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_35ee69();
+  prevent_dce = textureDimensions_35ee69();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_35ee69();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl
index 1d3dbf6..6f75d6e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32uint, read_write>) -> vec2<u32>
-fn textureDimensions_36eeb7() {
+fn textureDimensions_36eeb7() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_36eeb7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_36eeb7();
+  prevent_dce = textureDimensions_36eeb7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_36eeb7();
+  prevent_dce = textureDimensions_36eeb7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_36eeb7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.dxc.hlsl
index 209bd61..57cb792 100644
--- a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_36eeb7() {
+uint2 textureDimensions_36eeb7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_36eeb7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_36eeb7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_36eeb7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_36eeb7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_36eeb7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_36eeb7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.fxc.hlsl
index 209bd61..57cb792 100644
--- a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_36eeb7() {
+uint2 textureDimensions_36eeb7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_36eeb7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_36eeb7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_36eeb7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_36eeb7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_36eeb7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_36eeb7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.glsl
index b0d3857..45dcb14 100644
--- a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_36eeb7() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_36eeb7();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_36eeb7() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_36eeb7() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_36eeb7();
+  prevent_dce.inner = textureDimensions_36eeb7();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_36eeb7() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_36eeb7() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_36eeb7();
+  prevent_dce.inner = textureDimensions_36eeb7();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_36eeb7() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_36eeb7();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.msl
index 97dfc67..e5192c4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_36eeb7(texture2d_array<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_36eeb7(texture2d_array<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_36eeb7(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_36eeb7(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_36eeb7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_36eeb7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_36eeb7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_36eeb7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.spvasm
index 0291cac..c10b04c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_36eeb7 "textureDimensions_36eeb7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_36eeb7 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_36eeb7 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_36eeb7
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_36eeb7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_36eeb7
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_36eeb7
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_36eeb7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_36eeb7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.wgsl
index cd50939..20f6a21 100644
--- a/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/36eeb7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32uint, read_write>;
 
-fn textureDimensions_36eeb7() {
+fn textureDimensions_36eeb7() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_36eeb7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_36eeb7();
+  prevent_dce = textureDimensions_36eeb7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_36eeb7();
+  prevent_dce = textureDimensions_36eeb7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_36eeb7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl
index ad5f7fa..2a315f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8sint, write>) -> vec2<u32>
-fn textureDimensions_378a65() {
+fn textureDimensions_378a65() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_378a65();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_378a65();
+  prevent_dce = textureDimensions_378a65();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_378a65();
+  prevent_dce = textureDimensions_378a65();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_378a65();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.dxc.hlsl
index 30ae103..9c1c332 100644
--- a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_378a65() {
+uint2 textureDimensions_378a65() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_378a65();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_378a65();
+  prevent_dce.Store2(0u, asuint(textureDimensions_378a65()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_378a65();
+  prevent_dce.Store2(0u, asuint(textureDimensions_378a65()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_378a65();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.fxc.hlsl
index 30ae103..9c1c332 100644
--- a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_378a65() {
+uint2 textureDimensions_378a65() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_378a65();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_378a65();
+  prevent_dce.Store2(0u, asuint(textureDimensions_378a65()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_378a65();
+  prevent_dce.Store2(0u, asuint(textureDimensions_378a65()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_378a65();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.glsl
index 43559d21..c527cc5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_378a65() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_378a65();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_378a65() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_378a65() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_378a65();
+  prevent_dce.inner = textureDimensions_378a65();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_378a65() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_378a65() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_378a65();
+  prevent_dce.inner = textureDimensions_378a65();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_378a65() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_378a65();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.msl
index 850ec83..c07c3223 100644
--- a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_378a65(texture2d<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_378a65(texture2d<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_378a65(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_378a65(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_378a65(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_378a65(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_378a65(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_378a65(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.spvasm
index f302b75..4787baa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_378a65 "textureDimensions_378a65"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_378a65 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_378a65 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_378a65
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_378a65
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_378a65
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_378a65
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_378a65
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_378a65
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.wgsl
index b40dee3..79a1a8f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/378a65.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8sint, write>;
 
-fn textureDimensions_378a65() {
+fn textureDimensions_378a65() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_378a65();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_378a65();
+  prevent_dce = textureDimensions_378a65();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_378a65();
+  prevent_dce = textureDimensions_378a65();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_378a65();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl
index 102115f..cfbdfe8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube<f32>;
 
 // fn textureDimensions(texture: texture_cube<f32>, level: u32) -> vec2<u32>
-fn textureDimensions_382b16() {
+fn textureDimensions_382b16() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_382b16();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_382b16();
+  prevent_dce = textureDimensions_382b16();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_382b16();
+  prevent_dce = textureDimensions_382b16();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_382b16();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.dxc.hlsl
index d877eb7..bdd55ba 100644
--- a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_382b16() {
+uint2 textureDimensions_382b16() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_382b16();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_382b16();
+  prevent_dce.Store2(0u, asuint(textureDimensions_382b16()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_382b16();
+  prevent_dce.Store2(0u, asuint(textureDimensions_382b16()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_382b16();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.fxc.hlsl
index d877eb7..bdd55ba 100644
--- a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_382b16() {
+uint2 textureDimensions_382b16() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_382b16();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_382b16();
+  prevent_dce.Store2(0u, asuint(textureDimensions_382b16()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_382b16();
+  prevent_dce.Store2(0u, asuint(textureDimensions_382b16()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_382b16();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.glsl
index af8a7b6..088cb3b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp samplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_382b16() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_382b16();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_382b16() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_382b16() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_382b16();
+  prevent_dce.inner = textureDimensions_382b16();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_382b16() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_382b16() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_382b16();
+  prevent_dce.inner = textureDimensions_382b16();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_382b16() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_382b16();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.msl
index 9e677b9..95ee932 100644
--- a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_382b16(texturecube<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_382b16(texturecube<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_382b16(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_382b16(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_382b16(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_382b16(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_382b16(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_382b16(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.spvasm
index 170c6f6..0f7599e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_382b16 "textureDimensions_382b16"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %30 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_382b16 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %30
+%textureDimensions_382b16 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v2uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %34 = OpLoad %v2uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v2uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v2uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_382b16
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_382b16
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v2uint %textureDimensions_382b16
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_382b16
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_382b16
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_382b16
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.wgsl
index 1f7d94d..964c4ac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/382b16.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
-fn textureDimensions_382b16() {
+fn textureDimensions_382b16() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_382b16();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_382b16();
+  prevent_dce = textureDimensions_382b16();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_382b16();
+  prevent_dce = textureDimensions_382b16();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_382b16();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl
index 3fdfd91..35d0989 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32sint, read_write>) -> vec2<u32>
-fn textureDimensions_3834f8() {
+fn textureDimensions_3834f8() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3834f8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3834f8();
+  prevent_dce = textureDimensions_3834f8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3834f8();
+  prevent_dce = textureDimensions_3834f8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3834f8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.dxc.hlsl
index 997891c..3acfbef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3834f8() {
+uint2 textureDimensions_3834f8() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3834f8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3834f8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3834f8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3834f8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3834f8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3834f8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.fxc.hlsl
index 997891c..3acfbef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3834f8() {
+uint2 textureDimensions_3834f8() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3834f8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3834f8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3834f8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3834f8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3834f8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3834f8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.glsl
index 7af7fc4..b528dd7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3834f8() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3834f8();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp iimage2DArray arg_0;
+uvec2 textureDimensions_3834f8() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3834f8() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3834f8();
+  prevent_dce.inner = textureDimensions_3834f8();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp iimage2DArray arg_0;
+uvec2 textureDimensions_3834f8() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3834f8() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3834f8();
+  prevent_dce.inner = textureDimensions_3834f8();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32i) uniform highp iimage2DArray arg_0;
+uvec2 textureDimensions_3834f8() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3834f8();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.msl
index 32789b8..8bcc26c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3834f8(texture2d_array<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3834f8(texture2d_array<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3834f8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3834f8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3834f8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3834f8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3834f8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3834f8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.spvasm
index 4519cff..6e17440 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3834f8 "textureDimensions_3834f8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3834f8 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_3834f8 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_3834f8
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_3834f8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_3834f8
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_3834f8
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_3834f8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_3834f8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.wgsl
index a163261..0480cf3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3834f8.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32sint, read_write>;
 
-fn textureDimensions_3834f8() {
+fn textureDimensions_3834f8() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3834f8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3834f8();
+  prevent_dce = textureDimensions_3834f8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3834f8();
+  prevent_dce = textureDimensions_3834f8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3834f8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl
index d227e23..896e2d2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16float, read_write>) -> vec2<u32>
-fn textureDimensions_38c9ca() {
+fn textureDimensions_38c9ca() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_38c9ca();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_38c9ca();
+  prevent_dce = textureDimensions_38c9ca();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_38c9ca();
+  prevent_dce = textureDimensions_38c9ca();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_38c9ca();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.dxc.hlsl
index 1d3c6a9..c4f6899 100644
--- a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_38c9ca() {
+uint2 textureDimensions_38c9ca() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_38c9ca();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_38c9ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_38c9ca()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_38c9ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_38c9ca()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_38c9ca();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.fxc.hlsl
index 1d3c6a9..c4f6899 100644
--- a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_38c9ca() {
+uint2 textureDimensions_38c9ca() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_38c9ca();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_38c9ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_38c9ca()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_38c9ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_38c9ca()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_38c9ca();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.glsl
index c90d4fc..06c85ee 100644
--- a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_38c9ca() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_38c9ca();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_38c9ca() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_38c9ca() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_38c9ca();
+  prevent_dce.inner = textureDimensions_38c9ca();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_38c9ca() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_38c9ca() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_38c9ca();
+  prevent_dce.inner = textureDimensions_38c9ca();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_38c9ca() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_38c9ca();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.msl
index 569e619..52807bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_38c9ca(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_38c9ca(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_38c9ca(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_38c9ca(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_38c9ca(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_38c9ca(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_38c9ca(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_38c9ca(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.spvasm
index 9959d7d..e55ffe0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_38c9ca "textureDimensions_38c9ca"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_38c9ca = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_38c9ca = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_38c9ca
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_38c9ca
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_38c9ca
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_38c9ca
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_38c9ca
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_38c9ca
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.wgsl
index b1d97fb..16c7f6f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/38c9ca.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16float, read_write>;
 
-fn textureDimensions_38c9ca() {
+fn textureDimensions_38c9ca() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_38c9ca();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_38c9ca();
+  prevent_dce = textureDimensions_38c9ca();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_38c9ca();
+  prevent_dce = textureDimensions_38c9ca();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_38c9ca();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl
index 61fed2f..3217115 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<i32>;
 
 // fn textureDimensions(texture: texture_cube_array<i32>, level: u32) -> vec2<u32>
-fn textureDimensions_3963d0() {
+fn textureDimensions_3963d0() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3963d0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3963d0();
+  prevent_dce = textureDimensions_3963d0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3963d0();
+  prevent_dce = textureDimensions_3963d0();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3963d0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.dxc.hlsl
index 7b6b6ec..dfe958a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3963d0() {
+uint2 textureDimensions_3963d0() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3963d0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3963d0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3963d0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3963d0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3963d0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3963d0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.fxc.hlsl
index 7b6b6ec..dfe958a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3963d0() {
+uint2 textureDimensions_3963d0() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3963d0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3963d0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3963d0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3963d0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3963d0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3963d0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.msl
index 9c215a5..3303964 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3963d0(texturecube_array<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3963d0(texturecube_array<int, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3963d0(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3963d0(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3963d0(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3963d0(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3963d0(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3963d0(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.spvasm
index 1e0086f..0c8c9de 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,81 +22,107 @@
                OpName %textureDimensions_3963d0 "textureDimensions_3963d0"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+         %27 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_3963d0 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_3963d0 = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %uint %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %uint %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_3963d0
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_3963d0
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_3963d0
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %57 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %58 = OpFunctionCall %v2uint %textureDimensions_3963d0
+               OpStore %57 %58
+         %59 = OpLoad %VertexOutput %out
+               OpReturnValue %59
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %61 = OpLabel
+         %62 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %63 = OpCompositeExtract %v4float %62 0
+               OpStore %pos_1 %63
+         %64 = OpCompositeExtract %v2uint %62 1
+               OpStore %prevent_dce_1 %64
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_3963d0
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_3963d0
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.wgsl
index e2c25a7..4af2af7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3963d0.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<i32>;
 
-fn textureDimensions_3963d0() {
+fn textureDimensions_3963d0() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3963d0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3963d0();
+  prevent_dce = textureDimensions_3963d0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3963d0();
+  prevent_dce = textureDimensions_3963d0();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3963d0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl
index e3c93d1..be73c8b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8uint, read>) -> vec2<u32>
-fn textureDimensions_397dab() {
+fn textureDimensions_397dab() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_397dab();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_397dab();
+  prevent_dce = textureDimensions_397dab();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_397dab();
+  prevent_dce = textureDimensions_397dab();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_397dab();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.dxc.hlsl
index 53a18f3..ab761b5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_397dab() {
+uint2 textureDimensions_397dab() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_397dab();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_397dab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_397dab()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_397dab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_397dab()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_397dab();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.fxc.hlsl
index 53a18f3..ab761b5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_397dab() {
+uint2 textureDimensions_397dab() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_397dab();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_397dab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_397dab()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_397dab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_397dab()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_397dab();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.glsl
index 64faabb..67ff684 100644
--- a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp readonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_397dab() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_397dab();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_397dab() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_397dab() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_397dab();
+  prevent_dce.inner = textureDimensions_397dab();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_397dab() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_397dab() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_397dab();
+  prevent_dce.inner = textureDimensions_397dab();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_397dab() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_397dab();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.msl
index d2efe77..04d662e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_397dab(texture2d_array<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_397dab(texture2d_array<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_397dab(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_397dab(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_397dab(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_397dab(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_397dab(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_397dab(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.spvasm
index 08bb73c..e49b1b5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_397dab "textureDimensions_397dab"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_397dab = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_397dab = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_397dab
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_397dab
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_397dab
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_397dab
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_397dab
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_397dab
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.wgsl
index 025fb82..8ff0955 100644
--- a/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/397dab.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8uint, read>;
 
-fn textureDimensions_397dab() {
+fn textureDimensions_397dab() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_397dab();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_397dab();
+  prevent_dce = textureDimensions_397dab();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_397dab();
+  prevent_dce = textureDimensions_397dab();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_397dab();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl
index 0ab32e9..8168572 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32float, write>) -> vec3<u32>
-fn textureDimensions_3a5bb1() {
+fn textureDimensions_3a5bb1() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3a5bb1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce = textureDimensions_3a5bb1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce = textureDimensions_3a5bb1();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3a5bb1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.dxc.hlsl
index d8e1c7a..41ede51 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3a5bb1() {
+uint3 textureDimensions_3a5bb1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3a5bb1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_3a5bb1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_3a5bb1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3a5bb1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.fxc.hlsl
index d8e1c7a..41ede51 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3a5bb1() {
+uint3 textureDimensions_3a5bb1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3a5bb1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_3a5bb1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_3a5bb1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3a5bb1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.glsl
index f20fe70..765951b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_3a5bb1() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3a5bb1();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_3a5bb1() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_3a5bb1() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce.inner = textureDimensions_3a5bb1();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_3a5bb1() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_3a5bb1() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce.inner = textureDimensions_3a5bb1();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_3a5bb1() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3a5bb1();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.msl
index cf5d00a..d749fa7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3a5bb1(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_3a5bb1(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_3a5bb1(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_3a5bb1(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_3a5bb1(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3a5bb1(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3a5bb1(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3a5bb1(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.spvasm
index bc431a6..587b0cc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3a5bb1 "textureDimensions_3a5bb1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3a5bb1 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_3a5bb1 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_3a5bb1
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_3a5bb1
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_3a5bb1
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_3a5bb1
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_3a5bb1
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_3a5bb1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.wgsl
index 0542029..7d2e79e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a5bb1.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32float, write>;
 
-fn textureDimensions_3a5bb1() {
+fn textureDimensions_3a5bb1() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3a5bb1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce = textureDimensions_3a5bb1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3a5bb1();
+  prevent_dce = textureDimensions_3a5bb1();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3a5bb1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl
index c375f31..81310aa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8unorm, write>) -> vec2<u32>
-fn textureDimensions_3a7b69() {
+fn textureDimensions_3a7b69() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3a7b69();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3a7b69();
+  prevent_dce = textureDimensions_3a7b69();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3a7b69();
+  prevent_dce = textureDimensions_3a7b69();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3a7b69();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.dxc.hlsl
index b391bd5..09d3fa2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3a7b69() {
+uint2 textureDimensions_3a7b69() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3a7b69();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3a7b69();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3a7b69()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3a7b69();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3a7b69()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3a7b69();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.fxc.hlsl
index b391bd5..09d3fa2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3a7b69() {
+uint2 textureDimensions_3a7b69() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3a7b69();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3a7b69();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3a7b69()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3a7b69();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3a7b69()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3a7b69();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.glsl
index 321bd73..21b27ab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3a7b69() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3a7b69();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_3a7b69() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3a7b69() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3a7b69();
+  prevent_dce.inner = textureDimensions_3a7b69();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_3a7b69() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3a7b69() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3a7b69();
+  prevent_dce.inner = textureDimensions_3a7b69();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_3a7b69() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3a7b69();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.msl
index 952bf08..c3d61a5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3a7b69(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3a7b69(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3a7b69(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3a7b69(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3a7b69(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3a7b69(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3a7b69(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3a7b69(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.spvasm
index ae8c17a..f9e6a54 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3a7b69 "textureDimensions_3a7b69"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3a7b69 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_3a7b69 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_3a7b69
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_3a7b69
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_3a7b69
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_3a7b69
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_3a7b69
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_3a7b69
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.wgsl
index 1f59f9f..17eea7d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3a7b69.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8unorm, write>;
 
-fn textureDimensions_3a7b69() {
+fn textureDimensions_3a7b69() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3a7b69();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3a7b69();
+  prevent_dce = textureDimensions_3a7b69();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3a7b69();
+  prevent_dce = textureDimensions_3a7b69();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3a7b69();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl
index 22fb7fd..25c4d95 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8unorm, write>) -> u32
-fn textureDimensions_3af3e7() {
+fn textureDimensions_3af3e7() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3af3e7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3af3e7();
+  prevent_dce = textureDimensions_3af3e7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3af3e7();
+  prevent_dce = textureDimensions_3af3e7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3af3e7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.dxc.hlsl
index 0a8cfb8..a9adc4f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3af3e7() {
+uint textureDimensions_3af3e7() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3af3e7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3af3e7();
+  prevent_dce.Store(0u, asuint(textureDimensions_3af3e7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3af3e7();
+  prevent_dce.Store(0u, asuint(textureDimensions_3af3e7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3af3e7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.fxc.hlsl
index 0a8cfb8..a9adc4f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3af3e7() {
+uint textureDimensions_3af3e7() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3af3e7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3af3e7();
+  prevent_dce.Store(0u, asuint(textureDimensions_3af3e7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3af3e7();
+  prevent_dce.Store(0u, asuint(textureDimensions_3af3e7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3af3e7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.glsl
index 4c38cde..d8753b6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_3af3e7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3af3e7();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_3af3e7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_3af3e7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3af3e7();
+  prevent_dce.inner = textureDimensions_3af3e7();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_3af3e7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_3af3e7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3af3e7();
+  prevent_dce.inner = textureDimensions_3af3e7();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_3af3e7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3af3e7();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.msl
index 9078302..2d5c6f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3af3e7(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_3af3e7(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3af3e7(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3af3e7(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_3af3e7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3af3e7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3af3e7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3af3e7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.spvasm
index 862c830..da7799b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3af3e7 "textureDimensions_3af3e7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3af3e7 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_3af3e7 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_3af3e7
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_3af3e7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_3af3e7
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_3af3e7
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_3af3e7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_3af3e7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.wgsl
index e499dc2..8cb2d89 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3af3e7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8unorm, write>;
 
-fn textureDimensions_3af3e7() {
+fn textureDimensions_3af3e7() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3af3e7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3af3e7();
+  prevent_dce = textureDimensions_3af3e7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3af3e7();
+  prevent_dce = textureDimensions_3af3e7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3af3e7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl
index 8b6d8fb..529cae6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn textureDimensions(texture: texture_depth_2d) -> vec2<u32>
-fn textureDimensions_3b38f6() {
+fn textureDimensions_3b38f6() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3b38f6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3b38f6();
+  prevent_dce = textureDimensions_3b38f6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3b38f6();
+  prevent_dce = textureDimensions_3b38f6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3b38f6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.dxc.hlsl
index 55f1f10..48fa670 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3b38f6() {
+uint2 textureDimensions_3b38f6() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3b38f6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3b38f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3b38f6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3b38f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3b38f6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3b38f6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.fxc.hlsl
index 55f1f10..48fa670 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3b38f6() {
+uint2 textureDimensions_3b38f6() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3b38f6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3b38f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3b38f6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3b38f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3b38f6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3b38f6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.glsl
index 6ca56e3..5b8a15b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3b38f6() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3b38f6();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_3b38f6() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3b38f6() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3b38f6();
+  prevent_dce.inner = textureDimensions_3b38f6();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_3b38f6() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3b38f6() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3b38f6();
+  prevent_dce.inner = textureDimensions_3b38f6();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_3b38f6() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3b38f6();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.msl
index c9baf45..6d597d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3b38f6(depth2d<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3b38f6(depth2d<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depth2d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3b38f6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depth2d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3b38f6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depth2d<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3b38f6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depth2d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3b38f6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depth2d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depth2d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depth2d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3b38f6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depth2d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3b38f6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.spvasm
index 7883a06..deb97c7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3b38f6 "textureDimensions_3b38f6"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3b38f6 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v2uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_3b38f6 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v2uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_3b38f6
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_3b38f6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_3b38f6
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_3b38f6
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_3b38f6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_3b38f6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.wgsl
index 11c120d..fc18b34 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3b38f6.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-fn textureDimensions_3b38f6() {
+fn textureDimensions_3b38f6() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3b38f6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3b38f6();
+  prevent_dce = textureDimensions_3b38f6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3b38f6();
+  prevent_dce = textureDimensions_3b38f6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3b38f6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl
index f9c186b..f118105 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8uint, write>) -> vec2<u32>
-fn textureDimensions_3baab5() {
+fn textureDimensions_3baab5() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3baab5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3baab5();
+  prevent_dce = textureDimensions_3baab5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3baab5();
+  prevent_dce = textureDimensions_3baab5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3baab5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.dxc.hlsl
index 8f72d86..2af7cb3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3baab5() {
+uint2 textureDimensions_3baab5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3baab5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3baab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3baab5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3baab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3baab5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3baab5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.fxc.hlsl
index 8f72d86..2af7cb3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3baab5() {
+uint2 textureDimensions_3baab5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3baab5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3baab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3baab5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3baab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3baab5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3baab5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.glsl
index 3d4cca6..482e6f5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3baab5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3baab5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_3baab5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3baab5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3baab5();
+  prevent_dce.inner = textureDimensions_3baab5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_3baab5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3baab5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3baab5();
+  prevent_dce.inner = textureDimensions_3baab5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_3baab5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3baab5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.msl
index 0d775da..58ce133 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3baab5(texture2d_array<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3baab5(texture2d_array<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3baab5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3baab5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3baab5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3baab5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3baab5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3baab5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.spvasm
index 36abe71..da3e969 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3baab5 "textureDimensions_3baab5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3baab5 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_3baab5 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_3baab5
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_3baab5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_3baab5
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_3baab5
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_3baab5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_3baab5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.wgsl
index 3cb17ad..fd31f98 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3baab5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8uint, write>;
 
-fn textureDimensions_3baab5() {
+fn textureDimensions_3baab5() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3baab5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3baab5();
+  prevent_dce = textureDimensions_3baab5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3baab5();
+  prevent_dce = textureDimensions_3baab5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3baab5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl
index b90ee55..8c201ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32float, read_write>) -> vec2<u32>
-fn textureDimensions_3bf12a() {
+fn textureDimensions_3bf12a() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3bf12a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3bf12a();
+  prevent_dce = textureDimensions_3bf12a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3bf12a();
+  prevent_dce = textureDimensions_3bf12a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3bf12a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.dxc.hlsl
index 26f811d..ecce472 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3bf12a() {
+uint2 textureDimensions_3bf12a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3bf12a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3bf12a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3bf12a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3bf12a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3bf12a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3bf12a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.fxc.hlsl
index 26f811d..ecce472 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3bf12a() {
+uint2 textureDimensions_3bf12a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3bf12a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3bf12a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3bf12a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3bf12a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3bf12a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3bf12a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.glsl
index 8d06ca9..bba9dab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3bf12a() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3bf12a();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp image2DArray arg_0;
+uvec2 textureDimensions_3bf12a() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3bf12a() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3bf12a();
+  prevent_dce.inner = textureDimensions_3bf12a();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp image2DArray arg_0;
+uvec2 textureDimensions_3bf12a() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3bf12a() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3bf12a();
+  prevent_dce.inner = textureDimensions_3bf12a();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32f) uniform highp image2DArray arg_0;
+uvec2 textureDimensions_3bf12a() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3bf12a();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.msl
index ae0e30c..0d91b56 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3bf12a(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3bf12a(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3bf12a(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3bf12a(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3bf12a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3bf12a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3bf12a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3bf12a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.spvasm
index ecadd1a..496f188 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3bf12a "textureDimensions_3bf12a"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3bf12a = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_3bf12a = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_3bf12a
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_3bf12a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_3bf12a
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_3bf12a
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_3bf12a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_3bf12a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.wgsl
index efbca67..4360cf7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3bf12a.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32float, read_write>;
 
-fn textureDimensions_3bf12a() {
+fn textureDimensions_3bf12a() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3bf12a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3bf12a();
+  prevent_dce = textureDimensions_3bf12a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3bf12a();
+  prevent_dce = textureDimensions_3bf12a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3bf12a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl
index 7628809..ed3b165 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<i32>;
 
 // fn textureDimensions(texture: texture_cube_array<i32>, level: i32) -> vec2<u32>
-fn textureDimensions_3c66f0() {
+fn textureDimensions_3c66f0() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3c66f0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3c66f0();
+  prevent_dce = textureDimensions_3c66f0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3c66f0();
+  prevent_dce = textureDimensions_3c66f0();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3c66f0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.dxc.hlsl
index ea33cba..c23575d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3c66f0() {
+uint2 textureDimensions_3c66f0() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3c66f0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3c66f0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3c66f0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3c66f0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3c66f0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3c66f0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.fxc.hlsl
index ea33cba..c23575d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3c66f0() {
+uint2 textureDimensions_3c66f0() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3c66f0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3c66f0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3c66f0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3c66f0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3c66f0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3c66f0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.msl
index 0447ab0..acc53a5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3c66f0(texturecube_array<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3c66f0(texturecube_array<int, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3c66f0(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3c66f0(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3c66f0(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3c66f0(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3c66f0(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3c66f0(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.spvasm
index 66895aa..3c5885c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,81 +22,108 @@
                OpName %textureDimensions_3c66f0 "textureDimensions_3c66f0"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3c66f0 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_3c66f0 = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_3c66f0
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_3c66f0
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_3c66f0
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_3c66f0
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_3c66f0
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_3c66f0
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.wgsl
index 8ca330d..55a59cf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3c66f0.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<i32>;
 
-fn textureDimensions_3c66f0() {
+fn textureDimensions_3c66f0() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3c66f0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3c66f0();
+  prevent_dce = textureDimensions_3c66f0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3c66f0();
+  prevent_dce = textureDimensions_3c66f0();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3c66f0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl
index 352fe8d..f2b54d9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
 
 // fn textureDimensions(texture: texture_multisampled_2d<f32>) -> vec2<u32>
-fn textureDimensions_3f3474() {
+fn textureDimensions_3f3474() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3f3474();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3f3474();
+  prevent_dce = textureDimensions_3f3474();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3f3474();
+  prevent_dce = textureDimensions_3f3474();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3f3474();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.dxc.hlsl
index 2e10445..e26a378 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3f3474() {
+uint2 textureDimensions_3f3474() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3f3474();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3f3474();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3f3474()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3f3474();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3f3474()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3f3474();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.fxc.hlsl
index 2e10445..e26a378 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3f3474() {
+uint2 textureDimensions_3f3474() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3f3474();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3f3474();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3f3474()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3f3474();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3f3474()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3f3474();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.glsl
index 684ab67..23a872c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp sampler2DMS arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3f3474() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3f3474();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DMS arg_0_1;
+uvec2 textureDimensions_3f3474() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3f3474() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3f3474();
+  prevent_dce.inner = textureDimensions_3f3474();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp sampler2DMS arg_0_1;
+uvec2 textureDimensions_3f3474() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3f3474() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3f3474();
+  prevent_dce.inner = textureDimensions_3f3474();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DMS arg_0_1;
+uvec2 textureDimensions_3f3474() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3f3474();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.msl
index 8de6e4d..a99e3c5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3f3474(texture2d_ms<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3f3474(texture2d_ms<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_ms<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3f3474(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_ms<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3f3474(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_ms<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3f3474(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_ms<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3f3474(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_ms<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_ms<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_ms<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3f3474(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_ms<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3f3474(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.spvasm
index 8c8a1ca..f000b98 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3f3474 "textureDimensions_3f3474"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 1 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 1 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3f3474 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_3f3474 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_3f3474
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_3f3474
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_3f3474
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_3f3474
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_3f3474
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_3f3474
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.wgsl
index f8459c2..8cf9008 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3f3474.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_multisampled_2d<f32>;
 
-fn textureDimensions_3f3474() {
+fn textureDimensions_3f3474() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3f3474();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3f3474();
+  prevent_dce = textureDimensions_3f3474();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3f3474();
+  prevent_dce = textureDimensions_3f3474();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3f3474();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl
index cef5eb7..b3ec857 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureDimensions(texture: texture_2d_array<f32>, level: u32) -> vec2<u32>
-fn textureDimensions_3fc3dc() {
+fn textureDimensions_3fc3dc() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3fc3dc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce = textureDimensions_3fc3dc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce = textureDimensions_3fc3dc();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3fc3dc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.dxc.hlsl
index 3043b1b..2dcd9db 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3fc3dc() {
+uint2 textureDimensions_3fc3dc() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3fc3dc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3fc3dc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3fc3dc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3fc3dc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.fxc.hlsl
index 3043b1b..2dcd9db 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3fc3dc() {
+uint2 textureDimensions_3fc3dc() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3fc3dc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3fc3dc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3fc3dc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3fc3dc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.glsl
index 624a1d7..c897bfb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3fc3dc() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3fc3dc();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_3fc3dc() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3fc3dc() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce.inner = textureDimensions_3fc3dc();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_3fc3dc() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3fc3dc() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce.inner = textureDimensions_3fc3dc();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_3fc3dc() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3fc3dc();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.msl
index aa00e05..f9b65d2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3fc3dc(texture2d_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3fc3dc(texture2d_array<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3fc3dc(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3fc3dc(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3fc3dc(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3fc3dc(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3fc3dc(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3fc3dc(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.spvasm
index 0034c90..43c5a51 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 51
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,80 +21,106 @@
                OpName %textureDimensions_3fc3dc "textureDimensions_3fc3dc"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %32 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %37 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %47 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %53 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_3fc3dc = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %32
+%textureDimensions_3fc3dc = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %28 = OpLoad %11 %arg_0
-         %29 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %28 %29
-         %25 = OpVectorShuffle %v2uint %26 %26 0 1
-               OpStore %res %25
-         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %36 = OpLoad %v2uint %res
-               OpStore %35 %36
+         %30 = OpLoad %16 %arg_0
+         %31 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %30 %31
+         %27 = OpVectorShuffle %v2uint %28 %28 0 1
+               OpStore %res %27
+         %34 = OpLoad %v2uint %res
+               OpReturnValue %34
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %35
+         %38 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_3fc3dc
+               OpStore %41 %42
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %37
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_3fc3dc
-               OpReturnValue %5
+%compute_main = OpFunction %void None %35
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %46 = OpFunctionCall %v2uint %textureDimensions_3fc3dc
+               OpStore %45 %46
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %43
+%vertex_main_inner = OpFunction %VertexOutput None %47
+         %50 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %53
+         %55 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %55 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_3fc3dc
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %35
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_3fc3dc
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %49 = OpLabel
-         %50 = OpFunctionCall %void %textureDimensions_3fc3dc
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.wgsl
index 7fd00b7..cdca68c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3fc3dc.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-fn textureDimensions_3fc3dc() {
+fn textureDimensions_3fc3dc() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3fc3dc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce = textureDimensions_3fc3dc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3fc3dc();
+  prevent_dce = textureDimensions_3fc3dc();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3fc3dc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl
index b67ab1a..266ff8b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32sint, read>) -> vec2<u32>
-fn textureDimensions_3ff0a5() {
+fn textureDimensions_3ff0a5() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3ff0a5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce = textureDimensions_3ff0a5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce = textureDimensions_3ff0a5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3ff0a5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.dxc.hlsl
index bcc0dbc..b4e5610 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3ff0a5() {
+uint2 textureDimensions_3ff0a5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3ff0a5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3ff0a5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3ff0a5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3ff0a5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.fxc.hlsl
index bcc0dbc..b4e5610 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_3ff0a5() {
+uint2 textureDimensions_3ff0a5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_3ff0a5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3ff0a5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_3ff0a5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_3ff0a5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.glsl
index a24a360..cef1986 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp readonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_3ff0a5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_3ff0a5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_3ff0a5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3ff0a5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce.inner = textureDimensions_3ff0a5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_3ff0a5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_3ff0a5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce.inner = textureDimensions_3ff0a5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_3ff0a5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_3ff0a5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.msl
index 338fff5..e2cac87 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_3ff0a5(texture2d_array<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_3ff0a5(texture2d_array<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_3ff0a5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_3ff0a5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_3ff0a5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_3ff0a5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_3ff0a5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_3ff0a5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.spvasm
index 811d06b..e01fff6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_3ff0a5 "textureDimensions_3ff0a5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_3ff0a5 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_3ff0a5 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_3ff0a5
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_3ff0a5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_3ff0a5
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_3ff0a5
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_3ff0a5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_3ff0a5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.wgsl
index 22f3344..aa34739 100644
--- a/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/3ff0a5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32sint, read>;
 
-fn textureDimensions_3ff0a5() {
+fn textureDimensions_3ff0a5() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3ff0a5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce = textureDimensions_3ff0a5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_3ff0a5();
+  prevent_dce = textureDimensions_3ff0a5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_3ff0a5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl
index 37faf01..38ef2ef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8sint, write>) -> vec3<u32>
-fn textureDimensions_40c671() {
+fn textureDimensions_40c671() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_40c671();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_40c671();
+  prevent_dce = textureDimensions_40c671();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_40c671();
+  prevent_dce = textureDimensions_40c671();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_40c671();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.dxc.hlsl
index 676bb14..1ebabb8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_40c671() {
+uint3 textureDimensions_40c671() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_40c671();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_40c671();
+  prevent_dce.Store3(0u, asuint(textureDimensions_40c671()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_40c671();
+  prevent_dce.Store3(0u, asuint(textureDimensions_40c671()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_40c671();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.fxc.hlsl
index 676bb14..1ebabb8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_40c671() {
+uint3 textureDimensions_40c671() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_40c671();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_40c671();
+  prevent_dce.Store3(0u, asuint(textureDimensions_40c671()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_40c671();
+  prevent_dce.Store3(0u, asuint(textureDimensions_40c671()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_40c671();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.glsl
index 80f9af7..0e3d094 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_40c671() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_40c671();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_40c671() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_40c671() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_40c671();
+  prevent_dce.inner = textureDimensions_40c671();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_40c671() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_40c671() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_40c671();
+  prevent_dce.inner = textureDimensions_40c671();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_40c671() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_40c671();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.msl
index de2c135..5d33559 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_40c671(texture3d<int, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_40c671(texture3d<int, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_40c671(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_40c671(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_40c671(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_40c671(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_40c671(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_40c671(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.spvasm
index 86a4c1e..90b2a20 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_40c671 "textureDimensions_40c671"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_40c671 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_40c671 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_40c671
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_40c671
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_40c671
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_40c671
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_40c671
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_40c671
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.wgsl
index 43e9284..3494c29 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40c671.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8sint, write>;
 
-fn textureDimensions_40c671() {
+fn textureDimensions_40c671() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_40c671();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_40c671();
+  prevent_dce = textureDimensions_40c671();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_40c671();
+  prevent_dce = textureDimensions_40c671();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_40c671();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl
index dc1df71..5fda4a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<r8unorm, read>) -> vec2<u32>
-fn textureDimensions_40da20() {
+fn textureDimensions_40da20() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_40da20();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_40da20();
+  prevent_dce = textureDimensions_40da20();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_40da20();
+  prevent_dce = textureDimensions_40da20();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_40da20();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.dxc.hlsl
index 4ec3a73..a3a8aab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_40da20() {
+uint2 textureDimensions_40da20() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_40da20();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_40da20();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40da20()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_40da20();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40da20()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_40da20();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.fxc.hlsl
index 4ec3a73..a3a8aab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_40da20() {
+uint2 textureDimensions_40da20() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_40da20();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_40da20();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40da20()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_40da20();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40da20()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_40da20();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.msl
index 8af0da9..60d00a7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_40da20(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_40da20(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_40da20(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_40da20(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_40da20(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_40da20(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_40da20(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_40da20(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.spvasm
index faf1d61..3daff3f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_40da20 "textureDimensions_40da20"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_40da20 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_40da20 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_40da20
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_40da20
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_40da20
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_40da20
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_40da20
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_40da20
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.wgsl
index 81140cb..c8d1b8a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40da20.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r8unorm, read>;
 
-fn textureDimensions_40da20() {
+fn textureDimensions_40da20() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_40da20();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_40da20();
+  prevent_dce = textureDimensions_40da20();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_40da20();
+  prevent_dce = textureDimensions_40da20();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_40da20();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl
index 15a663b..e58e2bc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16uint, write>) -> vec2<u32>
-fn textureDimensions_40ecf4() {
+fn textureDimensions_40ecf4() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_40ecf4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_40ecf4();
+  prevent_dce = textureDimensions_40ecf4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_40ecf4();
+  prevent_dce = textureDimensions_40ecf4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_40ecf4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.dxc.hlsl
index 0555e82..bdee881 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_40ecf4() {
+uint2 textureDimensions_40ecf4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_40ecf4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_40ecf4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40ecf4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_40ecf4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40ecf4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_40ecf4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.fxc.hlsl
index 0555e82..bdee881 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_40ecf4() {
+uint2 textureDimensions_40ecf4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_40ecf4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_40ecf4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40ecf4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_40ecf4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_40ecf4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_40ecf4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.glsl
index c39a807..b23c546 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_40ecf4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_40ecf4();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_40ecf4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_40ecf4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_40ecf4();
+  prevent_dce.inner = textureDimensions_40ecf4();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_40ecf4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_40ecf4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_40ecf4();
+  prevent_dce.inner = textureDimensions_40ecf4();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_40ecf4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_40ecf4();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.msl
index 0c8d982..7028cd6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_40ecf4(texture2d_array<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_40ecf4(texture2d_array<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_40ecf4(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_40ecf4(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_40ecf4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_40ecf4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_40ecf4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_40ecf4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.spvasm
index f81134c..fa1fdf6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_40ecf4 "textureDimensions_40ecf4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_40ecf4 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_40ecf4 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_40ecf4
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_40ecf4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_40ecf4
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_40ecf4
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_40ecf4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_40ecf4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.wgsl
index f53f416..a978f80 100644
--- a/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/40ecf4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16uint, write>;
 
-fn textureDimensions_40ecf4() {
+fn textureDimensions_40ecf4() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_40ecf4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_40ecf4();
+  prevent_dce = textureDimensions_40ecf4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_40ecf4();
+  prevent_dce = textureDimensions_40ecf4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_40ecf4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl
index 10b296e..cd90a0a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32uint, write>) -> vec2<u32>
-fn textureDimensions_41545f() {
+fn textureDimensions_41545f() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_41545f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_41545f();
+  prevent_dce = textureDimensions_41545f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_41545f();
+  prevent_dce = textureDimensions_41545f();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_41545f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.dxc.hlsl
index 2795e32..70788c3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_41545f() {
+uint2 textureDimensions_41545f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_41545f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_41545f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_41545f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_41545f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_41545f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_41545f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.fxc.hlsl
index 2795e32..70788c3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_41545f() {
+uint2 textureDimensions_41545f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_41545f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_41545f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_41545f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_41545f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_41545f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_41545f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.glsl
index a90346a..5fd5518 100644
--- a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp writeonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_41545f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_41545f();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_41545f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_41545f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_41545f();
+  prevent_dce.inner = textureDimensions_41545f();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_41545f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_41545f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_41545f();
+  prevent_dce.inner = textureDimensions_41545f();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_41545f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_41545f();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.msl
index f4a8ece..e9255d2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_41545f(texture2d_array<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_41545f(texture2d_array<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_41545f(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_41545f(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_41545f(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_41545f(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_41545f(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_41545f(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.spvasm
index 98e2b28..6467d2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_41545f "textureDimensions_41545f"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_41545f = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_41545f = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_41545f
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_41545f
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_41545f
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_41545f
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_41545f
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_41545f
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.wgsl
index 9fff36d..5896f00 100644
--- a/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/41545f.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32uint, write>;
 
-fn textureDimensions_41545f() {
+fn textureDimensions_41545f() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_41545f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_41545f();
+  prevent_dce = textureDimensions_41545f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_41545f();
+  prevent_dce = textureDimensions_41545f();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_41545f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl
index 1f749d8..0c1a24d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32uint, read>) -> vec3<u32>
-fn textureDimensions_423519() {
+fn textureDimensions_423519() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_423519();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_423519();
+  prevent_dce = textureDimensions_423519();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_423519();
+  prevent_dce = textureDimensions_423519();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_423519();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.dxc.hlsl
index 33f722c..30206bc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_423519() {
+uint3 textureDimensions_423519() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_423519();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_423519();
+  prevent_dce.Store3(0u, asuint(textureDimensions_423519()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_423519();
+  prevent_dce.Store3(0u, asuint(textureDimensions_423519()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_423519();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.fxc.hlsl
index 33f722c..30206bc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_423519() {
+uint3 textureDimensions_423519() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_423519();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_423519();
+  prevent_dce.Store3(0u, asuint(textureDimensions_423519()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_423519();
+  prevent_dce.Store3(0u, asuint(textureDimensions_423519()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_423519();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.glsl
index 23ca388..2e5e30b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32ui) uniform highp readonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_423519() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_423519();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_423519() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_423519() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_423519();
+  prevent_dce.inner = textureDimensions_423519();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_423519() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_423519() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_423519();
+  prevent_dce.inner = textureDimensions_423519();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_423519() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_423519();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.msl
index a28ea80..006feca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_423519(texture3d<uint, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_423519(texture3d<uint, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_423519(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_423519(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_423519(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_423519(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_423519(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_423519(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.spvasm
index f6e3194..bcd8fc8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_423519 "textureDimensions_423519"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_423519 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_423519 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_423519
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_423519
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_423519
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_423519
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_423519
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_423519
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.wgsl
index 1a20323..e866326 100644
--- a/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/423519.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32uint, read>;
 
-fn textureDimensions_423519() {
+fn textureDimensions_423519() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_423519();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_423519();
+  prevent_dce = textureDimensions_423519();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_423519();
+  prevent_dce = textureDimensions_423519();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_423519();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl
index d1d67b3..93e4dad 100644
--- a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16uint, read_write>) -> vec2<u32>
-fn textureDimensions_427f92() {
+fn textureDimensions_427f92() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_427f92();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_427f92();
+  prevent_dce = textureDimensions_427f92();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_427f92();
+  prevent_dce = textureDimensions_427f92();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_427f92();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.dxc.hlsl
index e331af7..7025b2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_427f92() {
+uint2 textureDimensions_427f92() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_427f92();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_427f92();
+  prevent_dce.Store2(0u, asuint(textureDimensions_427f92()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_427f92();
+  prevent_dce.Store2(0u, asuint(textureDimensions_427f92()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_427f92();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.fxc.hlsl
index e331af7..7025b2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_427f92() {
+uint2 textureDimensions_427f92() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_427f92();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_427f92();
+  prevent_dce.Store2(0u, asuint(textureDimensions_427f92()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_427f92();
+  prevent_dce.Store2(0u, asuint(textureDimensions_427f92()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_427f92();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.glsl
index 6bab0e0..61aff2d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_427f92() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_427f92();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_427f92() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_427f92() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_427f92();
+  prevent_dce.inner = textureDimensions_427f92();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_427f92() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_427f92() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_427f92();
+  prevent_dce.inner = textureDimensions_427f92();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_427f92() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_427f92();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.msl
index 37b2bfd..8c5290d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_427f92(texture2d_array<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_427f92(texture2d_array<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_427f92(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_427f92(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_427f92(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_427f92(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_427f92(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_427f92(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.spvasm
index 251fb79..e9993ce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_427f92 "textureDimensions_427f92"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_427f92 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_427f92 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_427f92
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_427f92
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_427f92
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_427f92
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_427f92
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_427f92
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.wgsl
index c571ce3..3196bdc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/427f92.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16uint, read_write>;
 
-fn textureDimensions_427f92() {
+fn textureDimensions_427f92() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_427f92();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_427f92();
+  prevent_dce = textureDimensions_427f92();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_427f92();
+  prevent_dce = textureDimensions_427f92();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_427f92();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl
index c4826c0..58a827b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32sint, write>) -> vec2<u32>
-fn textureDimensions_439651() {
+fn textureDimensions_439651() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_439651();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_439651();
+  prevent_dce = textureDimensions_439651();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_439651();
+  prevent_dce = textureDimensions_439651();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_439651();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.dxc.hlsl
index 59d1ae0..02f0a02 100644
--- a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_439651() {
+uint2 textureDimensions_439651() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_439651();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_439651();
+  prevent_dce.Store2(0u, asuint(textureDimensions_439651()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_439651();
+  prevent_dce.Store2(0u, asuint(textureDimensions_439651()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_439651();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.fxc.hlsl
index 59d1ae0..02f0a02 100644
--- a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_439651() {
+uint2 textureDimensions_439651() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_439651();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_439651();
+  prevent_dce.Store2(0u, asuint(textureDimensions_439651()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_439651();
+  prevent_dce.Store2(0u, asuint(textureDimensions_439651()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_439651();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.msl
index e0f663e..ff4e678 100644
--- a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_439651(texture2d<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_439651(texture2d<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_439651(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_439651(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_439651(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_439651(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_439651(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_439651(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.spvasm
index 68957a9..c11d388 100644
--- a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,74 +21,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_439651 "textureDimensions_439651"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_439651 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_439651 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_439651
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_439651
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_439651
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_439651
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_439651
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_439651
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.wgsl
index 7711de7..cb65e4a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/439651.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32sint, write>;
 
-fn textureDimensions_439651() {
+fn textureDimensions_439651() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_439651();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_439651();
+  prevent_dce = textureDimensions_439651();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_439651();
+  prevent_dce = textureDimensions_439651();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_439651();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl
index 964fe37..2ccc63e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureDimensions(texture: texture_2d_array<u32>) -> vec2<u32>
-fn textureDimensions_445376() {
+fn textureDimensions_445376() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_445376();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_445376();
+  prevent_dce = textureDimensions_445376();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_445376();
+  prevent_dce = textureDimensions_445376();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_445376();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.dxc.hlsl
index e0f80bf..d7cd926 100644
--- a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_445376() {
+uint2 textureDimensions_445376() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_445376();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_445376();
+  prevent_dce.Store2(0u, asuint(textureDimensions_445376()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_445376();
+  prevent_dce.Store2(0u, asuint(textureDimensions_445376()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_445376();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.fxc.hlsl
index e0f80bf..d7cd926 100644
--- a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_445376() {
+uint2 textureDimensions_445376() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_445376();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_445376();
+  prevent_dce.Store2(0u, asuint(textureDimensions_445376()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_445376();
+  prevent_dce.Store2(0u, asuint(textureDimensions_445376()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_445376();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.glsl
index 9302940..888383d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp usampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_445376() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_445376();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_445376() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_445376() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_445376();
+  prevent_dce.inner = textureDimensions_445376();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_445376() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_445376() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_445376();
+  prevent_dce.inner = textureDimensions_445376();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_445376() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_445376();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.msl
index 959df4d..91d9ae2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_445376(texture2d_array<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_445376(texture2d_array<uint, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_445376(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_445376(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_445376(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_445376(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_445376(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_445376(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.spvasm
index 2b24cf5..3fe653f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_445376 "textureDimensions_445376"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_445376 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v3uint %24 %int_0
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_445376 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v3uint %26 %int_0
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_445376
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_445376
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_445376
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_445376
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_445376
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_445376
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.wgsl
index f26606e..bc19315 100644
--- a/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/445376.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
-fn textureDimensions_445376() {
+fn textureDimensions_445376() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_445376();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_445376();
+  prevent_dce = textureDimensions_445376();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_445376();
+  prevent_dce = textureDimensions_445376();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_445376();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl
index 5b8b776..ade9410 100644
--- a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32uint, write>) -> vec3<u32>
-fn textureDimensions_44b358() {
+fn textureDimensions_44b358() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_44b358();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_44b358();
+  prevent_dce = textureDimensions_44b358();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_44b358();
+  prevent_dce = textureDimensions_44b358();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_44b358();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.dxc.hlsl
index ca67752..1554ce8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_44b358() {
+uint3 textureDimensions_44b358() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_44b358();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_44b358();
+  prevent_dce.Store3(0u, asuint(textureDimensions_44b358()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_44b358();
+  prevent_dce.Store3(0u, asuint(textureDimensions_44b358()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_44b358();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.fxc.hlsl
index ca67752..1554ce8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_44b358() {
+uint3 textureDimensions_44b358() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_44b358();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_44b358();
+  prevent_dce.Store3(0u, asuint(textureDimensions_44b358()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_44b358();
+  prevent_dce.Store3(0u, asuint(textureDimensions_44b358()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_44b358();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.glsl
index 353f0f5..d4226d8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_44b358() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_44b358();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_44b358() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_44b358() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_44b358();
+  prevent_dce.inner = textureDimensions_44b358();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_44b358() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_44b358() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_44b358();
+  prevent_dce.inner = textureDimensions_44b358();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_44b358() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_44b358();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.msl
index ea4c716..4561316 100644
--- a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_44b358(texture3d<uint, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_44b358(texture3d<uint, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_44b358(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_44b358(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_44b358(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_44b358(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_44b358(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_44b358(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.spvasm
index 0f50a8e..fa85a56 100644
--- a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_44b358 "textureDimensions_44b358"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_44b358 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_44b358 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_44b358
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_44b358
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_44b358
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_44b358
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_44b358
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_44b358
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.wgsl
index 1e9d5da..2f1476c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/44b358.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32uint, write>;
 
-fn textureDimensions_44b358() {
+fn textureDimensions_44b358() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_44b358();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_44b358();
+  prevent_dce = textureDimensions_44b358();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_44b358();
+  prevent_dce = textureDimensions_44b358();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_44b358();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl
index db9f7ec..1c81769 100644
--- a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32uint, write>) -> vec2<u32>
-fn textureDimensions_452fc1() {
+fn textureDimensions_452fc1() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_452fc1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_452fc1();
+  prevent_dce = textureDimensions_452fc1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_452fc1();
+  prevent_dce = textureDimensions_452fc1();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_452fc1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.dxc.hlsl
index e91ca0b..1ee752a5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_452fc1() {
+uint2 textureDimensions_452fc1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_452fc1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_452fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_452fc1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_452fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_452fc1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_452fc1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.fxc.hlsl
index e91ca0b..1ee752a5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_452fc1() {
+uint2 textureDimensions_452fc1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_452fc1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_452fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_452fc1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_452fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_452fc1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_452fc1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.glsl
index 78f2119..161b50c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_452fc1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_452fc1();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_452fc1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_452fc1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_452fc1();
+  prevent_dce.inner = textureDimensions_452fc1();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_452fc1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_452fc1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_452fc1();
+  prevent_dce.inner = textureDimensions_452fc1();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_452fc1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_452fc1();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.msl
index 5497059..209976a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_452fc1(texture2d_array<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_452fc1(texture2d_array<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_452fc1(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_452fc1(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_452fc1(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_452fc1(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_452fc1(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_452fc1(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.spvasm
index 9f35db0..7bd0107 100644
--- a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_452fc1 "textureDimensions_452fc1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_452fc1 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_452fc1 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_452fc1
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_452fc1
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_452fc1
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_452fc1
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_452fc1
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_452fc1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.wgsl
index a110af1..7927f34 100644
--- a/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/452fc1.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32uint, write>;
 
-fn textureDimensions_452fc1() {
+fn textureDimensions_452fc1() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_452fc1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_452fc1();
+  prevent_dce = textureDimensions_452fc1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_452fc1();
+  prevent_dce = textureDimensions_452fc1();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_452fc1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl
index 7aa595d..2e7cc17 100644
--- a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureDimensions(texture: texture_2d_array<f32>) -> vec2<u32>
-fn textureDimensions_46f0fc() {
+fn textureDimensions_46f0fc() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_46f0fc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_46f0fc();
+  prevent_dce = textureDimensions_46f0fc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_46f0fc();
+  prevent_dce = textureDimensions_46f0fc();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_46f0fc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.dxc.hlsl
index 243ca3c..474b153 100644
--- a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_46f0fc() {
+uint2 textureDimensions_46f0fc() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_46f0fc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_46f0fc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_46f0fc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_46f0fc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_46f0fc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_46f0fc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.fxc.hlsl
index 243ca3c..474b153 100644
--- a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_46f0fc() {
+uint2 textureDimensions_46f0fc() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_46f0fc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_46f0fc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_46f0fc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_46f0fc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_46f0fc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_46f0fc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.glsl
index 312eda4..12fa9fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_46f0fc() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_46f0fc();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_46f0fc() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_46f0fc() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_46f0fc();
+  prevent_dce.inner = textureDimensions_46f0fc();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_46f0fc() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_46f0fc() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_46f0fc();
+  prevent_dce.inner = textureDimensions_46f0fc();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_46f0fc() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_46f0fc();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.msl
index 30095ed..4ceea09 100644
--- a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_46f0fc(texture2d_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_46f0fc(texture2d_array<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_46f0fc(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_46f0fc(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_46f0fc(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_46f0fc(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_46f0fc(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_46f0fc(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.spvasm
index d57b8aa..ea0d0ae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_46f0fc "textureDimensions_46f0fc"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_46f0fc = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v3uint %24 %int_0
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_46f0fc = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v3uint %26 %int_0
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_46f0fc
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_46f0fc
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_46f0fc
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_46f0fc
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_46f0fc
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_46f0fc
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.wgsl
index 2339095..223b755 100644
--- a/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/46f0fc.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-fn textureDimensions_46f0fc() {
+fn textureDimensions_46f0fc() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_46f0fc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_46f0fc();
+  prevent_dce = textureDimensions_46f0fc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_46f0fc();
+  prevent_dce = textureDimensions_46f0fc();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_46f0fc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl
index 25b8eb0..a94111d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8sint, read>) -> vec2<u32>
-fn textureDimensions_4716a4() {
+fn textureDimensions_4716a4() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4716a4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4716a4();
+  prevent_dce = textureDimensions_4716a4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4716a4();
+  prevent_dce = textureDimensions_4716a4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4716a4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.dxc.hlsl
index 6c4d88f..70cd007 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4716a4() {
+uint2 textureDimensions_4716a4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4716a4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4716a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4716a4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4716a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4716a4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4716a4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.fxc.hlsl
index 6c4d88f..70cd007 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4716a4() {
+uint2 textureDimensions_4716a4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4716a4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4716a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4716a4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4716a4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4716a4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4716a4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.glsl
index d58c309..2225337 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp readonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_4716a4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_4716a4();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_4716a4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_4716a4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_4716a4();
+  prevent_dce.inner = textureDimensions_4716a4();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_4716a4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_4716a4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_4716a4();
+  prevent_dce.inner = textureDimensions_4716a4();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_4716a4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_4716a4();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.msl
index 0a98d5e..536840e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4716a4(texture2d_array<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_4716a4(texture2d_array<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_4716a4(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_4716a4(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_4716a4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4716a4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4716a4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4716a4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.spvasm
index 1a98972..cdff3ea 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4716a4 "textureDimensions_4716a4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4716a4 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_4716a4 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_4716a4
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_4716a4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_4716a4
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_4716a4
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_4716a4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_4716a4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.wgsl
index f73cf6c..5401350 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4716a4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8sint, read>;
 
-fn textureDimensions_4716a4() {
+fn textureDimensions_4716a4() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4716a4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4716a4();
+  prevent_dce = textureDimensions_4716a4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4716a4();
+  prevent_dce = textureDimensions_4716a4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4716a4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl
index 6bad687..da07b93 100644
--- a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8uint, read>) -> vec3<u32>
-fn textureDimensions_475c10() {
+fn textureDimensions_475c10() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_475c10();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_475c10();
+  prevent_dce = textureDimensions_475c10();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_475c10();
+  prevent_dce = textureDimensions_475c10();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_475c10();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.dxc.hlsl
index ee5ff54..027d6e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_475c10() {
+uint3 textureDimensions_475c10() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_475c10();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_475c10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_475c10()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_475c10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_475c10()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_475c10();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.fxc.hlsl
index ee5ff54..027d6e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_475c10() {
+uint3 textureDimensions_475c10() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_475c10();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_475c10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_475c10()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_475c10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_475c10()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_475c10();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.glsl
index 2e72f7d..16718d4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp readonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_475c10() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_475c10();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_475c10() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_475c10() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_475c10();
+  prevent_dce.inner = textureDimensions_475c10();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_475c10() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_475c10() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_475c10();
+  prevent_dce.inner = textureDimensions_475c10();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_475c10() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_475c10();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.msl
index 7a31e1f..99024ac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_475c10(texture3d<uint, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_475c10(texture3d<uint, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_475c10(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_475c10(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_475c10(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_475c10(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_475c10(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_475c10(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.spvasm
index 2f43f51..b683a9b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_475c10 "textureDimensions_475c10"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_475c10 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_475c10 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_475c10
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_475c10
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_475c10
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_475c10
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_475c10
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_475c10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.wgsl
index c8bb475..54e8ff8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/475c10.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8uint, read>;
 
-fn textureDimensions_475c10() {
+fn textureDimensions_475c10() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_475c10();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_475c10();
+  prevent_dce = textureDimensions_475c10();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_475c10();
+  prevent_dce = textureDimensions_475c10();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_475c10();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl
index 36c9110..bb1fd65 100644
--- a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube<f32>;
 
 // fn textureDimensions(texture: texture_cube<f32>, level: i32) -> vec2<u32>
-fn textureDimensions_49a067() {
+fn textureDimensions_49a067() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_49a067();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_49a067();
+  prevent_dce = textureDimensions_49a067();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_49a067();
+  prevent_dce = textureDimensions_49a067();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_49a067();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.dxc.hlsl
index eb1dfc3..72b13f8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_49a067() {
+uint2 textureDimensions_49a067() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_49a067();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_49a067();
+  prevent_dce.Store2(0u, asuint(textureDimensions_49a067()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_49a067();
+  prevent_dce.Store2(0u, asuint(textureDimensions_49a067()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_49a067();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.fxc.hlsl
index eb1dfc3..72b13f8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_49a067() {
+uint2 textureDimensions_49a067() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_49a067();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_49a067();
+  prevent_dce.Store2(0u, asuint(textureDimensions_49a067()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_49a067();
+  prevent_dce.Store2(0u, asuint(textureDimensions_49a067()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_49a067();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.glsl
index 9490b68..14db5e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp samplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_49a067() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_49a067();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_49a067() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_49a067() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_49a067();
+  prevent_dce.inner = textureDimensions_49a067();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_49a067() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_49a067() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_49a067();
+  prevent_dce.inner = textureDimensions_49a067();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_49a067() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_49a067();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.msl
index 08359d8..7111eae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_49a067(texturecube<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_49a067(texturecube<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_49a067(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_49a067(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_49a067(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_49a067(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_49a067(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_49a067(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.spvasm
index f8cf3e4..e5b8406 100644
--- a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_49a067 "textureDimensions_49a067"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_49a067 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_49a067 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_49a067
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_49a067
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_49a067
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_49a067
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_49a067
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_49a067
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.wgsl
index d91f7f4..7daf64e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/49a067.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
-fn textureDimensions_49a067() {
+fn textureDimensions_49a067() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_49a067();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_49a067();
+  prevent_dce = textureDimensions_49a067();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_49a067();
+  prevent_dce = textureDimensions_49a067();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_49a067();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl
index 5e4e12f..026bfa8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32float, write>) -> vec2<u32>
-fn textureDimensions_4acec7() {
+fn textureDimensions_4acec7() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4acec7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4acec7();
+  prevent_dce = textureDimensions_4acec7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4acec7();
+  prevent_dce = textureDimensions_4acec7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4acec7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.dxc.hlsl
index 35c91c8..4214b5e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4acec7() {
+uint2 textureDimensions_4acec7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4acec7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4acec7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4acec7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4acec7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4acec7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4acec7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.fxc.hlsl
index 35c91c8..4214b5e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4acec7() {
+uint2 textureDimensions_4acec7() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4acec7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4acec7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4acec7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4acec7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4acec7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4acec7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.msl
index 04b59fd..22df118 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4acec7(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_4acec7(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_4acec7(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_4acec7(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_4acec7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4acec7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4acec7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4acec7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.spvasm
index 8b93b99..133d740 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,75 +21,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4acec7 "textureDimensions_4acec7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4acec7 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_4acec7 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_4acec7
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_4acec7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_4acec7
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_4acec7
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_4acec7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_4acec7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.wgsl
index 1df8546..d861528 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4acec7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32float, write>;
 
-fn textureDimensions_4acec7() {
+fn textureDimensions_4acec7() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4acec7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4acec7();
+  prevent_dce = textureDimensions_4acec7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4acec7();
+  prevent_dce = textureDimensions_4acec7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4acec7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl
index 4d76eeb..d7b47e2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8unorm, write>) -> vec3<u32>
-fn textureDimensions_4b26ef() {
+fn textureDimensions_4b26ef() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4b26ef();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4b26ef();
+  prevent_dce = textureDimensions_4b26ef();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4b26ef();
+  prevent_dce = textureDimensions_4b26ef();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4b26ef();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.dxc.hlsl
index 2c3f265..2616344 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4b26ef() {
+uint3 textureDimensions_4b26ef() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4b26ef();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4b26ef();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4b26ef()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4b26ef();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4b26ef()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4b26ef();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.fxc.hlsl
index 2c3f265..2616344 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4b26ef() {
+uint3 textureDimensions_4b26ef() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4b26ef();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4b26ef();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4b26ef()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4b26ef();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4b26ef()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4b26ef();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.glsl
index f7ddb61..8151cfc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_4b26ef() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_4b26ef();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_4b26ef() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_4b26ef() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_4b26ef();
+  prevent_dce.inner = textureDimensions_4b26ef();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_4b26ef() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_4b26ef() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_4b26ef();
+  prevent_dce.inner = textureDimensions_4b26ef();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_4b26ef() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_4b26ef();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.msl
index d7ba783..ffd1e13 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4b26ef(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_4b26ef(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_4b26ef(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_4b26ef(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_4b26ef(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4b26ef(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4b26ef(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4b26ef(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.spvasm
index 849045a..2044be2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4b26ef "textureDimensions_4b26ef"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4b26ef = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_4b26ef = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_4b26ef
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_4b26ef
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_4b26ef
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_4b26ef
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_4b26ef
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_4b26ef
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.wgsl
index edcea5d..deff631 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4b26ef.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8unorm, write>;
 
-fn textureDimensions_4b26ef() {
+fn textureDimensions_4b26ef() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4b26ef();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4b26ef();
+  prevent_dce = textureDimensions_4b26ef();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4b26ef();
+  prevent_dce = textureDimensions_4b26ef();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4b26ef();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl
index 4672325..1ffd4d7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_2d<u32>;
 
 // fn textureDimensions(texture: texture_2d<u32>) -> vec2<u32>
-fn textureDimensions_4be71b() {
+fn textureDimensions_4be71b() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4be71b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4be71b();
+  prevent_dce = textureDimensions_4be71b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4be71b();
+  prevent_dce = textureDimensions_4be71b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4be71b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.dxc.hlsl
index ce5b12b..646604a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4be71b() {
+uint2 textureDimensions_4be71b() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4be71b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4be71b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4be71b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4be71b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4be71b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4be71b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.fxc.hlsl
index ce5b12b..646604a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4be71b() {
+uint2 textureDimensions_4be71b() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4be71b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4be71b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4be71b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4be71b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4be71b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4be71b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.glsl
index b005654..c1f962a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp usampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_4be71b() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_4be71b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_4be71b() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_4be71b() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_4be71b();
+  prevent_dce.inner = textureDimensions_4be71b();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_4be71b() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_4be71b() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_4be71b();
+  prevent_dce.inner = textureDimensions_4be71b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_4be71b() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_4be71b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.msl
index 96a9ea1..6002508 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4be71b(texture2d<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_4be71b(texture2d<uint, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_4be71b(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_4be71b(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_4be71b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4be71b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4be71b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4be71b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.spvasm
index dbfc315..dde943c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4be71b "textureDimensions_4be71b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4be71b = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v2uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_4be71b = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v2uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_4be71b
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_4be71b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_4be71b
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_4be71b
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_4be71b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_4be71b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.wgsl
index 8782231..eff8954 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4be71b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_2d<u32>;
 
-fn textureDimensions_4be71b() {
+fn textureDimensions_4be71b() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4be71b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4be71b();
+  prevent_dce = textureDimensions_4be71b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4be71b();
+  prevent_dce = textureDimensions_4be71b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4be71b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl
index 64c54fe..8e7aea4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32uint, read>) -> vec2<u32>
-fn textureDimensions_4d1f71() {
+fn textureDimensions_4d1f71() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4d1f71();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4d1f71();
+  prevent_dce = textureDimensions_4d1f71();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4d1f71();
+  prevent_dce = textureDimensions_4d1f71();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4d1f71();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.dxc.hlsl
index f761810..06b23e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4d1f71() {
+uint2 textureDimensions_4d1f71() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4d1f71();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4d1f71();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4d1f71()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4d1f71();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4d1f71()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4d1f71();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.fxc.hlsl
index f761810..06b23e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4d1f71() {
+uint2 textureDimensions_4d1f71() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4d1f71();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4d1f71();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4d1f71()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4d1f71();
+  prevent_dce.Store2(0u, asuint(textureDimensions_4d1f71()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4d1f71();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.msl
index 1435bac..56d21d0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4d1f71(texture2d_array<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_4d1f71(texture2d_array<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_4d1f71(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_4d1f71(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_4d1f71(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4d1f71(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4d1f71(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4d1f71(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.spvasm
index f50210f..d4c58c7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,75 +21,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4d1f71 "textureDimensions_4d1f71"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4d1f71 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_4d1f71 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_4d1f71
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_4d1f71
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_4d1f71
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_4d1f71
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_4d1f71
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_4d1f71
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.wgsl
index 7ebe9d9..f108089 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d1f71.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32uint, read>;
 
-fn textureDimensions_4d1f71() {
+fn textureDimensions_4d1f71() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4d1f71();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4d1f71();
+  prevent_dce = textureDimensions_4d1f71();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4d1f71();
+  prevent_dce = textureDimensions_4d1f71();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4d1f71();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl
index b61bec8..35ba76c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32sint, read_write>) -> vec3<u32>
-fn textureDimensions_4d27b3() {
+fn textureDimensions_4d27b3() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4d27b3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4d27b3();
+  prevent_dce = textureDimensions_4d27b3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4d27b3();
+  prevent_dce = textureDimensions_4d27b3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4d27b3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.dxc.hlsl
index a972f32..4c85d86 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4d27b3() {
+uint3 textureDimensions_4d27b3() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4d27b3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4d27b3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4d27b3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4d27b3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4d27b3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4d27b3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.fxc.hlsl
index a972f32..4c85d86 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4d27b3() {
+uint3 textureDimensions_4d27b3() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4d27b3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4d27b3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4d27b3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4d27b3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4d27b3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4d27b3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.glsl
index c2cdce2..339f679 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32i) uniform highp iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_4d27b3() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_4d27b3();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp iimage3D arg_0;
+uvec3 textureDimensions_4d27b3() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_4d27b3() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_4d27b3();
+  prevent_dce.inner = textureDimensions_4d27b3();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32i) uniform highp iimage3D arg_0;
+uvec3 textureDimensions_4d27b3() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_4d27b3() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_4d27b3();
+  prevent_dce.inner = textureDimensions_4d27b3();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32i) uniform highp iimage3D arg_0;
+uvec3 textureDimensions_4d27b3() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_4d27b3();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.msl
index 063848f..2f8f47a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4d27b3(texture3d<int, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_4d27b3(texture3d<int, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_4d27b3(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_4d27b3(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_4d27b3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4d27b3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4d27b3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4d27b3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.spvasm
index 74d6c63..87f507c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4d27b3 "textureDimensions_4d27b3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4d27b3 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_4d27b3 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_4d27b3
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_4d27b3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_4d27b3
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_4d27b3
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_4d27b3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_4d27b3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.wgsl
index d85c7c5..0cb11b8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4d27b3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32sint, read_write>;
 
-fn textureDimensions_4d27b3() {
+fn textureDimensions_4d27b3() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4d27b3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4d27b3();
+  prevent_dce = textureDimensions_4d27b3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4d27b3();
+  prevent_dce = textureDimensions_4d27b3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4d27b3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl
index 9dcdfb3..103b4db 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32uint, read_write>) -> vec3<u32>
-fn textureDimensions_4df14c() {
+fn textureDimensions_4df14c() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4df14c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4df14c();
+  prevent_dce = textureDimensions_4df14c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4df14c();
+  prevent_dce = textureDimensions_4df14c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4df14c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.dxc.hlsl
index 423213a..89d85bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4df14c() {
+uint3 textureDimensions_4df14c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4df14c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4df14c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4df14c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4df14c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4df14c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4df14c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.fxc.hlsl
index 423213a..89d85bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4df14c() {
+uint3 textureDimensions_4df14c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4df14c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4df14c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4df14c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4df14c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_4df14c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4df14c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.msl
index 91ca234..faaf826 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4df14c(texture3d<uint, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_4df14c(texture3d<uint, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_4df14c(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_4df14c(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_4df14c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4df14c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4df14c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4df14c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.spvasm
index 4b3baf3..505d465 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4df14c "textureDimensions_4df14c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4df14c = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_4df14c = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_4df14c
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_4df14c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_4df14c
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_4df14c
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_4df14c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_4df14c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.wgsl
index 410a6d0..0b9b4ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4df14c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32uint, read_write>;
 
-fn textureDimensions_4df14c() {
+fn textureDimensions_4df14c() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4df14c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4df14c();
+  prevent_dce = textureDimensions_4df14c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4df14c();
+  prevent_dce = textureDimensions_4df14c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4df14c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl
index 3175a30..ce2ef12 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32sint, read_write>) -> u32
-fn textureDimensions_4e540a() {
+fn textureDimensions_4e540a() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4e540a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4e540a();
+  prevent_dce = textureDimensions_4e540a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4e540a();
+  prevent_dce = textureDimensions_4e540a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4e540a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.dxc.hlsl
index d1db1ad..3706280 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4e540a() {
+uint textureDimensions_4e540a() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4e540a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4e540a();
+  prevent_dce.Store(0u, asuint(textureDimensions_4e540a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4e540a();
+  prevent_dce.Store(0u, asuint(textureDimensions_4e540a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4e540a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.fxc.hlsl
index d1db1ad..3706280 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_4e540a() {
+uint textureDimensions_4e540a() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_4e540a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_4e540a();
+  prevent_dce.Store(0u, asuint(textureDimensions_4e540a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_4e540a();
+  prevent_dce.Store(0u, asuint(textureDimensions_4e540a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_4e540a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.glsl
index 0b996e1..e79ee6f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_4e540a() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_4e540a();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp iimage2D arg_0;
+uint textureDimensions_4e540a() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_4e540a() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_4e540a();
+  prevent_dce.inner = textureDimensions_4e540a();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp iimage2D arg_0;
+uint textureDimensions_4e540a() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_4e540a() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_4e540a();
+  prevent_dce.inner = textureDimensions_4e540a();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32i) uniform highp iimage2D arg_0;
+uint textureDimensions_4e540a() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_4e540a();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.msl
index 336d3fc..e924de4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_4e540a(texture1d<int, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_4e540a(texture1d<int, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_4e540a(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_4e540a(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_4e540a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_4e540a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_4e540a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_4e540a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.spvasm
index 173b1c1..036ca90 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_4e540a "textureDimensions_4e540a"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 R32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_4e540a = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_4e540a = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_4e540a
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_4e540a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_4e540a
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_4e540a
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_4e540a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_4e540a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.wgsl
index 7a24ea6..fae0598 100644
--- a/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/4e540a.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32sint, read_write>;
 
-fn textureDimensions_4e540a() {
+fn textureDimensions_4e540a() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4e540a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_4e540a();
+  prevent_dce = textureDimensions_4e540a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_4e540a();
+  prevent_dce = textureDimensions_4e540a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_4e540a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl
index bb46775..c4aa7ee 100644
--- a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureDimensions(texture: texture_2d_array<u32>, level: u32) -> vec2<u32>
-fn textureDimensions_528c0e() {
+fn textureDimensions_528c0e() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_528c0e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_528c0e();
+  prevent_dce = textureDimensions_528c0e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_528c0e();
+  prevent_dce = textureDimensions_528c0e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_528c0e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.dxc.hlsl
index 3dd90fe..8aa6ee1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_528c0e() {
+uint2 textureDimensions_528c0e() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_528c0e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_528c0e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_528c0e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_528c0e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_528c0e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_528c0e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.fxc.hlsl
index 3dd90fe..8aa6ee1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_528c0e() {
+uint2 textureDimensions_528c0e() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_528c0e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_528c0e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_528c0e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_528c0e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_528c0e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_528c0e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.glsl
index 4d9461e..d5a5917 100644
--- a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_528c0e() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_528c0e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_528c0e() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_528c0e() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_528c0e();
+  prevent_dce.inner = textureDimensions_528c0e();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_528c0e() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_528c0e() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_528c0e();
+  prevent_dce.inner = textureDimensions_528c0e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_528c0e() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_528c0e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.msl
index 6abd565..21a730a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_528c0e(texture2d_array<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_528c0e(texture2d_array<uint, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_528c0e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_528c0e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_528c0e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_528c0e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_528c0e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_528c0e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.spvasm
index 26a7efd..7546a25 100644
--- a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 51
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,80 +21,106 @@
                OpName %textureDimensions_528c0e "textureDimensions_528c0e"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %32 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %37 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %47 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %53 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_528c0e = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %32
+%textureDimensions_528c0e = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %28 = OpLoad %11 %arg_0
-         %29 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %28 %29
-         %25 = OpVectorShuffle %v2uint %26 %26 0 1
-               OpStore %res %25
-         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %36 = OpLoad %v2uint %res
-               OpStore %35 %36
+         %30 = OpLoad %16 %arg_0
+         %31 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %30 %31
+         %27 = OpVectorShuffle %v2uint %28 %28 0 1
+               OpStore %res %27
+         %34 = OpLoad %v2uint %res
+               OpReturnValue %34
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %35
+         %38 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_528c0e
+               OpStore %41 %42
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %37
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_528c0e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %35
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %46 = OpFunctionCall %v2uint %textureDimensions_528c0e
+               OpStore %45 %46
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %43
+%vertex_main_inner = OpFunction %VertexOutput None %47
+         %50 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %53
+         %55 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %55 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_528c0e
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %35
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_528c0e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %49 = OpLabel
-         %50 = OpFunctionCall %void %textureDimensions_528c0e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.wgsl
index 4ee81ff..77f8142 100644
--- a/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/528c0e.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
-fn textureDimensions_528c0e() {
+fn textureDimensions_528c0e() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_528c0e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_528c0e();
+  prevent_dce = textureDimensions_528c0e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_528c0e();
+  prevent_dce = textureDimensions_528c0e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_528c0e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl
index 3d3af17..18d151c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32float, read>) -> vec2<u32>
-fn textureDimensions_52cf60() {
+fn textureDimensions_52cf60() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_52cf60();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_52cf60();
+  prevent_dce = textureDimensions_52cf60();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_52cf60();
+  prevent_dce = textureDimensions_52cf60();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_52cf60();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.dxc.hlsl
index 287ab49..6c9bcd1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_52cf60() {
+uint2 textureDimensions_52cf60() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_52cf60();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_52cf60();
+  prevent_dce.Store2(0u, asuint(textureDimensions_52cf60()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_52cf60();
+  prevent_dce.Store2(0u, asuint(textureDimensions_52cf60()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_52cf60();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.fxc.hlsl
index 287ab49..6c9bcd1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_52cf60() {
+uint2 textureDimensions_52cf60() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_52cf60();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_52cf60();
+  prevent_dce.Store2(0u, asuint(textureDimensions_52cf60()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_52cf60();
+  prevent_dce.Store2(0u, asuint(textureDimensions_52cf60()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_52cf60();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.msl
index 51f8561..199d347 100644
--- a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_52cf60(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_52cf60(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_52cf60(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_52cf60(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_52cf60(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_52cf60(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_52cf60(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_52cf60(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.spvasm
index 2b767b0..37b12d3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_52cf60 "textureDimensions_52cf60"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_52cf60 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_52cf60 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_52cf60
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_52cf60
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_52cf60
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_52cf60
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_52cf60
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_52cf60
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.wgsl
index 4801163..f52f6f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/52cf60.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32float, read>;
 
-fn textureDimensions_52cf60() {
+fn textureDimensions_52cf60() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_52cf60();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_52cf60();
+  prevent_dce = textureDimensions_52cf60();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_52cf60();
+  prevent_dce = textureDimensions_52cf60();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_52cf60();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl
index e31153b..f6356b2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8sint, read>) -> vec2<u32>
-fn textureDimensions_534ef8() {
+fn textureDimensions_534ef8() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_534ef8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_534ef8();
+  prevent_dce = textureDimensions_534ef8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_534ef8();
+  prevent_dce = textureDimensions_534ef8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_534ef8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.dxc.hlsl
index 0e8dc34..fbdaf14 100644
--- a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_534ef8() {
+uint2 textureDimensions_534ef8() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_534ef8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_534ef8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_534ef8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_534ef8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_534ef8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_534ef8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.fxc.hlsl
index 0e8dc34..fbdaf14 100644
--- a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_534ef8() {
+uint2 textureDimensions_534ef8() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_534ef8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_534ef8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_534ef8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_534ef8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_534ef8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_534ef8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.glsl
index fb3465d..8aad6f8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_534ef8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_534ef8();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_534ef8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_534ef8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_534ef8();
+  prevent_dce.inner = textureDimensions_534ef8();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_534ef8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_534ef8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_534ef8();
+  prevent_dce.inner = textureDimensions_534ef8();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_534ef8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_534ef8();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.msl
index 13796d6..f72d92a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_534ef8(texture2d<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_534ef8(texture2d<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_534ef8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_534ef8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_534ef8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_534ef8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_534ef8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_534ef8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.spvasm
index 8c1e536..3b90040 100644
--- a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_534ef8 "textureDimensions_534ef8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_534ef8 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_534ef8 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_534ef8
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_534ef8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_534ef8
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_534ef8
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_534ef8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_534ef8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.wgsl
index 0a8a385..e4ea83c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/534ef8.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8sint, read>;
 
-fn textureDimensions_534ef8() {
+fn textureDimensions_534ef8() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_534ef8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_534ef8();
+  prevent_dce = textureDimensions_534ef8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_534ef8();
+  prevent_dce = textureDimensions_534ef8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_534ef8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl
index 83438e3..a8f6aff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r8unorm, write>) -> u32
-fn textureDimensions_542c62() {
+fn textureDimensions_542c62() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_542c62();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_542c62();
+  prevent_dce = textureDimensions_542c62();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_542c62();
+  prevent_dce = textureDimensions_542c62();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_542c62();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.dxc.hlsl
index 162de9b..f235ef2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_542c62() {
+uint textureDimensions_542c62() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_542c62();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_542c62();
+  prevent_dce.Store(0u, asuint(textureDimensions_542c62()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_542c62();
+  prevent_dce.Store(0u, asuint(textureDimensions_542c62()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_542c62();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.fxc.hlsl
index 162de9b..f235ef2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_542c62() {
+uint textureDimensions_542c62() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_542c62();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_542c62();
+  prevent_dce.Store(0u, asuint(textureDimensions_542c62()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_542c62();
+  prevent_dce.Store(0u, asuint(textureDimensions_542c62()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_542c62();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.msl
index c21ad73..dcd435b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_542c62(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_542c62(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_542c62(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_542c62(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_542c62(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_542c62(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_542c62(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_542c62(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.spvasm
index 3b62495..bc81cf7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,72 +22,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_542c62 "textureDimensions_542c62"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 R8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_542c62 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_542c62 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_542c62
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_542c62
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_542c62
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_542c62
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_542c62
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_542c62
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.wgsl
index bd3741d..15e4653 100644
--- a/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/542c62.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r8unorm, write>;
 
-fn textureDimensions_542c62() {
+fn textureDimensions_542c62() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_542c62();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_542c62();
+  prevent_dce = textureDimensions_542c62();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_542c62();
+  prevent_dce = textureDimensions_542c62();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_542c62();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl
index d6616a8..8b04658 100644
--- a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<bgra8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<bgra8unorm, read_write>) -> vec2<u32>
-fn textureDimensions_55fdeb() {
+fn textureDimensions_55fdeb() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_55fdeb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_55fdeb();
+  prevent_dce = textureDimensions_55fdeb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_55fdeb();
+  prevent_dce = textureDimensions_55fdeb();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_55fdeb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.dxc.hlsl
index 86ce786..c054967 100644
--- a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_55fdeb() {
+uint2 textureDimensions_55fdeb() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_55fdeb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_55fdeb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_55fdeb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_55fdeb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_55fdeb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_55fdeb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.fxc.hlsl
index 86ce786..c054967 100644
--- a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_55fdeb() {
+uint2 textureDimensions_55fdeb() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_55fdeb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_55fdeb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_55fdeb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_55fdeb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_55fdeb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_55fdeb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.glsl
index 0992bd7..d289876 100644
--- a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_55fdeb() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_55fdeb();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_55fdeb() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_55fdeb() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_55fdeb();
+  prevent_dce.inner = textureDimensions_55fdeb();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_55fdeb() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_55fdeb() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_55fdeb();
+  prevent_dce.inner = textureDimensions_55fdeb();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_55fdeb() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_55fdeb();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.msl
index 78e6ea1..74f8019 100644
--- a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_55fdeb(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_55fdeb(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_55fdeb(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_55fdeb(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_55fdeb(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_55fdeb(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_55fdeb(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_55fdeb(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.spvasm
index 0b40fa9..05fbc50 100644
--- a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_55fdeb "textureDimensions_55fdeb"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_55fdeb = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_55fdeb = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_55fdeb
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_55fdeb
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_55fdeb
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_55fdeb
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_55fdeb
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_55fdeb
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.wgsl
index 9e13b3c..e351c45 100644
--- a/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/55fdeb.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<bgra8unorm, read_write>;
 
-fn textureDimensions_55fdeb() {
+fn textureDimensions_55fdeb() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_55fdeb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_55fdeb();
+  prevent_dce = textureDimensions_55fdeb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_55fdeb();
+  prevent_dce = textureDimensions_55fdeb();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_55fdeb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl
index 22b543d..04ba6f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<bgra8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<bgra8unorm, read_write>) -> u32
-fn textureDimensions_5703b3() {
+fn textureDimensions_5703b3() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5703b3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_5703b3();
+  prevent_dce = textureDimensions_5703b3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_5703b3();
+  prevent_dce = textureDimensions_5703b3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_5703b3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.dxc.hlsl
index 5e0e145..e3deb39 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_5703b3() {
+uint textureDimensions_5703b3() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_5703b3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_5703b3();
+  prevent_dce.Store(0u, asuint(textureDimensions_5703b3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_5703b3();
+  prevent_dce.Store(0u, asuint(textureDimensions_5703b3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_5703b3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.fxc.hlsl
index 5e0e145..e3deb39 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_5703b3() {
+uint textureDimensions_5703b3() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_5703b3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_5703b3();
+  prevent_dce.Store(0u, asuint(textureDimensions_5703b3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_5703b3();
+  prevent_dce.Store(0u, asuint(textureDimensions_5703b3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_5703b3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.glsl
index c6fc30d..41331f9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_5703b3() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_5703b3();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_5703b3() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_5703b3() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_5703b3();
+  prevent_dce.inner = textureDimensions_5703b3();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_5703b3() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_5703b3() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_5703b3();
+  prevent_dce.inner = textureDimensions_5703b3();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_5703b3() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_5703b3();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.msl
index b9c7979..4149ce2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_5703b3(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_5703b3(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_5703b3(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_5703b3(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_5703b3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_5703b3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_5703b3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_5703b3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.spvasm
index ac15b7c..5e28743 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_5703b3 "textureDimensions_5703b3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_5703b3 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_5703b3 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_5703b3
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_5703b3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_5703b3
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_5703b3
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_5703b3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_5703b3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.wgsl
index 466ccd3..4e825e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5703b3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<bgra8unorm, read_write>;
 
-fn textureDimensions_5703b3() {
+fn textureDimensions_5703b3() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5703b3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_5703b3();
+  prevent_dce = textureDimensions_5703b3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_5703b3();
+  prevent_dce = textureDimensions_5703b3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_5703b3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl
index 50ab98d..88813a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r8unorm, read_write>) -> vec2<u32>
-fn textureDimensions_578e75() {
+fn textureDimensions_578e75() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_578e75();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_578e75();
+  prevent_dce = textureDimensions_578e75();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_578e75();
+  prevent_dce = textureDimensions_578e75();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_578e75();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.dxc.hlsl
index 81df8a2..d377d62 100644
--- a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_578e75() {
+uint2 textureDimensions_578e75() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_578e75();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_578e75();
+  prevent_dce.Store2(0u, asuint(textureDimensions_578e75()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_578e75();
+  prevent_dce.Store2(0u, asuint(textureDimensions_578e75()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_578e75();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.fxc.hlsl
index 81df8a2..d377d62 100644
--- a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_578e75() {
+uint2 textureDimensions_578e75() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_578e75();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_578e75();
+  prevent_dce.Store2(0u, asuint(textureDimensions_578e75()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_578e75();
+  prevent_dce.Store2(0u, asuint(textureDimensions_578e75()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_578e75();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.msl
index 12ac6de..4ab3134 100644
--- a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_578e75(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_578e75(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_578e75(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_578e75(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_578e75(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_578e75(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_578e75(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_578e75(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.spvasm
index 426a01e..1b37edb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,74 +21,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_578e75 "textureDimensions_578e75"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_578e75 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_578e75 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_578e75
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_578e75
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_578e75
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_578e75
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_578e75
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_578e75
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.wgsl
index f0a4f7b..eeabf1d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/578e75.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r8unorm, read_write>;
 
-fn textureDimensions_578e75() {
+fn textureDimensions_578e75() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_578e75();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_578e75();
+  prevent_dce = textureDimensions_578e75();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_578e75();
+  prevent_dce = textureDimensions_578e75();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_578e75();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl
index bfd0602..5d52b5f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32uint, read_write>) -> vec2<u32>
-fn textureDimensions_579eee() {
+fn textureDimensions_579eee() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_579eee();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_579eee();
+  prevent_dce = textureDimensions_579eee();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_579eee();
+  prevent_dce = textureDimensions_579eee();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_579eee();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.dxc.hlsl
index 5bbf8bd..36c5394 100644
--- a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_579eee() {
+uint2 textureDimensions_579eee() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_579eee();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_579eee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_579eee()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_579eee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_579eee()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_579eee();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.fxc.hlsl
index 5bbf8bd..36c5394 100644
--- a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_579eee() {
+uint2 textureDimensions_579eee() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_579eee();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_579eee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_579eee()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_579eee();
+  prevent_dce.Store2(0u, asuint(textureDimensions_579eee()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_579eee();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.glsl
index ed760f8..2bd352f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_579eee() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_579eee();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_579eee() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_579eee() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_579eee();
+  prevent_dce.inner = textureDimensions_579eee();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_579eee() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_579eee() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_579eee();
+  prevent_dce.inner = textureDimensions_579eee();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_579eee() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_579eee();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.msl
index c5cd8f7..43c7732 100644
--- a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_579eee(texture2d<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_579eee(texture2d<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_579eee(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_579eee(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_579eee(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_579eee(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_579eee(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_579eee(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.spvasm
index ff988e8..5bd3e9b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_579eee "textureDimensions_579eee"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_579eee = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_579eee = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_579eee
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_579eee
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_579eee
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_579eee
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_579eee
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_579eee
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.wgsl
index b681610..82ec6a9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/579eee.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32uint, read_write>;
 
-fn textureDimensions_579eee() {
+fn textureDimensions_579eee() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_579eee();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_579eee();
+  prevent_dce = textureDimensions_579eee();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_579eee();
+  prevent_dce = textureDimensions_579eee();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_579eee();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl
index 2aa8064..cc12ddd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16uint, write>) -> u32
-fn textureDimensions_58a82d() {
+fn textureDimensions_58a82d() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_58a82d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_58a82d();
+  prevent_dce = textureDimensions_58a82d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_58a82d();
+  prevent_dce = textureDimensions_58a82d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_58a82d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.dxc.hlsl
index 9e2bb5a..a118217 100644
--- a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_58a82d() {
+uint textureDimensions_58a82d() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_58a82d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_58a82d();
+  prevent_dce.Store(0u, asuint(textureDimensions_58a82d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_58a82d();
+  prevent_dce.Store(0u, asuint(textureDimensions_58a82d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_58a82d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.fxc.hlsl
index 9e2bb5a..a118217 100644
--- a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_58a82d() {
+uint textureDimensions_58a82d() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_58a82d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_58a82d();
+  prevent_dce.Store(0u, asuint(textureDimensions_58a82d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_58a82d();
+  prevent_dce.Store(0u, asuint(textureDimensions_58a82d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_58a82d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.glsl
index a0283a0..718680c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_58a82d() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_58a82d();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_58a82d() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_58a82d() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_58a82d();
+  prevent_dce.inner = textureDimensions_58a82d();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_58a82d() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_58a82d() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_58a82d();
+  prevent_dce.inner = textureDimensions_58a82d();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_58a82d() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_58a82d();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.msl
index 08142b4..0915b51 100644
--- a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_58a82d(texture1d<uint, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_58a82d(texture1d<uint, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_58a82d(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_58a82d(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_58a82d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_58a82d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_58a82d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_58a82d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.spvasm
index 5aa4216..6824a6b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_58a82d "textureDimensions_58a82d"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_58a82d = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_58a82d = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_58a82d
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_58a82d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_58a82d
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_58a82d
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_58a82d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_58a82d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.wgsl
index 89ffb84..fe37d2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/58a82d.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16uint, write>;
 
-fn textureDimensions_58a82d() {
+fn textureDimensions_58a82d() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_58a82d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_58a82d();
+  prevent_dce = textureDimensions_58a82d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_58a82d();
+  prevent_dce = textureDimensions_58a82d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_58a82d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl
index de66330..a1ff9a7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16sint, write>) -> vec3<u32>
-fn textureDimensions_591981() {
+fn textureDimensions_591981() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_591981();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_591981();
+  prevent_dce = textureDimensions_591981();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_591981();
+  prevent_dce = textureDimensions_591981();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_591981();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.dxc.hlsl
index 24bb012..d504f19 100644
--- a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_591981() {
+uint3 textureDimensions_591981() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_591981();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_591981();
+  prevent_dce.Store3(0u, asuint(textureDimensions_591981()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_591981();
+  prevent_dce.Store3(0u, asuint(textureDimensions_591981()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_591981();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.fxc.hlsl
index 24bb012..d504f19 100644
--- a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_591981() {
+uint3 textureDimensions_591981() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_591981();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_591981();
+  prevent_dce.Store3(0u, asuint(textureDimensions_591981()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_591981();
+  prevent_dce.Store3(0u, asuint(textureDimensions_591981()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_591981();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.glsl
index a65a790..42c73f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_591981() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_591981();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_591981() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_591981() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_591981();
+  prevent_dce.inner = textureDimensions_591981();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_591981() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_591981() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_591981();
+  prevent_dce.inner = textureDimensions_591981();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_591981() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_591981();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.msl
index ff794c9..9caf759 100644
--- a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_591981(texture3d<int, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_591981(texture3d<int, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_591981(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_591981(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_591981(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_591981(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_591981(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_591981(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.spvasm
index ad8cddc..3ff7058 100644
--- a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_591981 "textureDimensions_591981"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_591981 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_591981 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_591981
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_591981
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_591981
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_591981
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_591981
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_591981
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.wgsl
index f54d7e8..e787395 100644
--- a/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/591981.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16sint, write>;
 
-fn textureDimensions_591981() {
+fn textureDimensions_591981() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_591981();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_591981();
+  prevent_dce = textureDimensions_591981();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_591981();
+  prevent_dce = textureDimensions_591981();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_591981();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl
index cef9977..f9af455 100644
--- a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16float, write>) -> vec2<u32>
-fn textureDimensions_599ab5() {
+fn textureDimensions_599ab5() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_599ab5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_599ab5();
+  prevent_dce = textureDimensions_599ab5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_599ab5();
+  prevent_dce = textureDimensions_599ab5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_599ab5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.dxc.hlsl
index fdb4dc4..138ed9f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_599ab5() {
+uint2 textureDimensions_599ab5() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_599ab5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_599ab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_599ab5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_599ab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_599ab5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_599ab5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.fxc.hlsl
index fdb4dc4..138ed9f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_599ab5() {
+uint2 textureDimensions_599ab5() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_599ab5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_599ab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_599ab5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_599ab5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_599ab5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_599ab5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.glsl
index 126cfcb..c201763 100644
--- a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_599ab5() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_599ab5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_599ab5() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_599ab5() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_599ab5();
+  prevent_dce.inner = textureDimensions_599ab5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_599ab5() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_599ab5() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_599ab5();
+  prevent_dce.inner = textureDimensions_599ab5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_599ab5() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_599ab5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.msl
index eed79dd..c1deb6b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_599ab5(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_599ab5(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_599ab5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_599ab5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_599ab5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_599ab5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_599ab5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_599ab5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.spvasm
index dd4dfe1..87d7f72 100644
--- a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_599ab5 "textureDimensions_599ab5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_599ab5 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_599ab5 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_599ab5
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_599ab5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_599ab5
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_599ab5
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_599ab5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_599ab5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.wgsl
index ccc869b..13a4fc6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/599ab5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16float, write>;
 
-fn textureDimensions_599ab5() {
+fn textureDimensions_599ab5() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_599ab5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_599ab5();
+  prevent_dce = textureDimensions_599ab5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_599ab5();
+  prevent_dce = textureDimensions_599ab5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_599ab5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl
index e7ddc63..a5434b0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<bgra8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<bgra8unorm, write>) -> vec3<u32>
-fn textureDimensions_5b4b10() {
+fn textureDimensions_5b4b10() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5b4b10();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_5b4b10();
+  prevent_dce = textureDimensions_5b4b10();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_5b4b10();
+  prevent_dce = textureDimensions_5b4b10();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_5b4b10();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.dxc.hlsl
index 82c0db2..2ee5848 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_5b4b10() {
+uint3 textureDimensions_5b4b10() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_5b4b10();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_5b4b10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_5b4b10()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_5b4b10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_5b4b10()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_5b4b10();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.fxc.hlsl
index 82c0db2..2ee5848 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_5b4b10() {
+uint3 textureDimensions_5b4b10() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_5b4b10();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_5b4b10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_5b4b10()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_5b4b10();
+  prevent_dce.Store3(0u, asuint(textureDimensions_5b4b10()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_5b4b10();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.glsl
index 97aa18f..fdf2377 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_5b4b10() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_5b4b10();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_5b4b10() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_5b4b10() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_5b4b10();
+  prevent_dce.inner = textureDimensions_5b4b10();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_5b4b10() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_5b4b10() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_5b4b10();
+  prevent_dce.inner = textureDimensions_5b4b10();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_5b4b10() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_5b4b10();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.msl
index 3a3a59e..2b19d8f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_5b4b10(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_5b4b10(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_5b4b10(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_5b4b10(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_5b4b10(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_5b4b10(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_5b4b10(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_5b4b10(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.spvasm
index 7c7b98c..f17f678 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_5b4b10 "textureDimensions_5b4b10"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_5b4b10 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_5b4b10 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_5b4b10
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_5b4b10
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_5b4b10
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_5b4b10
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_5b4b10
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_5b4b10
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.wgsl
index afde0ac..b5db4ad 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5b4b10.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<bgra8unorm, write>;
 
-fn textureDimensions_5b4b10() {
+fn textureDimensions_5b4b10() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5b4b10();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_5b4b10();
+  prevent_dce = textureDimensions_5b4b10();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_5b4b10();
+  prevent_dce = textureDimensions_5b4b10();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_5b4b10();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl
index 9afea47..c5b9ced 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_1d<i32>;
 
 // fn textureDimensions(texture: texture_1d<i32>) -> u32
-fn textureDimensions_5df042() {
+fn textureDimensions_5df042() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5df042();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_5df042();
+  prevent_dce = textureDimensions_5df042();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_5df042();
+  prevent_dce = textureDimensions_5df042();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_5df042();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.dxc.hlsl
index fc36ad8..ff07b9d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_5df042() {
+uint textureDimensions_5df042() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_5df042();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_5df042();
+  prevent_dce.Store(0u, asuint(textureDimensions_5df042()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_5df042();
+  prevent_dce.Store(0u, asuint(textureDimensions_5df042()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_5df042();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.fxc.hlsl
index fc36ad8..ff07b9d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_5df042() {
+uint textureDimensions_5df042() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_5df042();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_5df042();
+  prevent_dce.Store(0u, asuint(textureDimensions_5df042()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_5df042();
+  prevent_dce.Store(0u, asuint(textureDimensions_5df042()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_5df042();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.glsl
index 54f087e..492b443 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp isampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_5df042() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_5df042();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2D arg_0_1;
+uint textureDimensions_5df042() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_5df042() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_5df042();
+  prevent_dce.inner = textureDimensions_5df042();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp isampler2D arg_0_1;
+uint textureDimensions_5df042() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_5df042() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_5df042();
+  prevent_dce.inner = textureDimensions_5df042();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp isampler2D arg_0_1;
+uint textureDimensions_5df042() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_5df042();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.msl
index a3deed2..cc71113 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_5df042(texture1d<int, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_5df042(texture1d<int, access::sample> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_5df042(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_5df042(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_5df042(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_5df042(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_5df042(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_5df042(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.spvasm
index 8681b78..98c0a72 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_5df042 "textureDimensions_5df042"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
       %int_0 = OpConstant %int 0
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %26 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_5df042 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %26
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %uint %22 %int_0
-               OpStore %res %21
-         %29 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %30 = OpLoad %uint %res
-               OpStore %29 %30
+%textureDimensions_5df042 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySizeLod %uint %24 %int_0
+               OpStore %res %23
+         %28 = OpLoad %uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %uint %textureDimensions_5df042
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_5df042
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %uint %textureDimensions_5df042
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %52 = OpFunctionCall %uint %textureDimensions_5df042
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_5df042
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_5df042
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.wgsl
index f71690f..4e04c2b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/5df042.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_1d<i32>;
 
-fn textureDimensions_5df042() {
+fn textureDimensions_5df042() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5df042();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_5df042();
+  prevent_dce = textureDimensions_5df042();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_5df042();
+  prevent_dce = textureDimensions_5df042();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_5df042();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl
index ac61e0b..9a7c5fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32sint, write>) -> u32
-fn textureDimensions_607979() {
+fn textureDimensions_607979() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_607979();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_607979();
+  prevent_dce = textureDimensions_607979();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_607979();
+  prevent_dce = textureDimensions_607979();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_607979();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.dxc.hlsl
index b6d74cc..e968dce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_607979() {
+uint textureDimensions_607979() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_607979();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_607979();
+  prevent_dce.Store(0u, asuint(textureDimensions_607979()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_607979();
+  prevent_dce.Store(0u, asuint(textureDimensions_607979()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_607979();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.fxc.hlsl
index b6d74cc..e968dce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_607979() {
+uint textureDimensions_607979() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_607979();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_607979();
+  prevent_dce.Store(0u, asuint(textureDimensions_607979()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_607979();
+  prevent_dce.Store(0u, asuint(textureDimensions_607979()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_607979();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.glsl
index 14a82c3..40833c3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_607979() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_607979();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_607979() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_607979() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_607979();
+  prevent_dce.inner = textureDimensions_607979();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_607979() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_607979() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_607979();
+  prevent_dce.inner = textureDimensions_607979();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_607979() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_607979();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.msl
index b0ebee4..f8c1ffc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_607979(texture1d<int, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_607979(texture1d<int, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_607979(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_607979(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_607979(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_607979(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_607979(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_607979(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.spvasm
index afb30ec..44b49a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_607979 "textureDimensions_607979"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 R32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_607979 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_607979 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_607979
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_607979
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_607979
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_607979
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_607979
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_607979
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.wgsl
index 86ad89f..b92feb1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/607979.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32sint, write>;
 
-fn textureDimensions_607979() {
+fn textureDimensions_607979() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_607979();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_607979();
+  prevent_dce = textureDimensions_607979();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_607979();
+  prevent_dce = textureDimensions_607979();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_607979();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl
index f30f4c6..2d93d90 100644
--- a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8snorm, read>) -> vec2<u32>
-fn textureDimensions_609d34() {
+fn textureDimensions_609d34() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_609d34();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_609d34();
+  prevent_dce = textureDimensions_609d34();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_609d34();
+  prevent_dce = textureDimensions_609d34();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_609d34();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.dxc.hlsl
index 4ce0ec1..343a409 100644
--- a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_609d34() {
+uint2 textureDimensions_609d34() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_609d34();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_609d34();
+  prevent_dce.Store2(0u, asuint(textureDimensions_609d34()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_609d34();
+  prevent_dce.Store2(0u, asuint(textureDimensions_609d34()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_609d34();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.fxc.hlsl
index 4ce0ec1..343a409 100644
--- a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_609d34() {
+uint2 textureDimensions_609d34() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_609d34();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_609d34();
+  prevent_dce.Store2(0u, asuint(textureDimensions_609d34()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_609d34();
+  prevent_dce.Store2(0u, asuint(textureDimensions_609d34()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_609d34();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.glsl
index 0a80baa..6a546f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp readonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_609d34() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_609d34();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_609d34() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_609d34() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_609d34();
+  prevent_dce.inner = textureDimensions_609d34();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_609d34() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_609d34() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_609d34();
+  prevent_dce.inner = textureDimensions_609d34();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8_snorm) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_609d34() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_609d34();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.msl
index a28f5c6..58ffe7f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_609d34(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_609d34(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_609d34(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_609d34(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_609d34(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_609d34(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_609d34(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_609d34(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.spvasm
index ea13ca7..ab6279f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_609d34 "textureDimensions_609d34"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_609d34 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_609d34 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_609d34
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_609d34
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_609d34
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_609d34
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_609d34
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_609d34
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.wgsl
index 34bb8f0..aa5f5d4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/609d34.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8snorm, read>;
 
-fn textureDimensions_609d34() {
+fn textureDimensions_609d34() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_609d34();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_609d34();
+  prevent_dce = textureDimensions_609d34();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_609d34();
+  prevent_dce = textureDimensions_609d34();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_609d34();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl
index 36e8038..dbf4b41 100644
--- a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32float, read_write>) -> vec3<u32>
-fn textureDimensions_617dc8() {
+fn textureDimensions_617dc8() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_617dc8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_617dc8();
+  prevent_dce = textureDimensions_617dc8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_617dc8();
+  prevent_dce = textureDimensions_617dc8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_617dc8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.dxc.hlsl
index 9162584..6f8308e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_617dc8() {
+uint3 textureDimensions_617dc8() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_617dc8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_617dc8();
+  prevent_dce.Store3(0u, asuint(textureDimensions_617dc8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_617dc8();
+  prevent_dce.Store3(0u, asuint(textureDimensions_617dc8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_617dc8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.fxc.hlsl
index 9162584..6f8308e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_617dc8() {
+uint3 textureDimensions_617dc8() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_617dc8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_617dc8();
+  prevent_dce.Store3(0u, asuint(textureDimensions_617dc8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_617dc8();
+  prevent_dce.Store3(0u, asuint(textureDimensions_617dc8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_617dc8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.glsl
index 8941810..6f1eea2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32f) uniform highp image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_617dc8() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_617dc8();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp image3D arg_0;
+uvec3 textureDimensions_617dc8() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_617dc8() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_617dc8();
+  prevent_dce.inner = textureDimensions_617dc8();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32f) uniform highp image3D arg_0;
+uvec3 textureDimensions_617dc8() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_617dc8() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_617dc8();
+  prevent_dce.inner = textureDimensions_617dc8();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32f) uniform highp image3D arg_0;
+uvec3 textureDimensions_617dc8() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_617dc8();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.msl
index e25f333..4380372 100644
--- a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_617dc8(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_617dc8(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_617dc8(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_617dc8(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_617dc8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_617dc8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_617dc8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_617dc8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.spvasm
index 6cea9c5..81701e2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_617dc8 "textureDimensions_617dc8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_617dc8 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_617dc8 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_617dc8
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_617dc8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_617dc8
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_617dc8
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_617dc8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_617dc8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.wgsl
index 8754d52..ebd801d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/617dc8.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32float, read_write>;
 
-fn textureDimensions_617dc8() {
+fn textureDimensions_617dc8() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_617dc8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_617dc8();
+  prevent_dce = textureDimensions_617dc8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_617dc8();
+  prevent_dce = textureDimensions_617dc8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_617dc8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl
index 772ab91..8db18a6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureDimensions(texture: texture_2d_array<i32>) -> vec2<u32>
-fn textureDimensions_62cb5a() {
+fn textureDimensions_62cb5a() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_62cb5a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_62cb5a();
+  prevent_dce = textureDimensions_62cb5a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_62cb5a();
+  prevent_dce = textureDimensions_62cb5a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_62cb5a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.dxc.hlsl
index 000e253..18c9d95 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_62cb5a() {
+uint2 textureDimensions_62cb5a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_62cb5a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_62cb5a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62cb5a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_62cb5a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62cb5a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_62cb5a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.fxc.hlsl
index 000e253..18c9d95 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_62cb5a() {
+uint2 textureDimensions_62cb5a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_62cb5a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_62cb5a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62cb5a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_62cb5a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62cb5a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_62cb5a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.glsl
index a557992..fb49cff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp isampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_62cb5a() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_62cb5a();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_62cb5a() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_62cb5a() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_62cb5a();
+  prevent_dce.inner = textureDimensions_62cb5a();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_62cb5a() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_62cb5a() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_62cb5a();
+  prevent_dce.inner = textureDimensions_62cb5a();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_62cb5a() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_62cb5a();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.msl
index 830f885..e3e7340 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_62cb5a(texture2d_array<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_62cb5a(texture2d_array<int, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_62cb5a(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_62cb5a(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_62cb5a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_62cb5a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_62cb5a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_62cb5a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.spvasm
index b95e531..2134dea 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_62cb5a "textureDimensions_62cb5a"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_62cb5a = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySizeLod %v3uint %25 %int_0
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_62cb5a = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySizeLod %v3uint %27 %int_0
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_62cb5a
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_62cb5a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_62cb5a
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_62cb5a
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_62cb5a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_62cb5a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.wgsl
index 8280fe3..aab6ffb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62cb5a.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
-fn textureDimensions_62cb5a() {
+fn textureDimensions_62cb5a() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_62cb5a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_62cb5a();
+  prevent_dce = textureDimensions_62cb5a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_62cb5a();
+  prevent_dce = textureDimensions_62cb5a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_62cb5a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl
index bad8523..efdae6a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8uint, read>) -> vec2<u32>
-fn textureDimensions_62e7ae() {
+fn textureDimensions_62e7ae() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_62e7ae();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_62e7ae();
+  prevent_dce = textureDimensions_62e7ae();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_62e7ae();
+  prevent_dce = textureDimensions_62e7ae();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_62e7ae();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.dxc.hlsl
index cd2626b..dc4eac2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_62e7ae() {
+uint2 textureDimensions_62e7ae() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_62e7ae();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_62e7ae();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62e7ae()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_62e7ae();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62e7ae()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_62e7ae();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.fxc.hlsl
index cd2626b..dc4eac2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_62e7ae() {
+uint2 textureDimensions_62e7ae() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_62e7ae();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_62e7ae();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62e7ae()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_62e7ae();
+  prevent_dce.Store2(0u, asuint(textureDimensions_62e7ae()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_62e7ae();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.glsl
index e30fba6..703426f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_62e7ae() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_62e7ae();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_62e7ae() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_62e7ae() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_62e7ae();
+  prevent_dce.inner = textureDimensions_62e7ae();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_62e7ae() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_62e7ae() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_62e7ae();
+  prevent_dce.inner = textureDimensions_62e7ae();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_62e7ae() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_62e7ae();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.msl
index 90e1fd0..d1a2d5b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_62e7ae(texture2d<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_62e7ae(texture2d<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_62e7ae(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_62e7ae(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_62e7ae(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_62e7ae(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_62e7ae(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_62e7ae(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.spvasm
index 6438682..0f24380 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_62e7ae "textureDimensions_62e7ae"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_62e7ae = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_62e7ae = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_62e7ae
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_62e7ae
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_62e7ae
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_62e7ae
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_62e7ae
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_62e7ae
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.wgsl
index b370b1f..02a74fb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/62e7ae.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8uint, read>;
 
-fn textureDimensions_62e7ae() {
+fn textureDimensions_62e7ae() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_62e7ae();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_62e7ae();
+  prevent_dce = textureDimensions_62e7ae();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_62e7ae();
+  prevent_dce = textureDimensions_62e7ae();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_62e7ae();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl
index 0298f18..ec68a83 100644
--- a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube<i32>;
 
 // fn textureDimensions(texture: texture_cube<i32>, level: u32) -> vec2<u32>
-fn textureDimensions_64dc74() {
+fn textureDimensions_64dc74() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_64dc74();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_64dc74();
+  prevent_dce = textureDimensions_64dc74();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_64dc74();
+  prevent_dce = textureDimensions_64dc74();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_64dc74();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.dxc.hlsl
index d9008c0..469e5b6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_64dc74() {
+uint2 textureDimensions_64dc74() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_64dc74();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_64dc74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_64dc74()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_64dc74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_64dc74()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_64dc74();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.fxc.hlsl
index d9008c0..469e5b6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_64dc74() {
+uint2 textureDimensions_64dc74() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_64dc74();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_64dc74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_64dc74()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_64dc74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_64dc74()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_64dc74();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.glsl
index d786583..891a7b9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isamplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_64dc74() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_64dc74();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_64dc74() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_64dc74() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_64dc74();
+  prevent_dce.inner = textureDimensions_64dc74();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_64dc74() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_64dc74() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_64dc74();
+  prevent_dce.inner = textureDimensions_64dc74();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_64dc74() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_64dc74();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.msl
index 1e63cdd..90ad7a4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_64dc74(texturecube<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_64dc74(texturecube<int, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_64dc74(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_64dc74(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_64dc74(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_64dc74(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_64dc74(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_64dc74(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.spvasm
index 54e7273..0b6fa41 100644
--- a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,105 @@
                OpName %textureDimensions_64dc74 "textureDimensions_64dc74"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+         %27 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_64dc74 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_64dc74 = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_64dc74
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_64dc74
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_64dc74
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %55 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %56 = OpFunctionCall %v2uint %textureDimensions_64dc74
+               OpStore %55 %56
+         %57 = OpLoad %VertexOutput %out
+               OpReturnValue %57
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %59 = OpLabel
+         %60 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %61 = OpCompositeExtract %v4float %60 0
+               OpStore %pos_1 %61
+         %62 = OpCompositeExtract %v2uint %60 1
+               OpStore %prevent_dce_1 %62
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_64dc74
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_64dc74
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.wgsl
index a1a67b0..b436930 100644
--- a/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/64dc74.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube<i32>;
 
-fn textureDimensions_64dc74() {
+fn textureDimensions_64dc74() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_64dc74();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_64dc74();
+  prevent_dce = textureDimensions_64dc74();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_64dc74();
+  prevent_dce = textureDimensions_64dc74();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_64dc74();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl
index 8bb363d..cad83c8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32sint, write>) -> vec2<u32>
-fn textureDimensions_674058() {
+fn textureDimensions_674058() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_674058();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_674058();
+  prevent_dce = textureDimensions_674058();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_674058();
+  prevent_dce = textureDimensions_674058();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_674058();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.dxc.hlsl
index 4ae4e30..d33607b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_674058() {
+uint2 textureDimensions_674058() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_674058();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_674058();
+  prevent_dce.Store2(0u, asuint(textureDimensions_674058()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_674058();
+  prevent_dce.Store2(0u, asuint(textureDimensions_674058()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_674058();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.fxc.hlsl
index 4ae4e30..d33607b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_674058() {
+uint2 textureDimensions_674058() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_674058();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_674058();
+  prevent_dce.Store2(0u, asuint(textureDimensions_674058()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_674058();
+  prevent_dce.Store2(0u, asuint(textureDimensions_674058()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_674058();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.glsl
index 752654c..fd38d7e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp writeonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_674058() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_674058();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_674058() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_674058() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_674058();
+  prevent_dce.inner = textureDimensions_674058();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_674058() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_674058() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_674058();
+  prevent_dce.inner = textureDimensions_674058();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_674058() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_674058();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.msl
index 02af1ed..d40d19c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_674058(texture2d_array<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_674058(texture2d_array<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_674058(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_674058(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_674058(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_674058(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_674058(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_674058(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.spvasm
index 6cc571b..d271b43 100644
--- a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_674058 "textureDimensions_674058"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_674058 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_674058 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_674058
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_674058
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_674058
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_674058
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_674058
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_674058
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.wgsl
index 5000f73..fb06937 100644
--- a/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/674058.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32sint, write>;
 
-fn textureDimensions_674058() {
+fn textureDimensions_674058() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_674058();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_674058();
+  prevent_dce = textureDimensions_674058();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_674058();
+  prevent_dce = textureDimensions_674058();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_674058();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl
index bbd8bc5..c2a4cab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32float, read>) -> vec3<u32>
-fn textureDimensions_6dae40() {
+fn textureDimensions_6dae40() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6dae40();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6dae40();
+  prevent_dce = textureDimensions_6dae40();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6dae40();
+  prevent_dce = textureDimensions_6dae40();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6dae40();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.dxc.hlsl
index 586120c..74e4a59 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6dae40() {
+uint3 textureDimensions_6dae40() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6dae40();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6dae40();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dae40()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6dae40();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dae40()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6dae40();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.fxc.hlsl
index 586120c..74e4a59 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6dae40() {
+uint3 textureDimensions_6dae40() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6dae40();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6dae40();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dae40()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6dae40();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dae40()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6dae40();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.msl
index 7c76eae..c746ddf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_6dae40(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_6dae40(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_6dae40(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_6dae40(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_6dae40(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_6dae40(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_6dae40(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_6dae40(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.spvasm
index 5b54f79..9dc6849 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_6dae40 "textureDimensions_6dae40"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_6dae40 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_6dae40 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_6dae40
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_6dae40
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_6dae40
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_6dae40
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_6dae40
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_6dae40
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.wgsl
index 11e6e96..205bf25 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dae40.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32float, read>;
 
-fn textureDimensions_6dae40() {
+fn textureDimensions_6dae40() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6dae40();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6dae40();
+  prevent_dce = textureDimensions_6dae40();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6dae40();
+  prevent_dce = textureDimensions_6dae40();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6dae40();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl
index dc6e153..3de889b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32sint, read>) -> vec3<u32>
-fn textureDimensions_6dbef4() {
+fn textureDimensions_6dbef4() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6dbef4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6dbef4();
+  prevent_dce = textureDimensions_6dbef4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6dbef4();
+  prevent_dce = textureDimensions_6dbef4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6dbef4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.dxc.hlsl
index 44ef69e..d1d3ac9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6dbef4() {
+uint3 textureDimensions_6dbef4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6dbef4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6dbef4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dbef4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6dbef4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dbef4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6dbef4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.fxc.hlsl
index 44ef69e..d1d3ac9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6dbef4() {
+uint3 textureDimensions_6dbef4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6dbef4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6dbef4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dbef4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6dbef4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6dbef4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6dbef4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.msl
index ce5b634..5b30eb1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_6dbef4(texture3d<int, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_6dbef4(texture3d<int, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_6dbef4(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_6dbef4(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_6dbef4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_6dbef4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_6dbef4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_6dbef4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.spvasm
index 8b46264..9827538 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,74 +21,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_6dbef4 "textureDimensions_6dbef4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_6dbef4 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_6dbef4 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_6dbef4
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_6dbef4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_6dbef4
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_6dbef4
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_6dbef4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_6dbef4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.wgsl
index cd7e33e..906db61 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6dbef4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32sint, read>;
 
-fn textureDimensions_6dbef4() {
+fn textureDimensions_6dbef4() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6dbef4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6dbef4();
+  prevent_dce = textureDimensions_6dbef4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6dbef4();
+  prevent_dce = textureDimensions_6dbef4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6dbef4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl
index 499cf77..05f6041 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_3d<u32>;
 
 // fn textureDimensions(texture: texture_3d<u32>, level: u32) -> vec3<u32>
-fn textureDimensions_6e6c7a() {
+fn textureDimensions_6e6c7a() -> vec3<u32>{
   var arg_1 = 1u;
   var res: vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6e6c7a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce = textureDimensions_6e6c7a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce = textureDimensions_6e6c7a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6e6c7a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.dxc.hlsl
index 4ceff93..df93400 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6e6c7a() {
+uint3 textureDimensions_6e6c7a() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6e6c7a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6e6c7a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6e6c7a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6e6c7a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.fxc.hlsl
index 4ceff93..df93400 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6e6c7a() {
+uint3 textureDimensions_6e6c7a() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6e6c7a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6e6c7a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce.Store3(0u, asuint(textureDimensions_6e6c7a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6e6c7a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.glsl
index 3db2c4b..4d51cd2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.glsl
@@ -1,48 +1,26 @@
 #version 310 es
-
-uniform highp usampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_6e6c7a() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_6e6c7a();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_6e6c7a() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_6e6c7a() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce.inner = textureDimensions_6e6c7a();
 }
 
 void main() {
@@ -52,19 +30,24 @@
 #version 310 es
 
 uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_6e6c7a() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_6e6c7a() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce.inner = textureDimensions_6e6c7a();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -72,3 +55,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_6e6c7a() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_6e6c7a();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.msl
index e9dafaf..638e69b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_6e6c7a(texture3d<uint, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_6e6c7a(texture3d<uint, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint3 res = uint3(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1), tint_symbol_1.get_depth(arg_1));
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_6e6c7a(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_6e6c7a(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_6e6c7a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_6e6c7a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_6e6c7a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_6e6c7a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.spvasm
index ff612a3..6bd67ce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_6e6c7a "textureDimensions_6e6c7a"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %30 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_6e6c7a = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v3uint Function %30
+%textureDimensions_6e6c7a = OpFunction %v3uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v3uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v3uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %34 = OpLoad %v3uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v3uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v3uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_6e6c7a
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_6e6c7a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v3uint %textureDimensions_6e6c7a
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %55 = OpFunctionCall %v3uint %textureDimensions_6e6c7a
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v3uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_6e6c7a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_6e6c7a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.wgsl
index 3372527..27859c4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e6c7a.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_3d<u32>;
 
-fn textureDimensions_6e6c7a() {
+fn textureDimensions_6e6c7a() -> vec3<u32> {
   var arg_1 = 1u;
   var res : vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6e6c7a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce = textureDimensions_6e6c7a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6e6c7a();
+  prevent_dce = textureDimensions_6e6c7a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6e6c7a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl
index 935c6f2..a57b32b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32float, read>) -> vec2<u32>
-fn textureDimensions_6e72c5() {
+fn textureDimensions_6e72c5() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6e72c5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6e72c5();
+  prevent_dce = textureDimensions_6e72c5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6e72c5();
+  prevent_dce = textureDimensions_6e72c5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6e72c5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.dxc.hlsl
index 6e183f0..aef65e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6e72c5() {
+uint2 textureDimensions_6e72c5() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6e72c5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6e72c5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6e72c5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6e72c5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6e72c5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6e72c5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.fxc.hlsl
index 6e183f0..aef65e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6e72c5() {
+uint2 textureDimensions_6e72c5() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6e72c5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6e72c5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6e72c5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6e72c5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6e72c5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6e72c5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.glsl
index 6c15993..86f0e29 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_6e72c5() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_6e72c5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_6e72c5() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_6e72c5() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_6e72c5();
+  prevent_dce.inner = textureDimensions_6e72c5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_6e72c5() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_6e72c5() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_6e72c5();
+  prevent_dce.inner = textureDimensions_6e72c5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_6e72c5() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_6e72c5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.msl
index 629d369..3f5cefb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_6e72c5(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_6e72c5(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_6e72c5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_6e72c5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_6e72c5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_6e72c5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_6e72c5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_6e72c5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.spvasm
index 3a238be..1bd4de5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_6e72c5 "textureDimensions_6e72c5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_6e72c5 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_6e72c5 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_6e72c5
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_6e72c5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_6e72c5
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_6e72c5
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_6e72c5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_6e72c5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.wgsl
index 34c0d69..4dc753b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6e72c5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32float, read>;
 
-fn textureDimensions_6e72c5() {
+fn textureDimensions_6e72c5() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6e72c5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6e72c5();
+  prevent_dce = textureDimensions_6e72c5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6e72c5();
+  prevent_dce = textureDimensions_6e72c5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6e72c5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl
index d5aeb85..9fc2702 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<u32>
-fn textureDimensions_6f1b5d() {
+fn textureDimensions_6f1b5d() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6f1b5d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce = textureDimensions_6f1b5d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce = textureDimensions_6f1b5d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6f1b5d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.dxc.hlsl
index 676b2b8..752fa32 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6f1b5d() {
+uint2 textureDimensions_6f1b5d() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6f1b5d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6f1b5d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6f1b5d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6f1b5d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.fxc.hlsl
index 676b2b8..752fa32 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_6f1b5d() {
+uint2 textureDimensions_6f1b5d() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_6f1b5d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6f1b5d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_6f1b5d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_6f1b5d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.glsl
index 2599034..dafd2df 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_6f1b5d() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_6f1b5d();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_6f1b5d() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_6f1b5d() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce.inner = textureDimensions_6f1b5d();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_6f1b5d() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_6f1b5d() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce.inner = textureDimensions_6f1b5d();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_6f1b5d() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_6f1b5d();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.msl
index 424c21d..ea634aa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_6f1b5d(depth2d<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_6f1b5d(depth2d<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depth2d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_6f1b5d(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depth2d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_6f1b5d(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depth2d<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_6f1b5d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depth2d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_6f1b5d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depth2d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depth2d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depth2d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_6f1b5d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depth2d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_6f1b5d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.spvasm
index 82cbec9..58c6d7e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_6f1b5d "textureDimensions_6f1b5d"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_6f1b5d = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_6f1b5d = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_6f1b5d
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_6f1b5d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_6f1b5d
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_6f1b5d
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_6f1b5d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_6f1b5d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.wgsl
index 4a50f82..a2d73af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/6f1b5d.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-fn textureDimensions_6f1b5d() {
+fn textureDimensions_6f1b5d() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6f1b5d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce = textureDimensions_6f1b5d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_6f1b5d();
+  prevent_dce = textureDimensions_6f1b5d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_6f1b5d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl
index 3af1ec7..84696a9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16uint, read>) -> u32
-fn textureDimensions_709357() {
+fn textureDimensions_709357() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_709357();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_709357();
+  prevent_dce = textureDimensions_709357();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_709357();
+  prevent_dce = textureDimensions_709357();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_709357();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.dxc.hlsl
index 0c5312d..5fa73e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_709357() {
+uint textureDimensions_709357() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_709357();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_709357();
+  prevent_dce.Store(0u, asuint(textureDimensions_709357()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_709357();
+  prevent_dce.Store(0u, asuint(textureDimensions_709357()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_709357();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.fxc.hlsl
index 0c5312d..5fa73e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_709357() {
+uint textureDimensions_709357() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_709357();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_709357();
+  prevent_dce.Store(0u, asuint(textureDimensions_709357()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_709357();
+  prevent_dce.Store(0u, asuint(textureDimensions_709357()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_709357();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.glsl
index 96ec47f..706f8da 100644
--- a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_709357() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_709357();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_709357() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_709357() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_709357();
+  prevent_dce.inner = textureDimensions_709357();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_709357() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_709357() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_709357();
+  prevent_dce.inner = textureDimensions_709357();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_709357() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_709357();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.msl
index 8c3975f..07ff8ef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_709357(texture1d<uint, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_709357(texture1d<uint, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_709357(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_709357(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_709357(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_709357(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_709357(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_709357(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.spvasm
index 6bf348e..d8e7766 100644
--- a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_709357 "textureDimensions_709357"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_709357 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_709357 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_709357
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_709357
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_709357
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_709357
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_709357
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_709357
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.wgsl
index e13ef65..25ac5cf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/709357.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16uint, read>;
 
-fn textureDimensions_709357() {
+fn textureDimensions_709357() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_709357();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_709357();
+  prevent_dce = textureDimensions_709357();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_709357();
+  prevent_dce = textureDimensions_709357();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_709357();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl
index fa0c447..f76a098 100644
--- a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32sint, read_write>) -> vec3<u32>
-fn textureDimensions_70dd33() {
+fn textureDimensions_70dd33() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_70dd33();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_70dd33();
+  prevent_dce = textureDimensions_70dd33();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_70dd33();
+  prevent_dce = textureDimensions_70dd33();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_70dd33();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.dxc.hlsl
index b4818c4..a1784ce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_70dd33() {
+uint3 textureDimensions_70dd33() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_70dd33();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_70dd33();
+  prevent_dce.Store3(0u, asuint(textureDimensions_70dd33()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_70dd33();
+  prevent_dce.Store3(0u, asuint(textureDimensions_70dd33()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_70dd33();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.fxc.hlsl
index b4818c4..a1784ce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_70dd33() {
+uint3 textureDimensions_70dd33() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_70dd33();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_70dd33();
+  prevent_dce.Store3(0u, asuint(textureDimensions_70dd33()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_70dd33();
+  prevent_dce.Store3(0u, asuint(textureDimensions_70dd33()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_70dd33();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.glsl
index 74f008a..3a94f4e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_70dd33() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_70dd33();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_70dd33() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_70dd33() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_70dd33();
+  prevent_dce.inner = textureDimensions_70dd33();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_70dd33() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_70dd33() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_70dd33();
+  prevent_dce.inner = textureDimensions_70dd33();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_70dd33() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_70dd33();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.msl
index 7e28937..4d7b61a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_70dd33(texture3d<int, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_70dd33(texture3d<int, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_70dd33(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_70dd33(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_70dd33(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_70dd33(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_70dd33(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_70dd33(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.spvasm
index 8798983..9465d3c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_70dd33 "textureDimensions_70dd33"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_70dd33 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_70dd33 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_70dd33
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_70dd33
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_70dd33
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_70dd33
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_70dd33
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_70dd33
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.wgsl
index f59f105..9716f35 100644
--- a/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/70dd33.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32sint, read_write>;
 
-fn textureDimensions_70dd33() {
+fn textureDimensions_70dd33() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_70dd33();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_70dd33();
+  prevent_dce = textureDimensions_70dd33();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_70dd33();
+  prevent_dce = textureDimensions_70dd33();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_70dd33();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl
index 41327b3..abebea7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<bgra8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<bgra8unorm, read_write>) -> vec2<u32>
-fn textureDimensions_715917() {
+fn textureDimensions_715917() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_715917();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_715917();
+  prevent_dce = textureDimensions_715917();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_715917();
+  prevent_dce = textureDimensions_715917();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_715917();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.dxc.hlsl
index 7f84e7b..a669af9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_715917() {
+uint2 textureDimensions_715917() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_715917();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_715917();
+  prevent_dce.Store2(0u, asuint(textureDimensions_715917()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_715917();
+  prevent_dce.Store2(0u, asuint(textureDimensions_715917()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_715917();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.fxc.hlsl
index 7f84e7b..a669af9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_715917() {
+uint2 textureDimensions_715917() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_715917();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_715917();
+  prevent_dce.Store2(0u, asuint(textureDimensions_715917()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_715917();
+  prevent_dce.Store2(0u, asuint(textureDimensions_715917()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_715917();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.glsl
index 86f820e..910debb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_715917() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_715917();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_715917() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_715917() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_715917();
+  prevent_dce.inner = textureDimensions_715917();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_715917() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_715917() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_715917();
+  prevent_dce.inner = textureDimensions_715917();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_715917() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_715917();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.msl
index 9ced3de..0e944bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_715917(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_715917(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_715917(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_715917(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_715917(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_715917(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_715917(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_715917(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.spvasm
index 4ae6f64..49cba3d7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_715917 "textureDimensions_715917"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_715917 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_715917 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_715917
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_715917
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_715917
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_715917
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_715917
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_715917
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.wgsl
index efcbfd2..d82dc31 100644
--- a/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/715917.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<bgra8unorm, read_write>;
 
-fn textureDimensions_715917() {
+fn textureDimensions_715917() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_715917();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_715917();
+  prevent_dce = textureDimensions_715917();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_715917();
+  prevent_dce = textureDimensions_715917();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_715917();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl
index 6a0a21f..6f58938 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32uint, write>) -> u32
-fn textureDimensions_7228de() {
+fn textureDimensions_7228de() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7228de();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7228de();
+  prevent_dce = textureDimensions_7228de();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7228de();
+  prevent_dce = textureDimensions_7228de();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7228de();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.dxc.hlsl
index 5a85086..e64e322 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7228de() {
+uint textureDimensions_7228de() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7228de();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7228de();
+  prevent_dce.Store(0u, asuint(textureDimensions_7228de()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7228de();
+  prevent_dce.Store(0u, asuint(textureDimensions_7228de()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7228de();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.fxc.hlsl
index 5a85086..e64e322 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7228de() {
+uint textureDimensions_7228de() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7228de();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7228de();
+  prevent_dce.Store(0u, asuint(textureDimensions_7228de()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7228de();
+  prevent_dce.Store(0u, asuint(textureDimensions_7228de()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7228de();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.glsl
index a11b593..4f546da 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_7228de() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_7228de();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_7228de() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_7228de() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_7228de();
+  prevent_dce.inner = textureDimensions_7228de();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_7228de() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_7228de() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_7228de();
+  prevent_dce.inner = textureDimensions_7228de();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_7228de() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_7228de();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.msl
index bcac19c..2c00865 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7228de(texture1d<uint, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_7228de(texture1d<uint, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_7228de(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_7228de(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_7228de(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7228de(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7228de(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7228de(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.spvasm
index 6381839..7ec98b1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7228de "textureDimensions_7228de"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 R32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7228de = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_7228de = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_7228de
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_7228de
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_7228de
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_7228de
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_7228de
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_7228de
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.wgsl
index 258d65b..5e8fba8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7228de.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32uint, write>;
 
-fn textureDimensions_7228de() {
+fn textureDimensions_7228de() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7228de();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7228de();
+  prevent_dce = textureDimensions_7228de();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7228de();
+  prevent_dce = textureDimensions_7228de();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7228de();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl
index adb42ed..623ea3d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8snorm, read>) -> vec2<u32>
-fn textureDimensions_7327fa() {
+fn textureDimensions_7327fa() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7327fa();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7327fa();
+  prevent_dce = textureDimensions_7327fa();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7327fa();
+  prevent_dce = textureDimensions_7327fa();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7327fa();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.dxc.hlsl
index 7b7699d..087ae97 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7327fa() {
+uint2 textureDimensions_7327fa() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7327fa();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7327fa();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7327fa()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7327fa();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7327fa()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7327fa();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.fxc.hlsl
index 7b7699d..087ae97 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7327fa() {
+uint2 textureDimensions_7327fa() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7327fa();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7327fa();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7327fa()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7327fa();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7327fa()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7327fa();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.glsl
index 0974303..21b3f4f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_7327fa() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_7327fa();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_7327fa() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_7327fa() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_7327fa();
+  prevent_dce.inner = textureDimensions_7327fa();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_7327fa() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_7327fa() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_7327fa();
+  prevent_dce.inner = textureDimensions_7327fa();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8_snorm) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_7327fa() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_7327fa();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.msl
index 8efa69f..fa1cb7f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7327fa(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_7327fa(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_7327fa(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_7327fa(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_7327fa(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7327fa(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7327fa(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7327fa(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.spvasm
index 6afe408..3b717e3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7327fa "textureDimensions_7327fa"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7327fa = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_7327fa = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_7327fa
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_7327fa
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_7327fa
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_7327fa
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_7327fa
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_7327fa
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.wgsl
index 1fa86fa..58ad696 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7327fa.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8snorm, read>;
 
-fn textureDimensions_7327fa() {
+fn textureDimensions_7327fa() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7327fa();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7327fa();
+  prevent_dce = textureDimensions_7327fa();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7327fa();
+  prevent_dce = textureDimensions_7327fa();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7327fa();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl
index e8b4560..f1e07e5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32sint, read_write>) -> u32
-fn textureDimensions_740e7c() {
+fn textureDimensions_740e7c() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_740e7c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_740e7c();
+  prevent_dce = textureDimensions_740e7c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_740e7c();
+  prevent_dce = textureDimensions_740e7c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_740e7c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.dxc.hlsl
index ce31aae..1981b9c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_740e7c() {
+uint textureDimensions_740e7c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_740e7c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_740e7c();
+  prevent_dce.Store(0u, asuint(textureDimensions_740e7c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_740e7c();
+  prevent_dce.Store(0u, asuint(textureDimensions_740e7c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_740e7c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.fxc.hlsl
index ce31aae..1981b9c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_740e7c() {
+uint textureDimensions_740e7c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_740e7c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_740e7c();
+  prevent_dce.Store(0u, asuint(textureDimensions_740e7c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_740e7c();
+  prevent_dce.Store(0u, asuint(textureDimensions_740e7c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_740e7c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.msl
index badd6d5..6259d7c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_740e7c(texture1d<int, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_740e7c(texture1d<int, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_740e7c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_740e7c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_740e7c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_740e7c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_740e7c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_740e7c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.spvasm
index 0ef6bd5..fc74d7c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,72 +22,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_740e7c "textureDimensions_740e7c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_740e7c = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_740e7c = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_740e7c
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_740e7c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_740e7c
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_740e7c
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_740e7c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_740e7c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.wgsl
index e2cb6ba..a9a7160 100644
--- a/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/740e7c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32sint, read_write>;
 
-fn textureDimensions_740e7c() {
+fn textureDimensions_740e7c() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_740e7c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_740e7c();
+  prevent_dce = textureDimensions_740e7c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_740e7c();
+  prevent_dce = textureDimensions_740e7c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_740e7c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl
index 8d0dde8..c1a7668 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_3d<i32>;
 
 // fn textureDimensions(texture: texture_3d<i32>, level: i32) -> vec3<u32>
-fn textureDimensions_756031() {
+fn textureDimensions_756031() -> vec3<u32>{
   var arg_1 = 1i;
   var res: vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_756031();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_756031();
+  prevent_dce = textureDimensions_756031();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_756031();
+  prevent_dce = textureDimensions_756031();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_756031();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.dxc.hlsl
index be69b4f..56b75af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_756031() {
+uint3 textureDimensions_756031() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_756031();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_756031();
+  prevent_dce.Store3(0u, asuint(textureDimensions_756031()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_756031();
+  prevent_dce.Store3(0u, asuint(textureDimensions_756031()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_756031();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.fxc.hlsl
index be69b4f..56b75af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_756031() {
+uint3 textureDimensions_756031() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_756031();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_756031();
+  prevent_dce.Store3(0u, asuint(textureDimensions_756031()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_756031();
+  prevent_dce.Store3(0u, asuint(textureDimensions_756031()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_756031();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.glsl
index 3ad2e52..a710afb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.glsl
@@ -1,48 +1,26 @@
 #version 310 es
-
-uniform highp isampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_756031() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_756031();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_756031() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_756031() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_756031();
+  prevent_dce.inner = textureDimensions_756031();
 }
 
 void main() {
@@ -52,19 +30,24 @@
 #version 310 es
 
 uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_756031() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_756031() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_756031();
+  prevent_dce.inner = textureDimensions_756031();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -72,3 +55,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_756031() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_756031();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.msl
index 1ae75d1..d4259bf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_756031(texture3d<int, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_756031(texture3d<int, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint3 res = uint3(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1), tint_symbol_1.get_depth(arg_1));
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_756031(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_756031(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_756031(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_756031(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_756031(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_756031(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.spvasm
index af87151..462af77 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_756031 "textureDimensions_756031"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %31 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_756031 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v3uint Function %31
+%textureDimensions_756031 = OpFunction %v3uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v3uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %35 = OpLoad %v3uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v3uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v3uint %textureDimensions_756031
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_756031
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v3uint %textureDimensions_756031
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %57 = OpFunctionCall %v3uint %textureDimensions_756031
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v3uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_756031
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_756031
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.wgsl
index 7c6c200..4ce4431 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756031.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_3d<i32>;
 
-fn textureDimensions_756031() {
+fn textureDimensions_756031() -> vec3<u32> {
   var arg_1 = 1i;
   var res : vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_756031();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_756031();
+  prevent_dce = textureDimensions_756031();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_756031();
+  prevent_dce = textureDimensions_756031();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_756031();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl
index 5027af8..0cfeded 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32float, write>) -> vec2<u32>
-fn textureDimensions_756304() {
+fn textureDimensions_756304() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_756304();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_756304();
+  prevent_dce = textureDimensions_756304();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_756304();
+  prevent_dce = textureDimensions_756304();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_756304();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.dxc.hlsl
index 72179c1..f7304f7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_756304() {
+uint2 textureDimensions_756304() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_756304();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_756304();
+  prevent_dce.Store2(0u, asuint(textureDimensions_756304()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_756304();
+  prevent_dce.Store2(0u, asuint(textureDimensions_756304()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_756304();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.fxc.hlsl
index 72179c1..f7304f7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_756304() {
+uint2 textureDimensions_756304() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_756304();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_756304();
+  prevent_dce.Store2(0u, asuint(textureDimensions_756304()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_756304();
+  prevent_dce.Store2(0u, asuint(textureDimensions_756304()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_756304();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.glsl
index 231ad49..f169d1d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_756304() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_756304();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_756304() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_756304() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_756304();
+  prevent_dce.inner = textureDimensions_756304();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_756304() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_756304() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_756304();
+  prevent_dce.inner = textureDimensions_756304();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_756304() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_756304();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.msl
index 19beb5b..94cc1c9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_756304(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_756304(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_756304(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_756304(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_756304(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_756304(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_756304(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_756304(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.spvasm
index 5acbfc0..ac6825d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_756304 "textureDimensions_756304"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_756304 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_756304 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_756304
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_756304
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_756304
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_756304
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_756304
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_756304
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.wgsl
index b87a0d0..d3e29bd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/756304.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32float, write>;
 
-fn textureDimensions_756304() {
+fn textureDimensions_756304() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_756304();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_756304();
+  prevent_dce = textureDimensions_756304();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_756304();
+  prevent_dce = textureDimensions_756304();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_756304();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl
index 7e57113..45ae89b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8sint, read>) -> vec3<u32>
-fn textureDimensions_790e57() {
+fn textureDimensions_790e57() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_790e57();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_790e57();
+  prevent_dce = textureDimensions_790e57();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_790e57();
+  prevent_dce = textureDimensions_790e57();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_790e57();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.dxc.hlsl
index fa3a703..848961a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_790e57() {
+uint3 textureDimensions_790e57() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_790e57();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_790e57();
+  prevent_dce.Store3(0u, asuint(textureDimensions_790e57()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_790e57();
+  prevent_dce.Store3(0u, asuint(textureDimensions_790e57()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_790e57();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.fxc.hlsl
index fa3a703..848961a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_790e57() {
+uint3 textureDimensions_790e57() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_790e57();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_790e57();
+  prevent_dce.Store3(0u, asuint(textureDimensions_790e57()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_790e57();
+  prevent_dce.Store3(0u, asuint(textureDimensions_790e57()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_790e57();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.glsl
index 3ac9439..85527d9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8i) uniform highp readonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_790e57() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_790e57();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_790e57() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_790e57() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_790e57();
+  prevent_dce.inner = textureDimensions_790e57();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_790e57() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_790e57() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_790e57();
+  prevent_dce.inner = textureDimensions_790e57();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_790e57() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_790e57();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.msl
index a5788b3..7570fd3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_790e57(texture3d<int, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_790e57(texture3d<int, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_790e57(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_790e57(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_790e57(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_790e57(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_790e57(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_790e57(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.spvasm
index d23a18d..8e9b904 100644
--- a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_790e57 "textureDimensions_790e57"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_790e57 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_790e57 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_790e57
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_790e57
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_790e57
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_790e57
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_790e57
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_790e57
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.wgsl
index 51a54f4..321022f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/790e57.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8sint, read>;
 
-fn textureDimensions_790e57() {
+fn textureDimensions_790e57() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_790e57();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_790e57();
+  prevent_dce = textureDimensions_790e57();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_790e57();
+  prevent_dce = textureDimensions_790e57();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_790e57();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl
index 239f4be..75a16f8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8unorm, read_write>) -> vec2<u32>
-fn textureDimensions_795fbb() {
+fn textureDimensions_795fbb() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_795fbb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_795fbb();
+  prevent_dce = textureDimensions_795fbb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_795fbb();
+  prevent_dce = textureDimensions_795fbb();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_795fbb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.dxc.hlsl
index eba248d..f82ceb0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_795fbb() {
+uint2 textureDimensions_795fbb() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_795fbb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_795fbb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_795fbb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_795fbb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_795fbb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_795fbb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.fxc.hlsl
index eba248d..f82ceb0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_795fbb() {
+uint2 textureDimensions_795fbb() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_795fbb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_795fbb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_795fbb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_795fbb();
+  prevent_dce.Store2(0u, asuint(textureDimensions_795fbb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_795fbb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.glsl
index 050a533..6a29446 100644
--- a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_795fbb() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_795fbb();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_795fbb() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_795fbb() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_795fbb();
+  prevent_dce.inner = textureDimensions_795fbb();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_795fbb() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_795fbb() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_795fbb();
+  prevent_dce.inner = textureDimensions_795fbb();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_795fbb() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_795fbb();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.msl
index fcec216..4b250b9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_795fbb(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_795fbb(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_795fbb(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_795fbb(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_795fbb(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_795fbb(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_795fbb(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_795fbb(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.spvasm
index 0ec77d3..0245a7a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_795fbb "textureDimensions_795fbb"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_795fbb = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_795fbb = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_795fbb
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_795fbb
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_795fbb
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_795fbb
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_795fbb
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_795fbb
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.wgsl
index d4e3a9c..73694d3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/795fbb.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8unorm, read_write>;
 
-fn textureDimensions_795fbb() {
+fn textureDimensions_795fbb() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_795fbb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_795fbb();
+  prevent_dce = textureDimensions_795fbb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_795fbb();
+  prevent_dce = textureDimensions_795fbb();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_795fbb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl
index 8a63207..e0e015b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32uint, read>) -> u32
-fn textureDimensions_797c30() {
+fn textureDimensions_797c30() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_797c30();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_797c30();
+  prevent_dce = textureDimensions_797c30();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_797c30();
+  prevent_dce = textureDimensions_797c30();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_797c30();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.dxc.hlsl
index 0148350..58091cb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_797c30() {
+uint textureDimensions_797c30() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_797c30();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_797c30();
+  prevent_dce.Store(0u, asuint(textureDimensions_797c30()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_797c30();
+  prevent_dce.Store(0u, asuint(textureDimensions_797c30()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_797c30();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.fxc.hlsl
index 0148350..58091cb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_797c30() {
+uint textureDimensions_797c30() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_797c30();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_797c30();
+  prevent_dce.Store(0u, asuint(textureDimensions_797c30()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_797c30();
+  prevent_dce.Store(0u, asuint(textureDimensions_797c30()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_797c30();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.glsl
index bcb0187..25b159c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_797c30() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_797c30();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_797c30() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_797c30() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_797c30();
+  prevent_dce.inner = textureDimensions_797c30();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_797c30() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_797c30() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_797c30();
+  prevent_dce.inner = textureDimensions_797c30();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_797c30() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_797c30();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.msl
index 5004dea..72014d2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_797c30(texture1d<uint, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_797c30(texture1d<uint, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_797c30(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_797c30(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_797c30(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_797c30(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_797c30(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_797c30(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.spvasm
index 2c56b0d..018e077 100644
--- a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_797c30 "textureDimensions_797c30"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_797c30 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_797c30 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_797c30
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_797c30
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_797c30
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_797c30
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_797c30
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_797c30
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.wgsl
index 35d1dce..eadad37 100644
--- a/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/797c30.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32uint, read>;
 
-fn textureDimensions_797c30() {
+fn textureDimensions_797c30() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_797c30();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_797c30();
+  prevent_dce = textureDimensions_797c30();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_797c30();
+  prevent_dce = textureDimensions_797c30();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_797c30();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl
index 74c4972..18ba20b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_cube;
 
 // fn textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<u32>
-fn textureDimensions_79d168() {
+fn textureDimensions_79d168() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_79d168();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_79d168();
+  prevent_dce = textureDimensions_79d168();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_79d168();
+  prevent_dce = textureDimensions_79d168();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_79d168();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.dxc.hlsl
index 2c1ef84..6218ef3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_79d168() {
+uint2 textureDimensions_79d168() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_79d168();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_79d168();
+  prevent_dce.Store2(0u, asuint(textureDimensions_79d168()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_79d168();
+  prevent_dce.Store2(0u, asuint(textureDimensions_79d168()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_79d168();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.fxc.hlsl
index 2c1ef84..6218ef3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_79d168() {
+uint2 textureDimensions_79d168() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_79d168();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_79d168();
+  prevent_dce.Store2(0u, asuint(textureDimensions_79d168()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_79d168();
+  prevent_dce.Store2(0u, asuint(textureDimensions_79d168()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_79d168();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.glsl
index caff85e..8490343 100644
--- a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp samplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_79d168() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_79d168();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_79d168() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_79d168() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_79d168();
+  prevent_dce.inner = textureDimensions_79d168();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_79d168() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_79d168() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_79d168();
+  prevent_dce.inner = textureDimensions_79d168();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_79d168() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_79d168();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.msl
index 96ad7ea..94841d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_79d168(depthcube<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_79d168(depthcube<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depthcube<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_79d168(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depthcube<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_79d168(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depthcube<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_79d168(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depthcube<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_79d168(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depthcube<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depthcube<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depthcube<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_79d168(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depthcube<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_79d168(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.spvasm
index 7e40b8e..aa7a5d9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_79d168 "textureDimensions_79d168"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_79d168 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_79d168 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_79d168
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_79d168
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_79d168
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_79d168
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_79d168
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_79d168
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.wgsl
index 9e76ce3..61dc19e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/79d168.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-fn textureDimensions_79d168() {
+fn textureDimensions_79d168() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_79d168();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_79d168();
+  prevent_dce = textureDimensions_79d168();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_79d168();
+  prevent_dce = textureDimensions_79d168();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_79d168();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl
index d16e739..e11bc60 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_3d<u32>;
 
 // fn textureDimensions(texture: texture_3d<u32>) -> vec3<u32>
-fn textureDimensions_7a3890() {
+fn textureDimensions_7a3890() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7a3890();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7a3890();
+  prevent_dce = textureDimensions_7a3890();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7a3890();
+  prevent_dce = textureDimensions_7a3890();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7a3890();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.dxc.hlsl
index bca915b..e964059 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7a3890() {
+uint3 textureDimensions_7a3890() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7a3890();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7a3890();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7a3890()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7a3890();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7a3890()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7a3890();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.fxc.hlsl
index bca915b..e964059 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7a3890() {
+uint3 textureDimensions_7a3890() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7a3890();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7a3890();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7a3890()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7a3890();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7a3890()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7a3890();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.glsl
index 355d19c..acbd9b1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_7a3890() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_7a3890();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_7a3890() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_7a3890() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_7a3890();
+  prevent_dce.inner = textureDimensions_7a3890();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_7a3890() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_7a3890() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_7a3890();
+  prevent_dce.inner = textureDimensions_7a3890();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_7a3890() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_7a3890();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.msl
index 46e8389..c333ee1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7a3890(texture3d<uint, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_7a3890(texture3d<uint, access::sample> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_7a3890(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_7a3890(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_7a3890(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7a3890(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7a3890(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7a3890(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.spvasm
index 3e16f4d..bed858b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7a3890 "textureDimensions_7a3890"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %27 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7a3890 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v3uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %31 = OpLoad %v3uint %res
-               OpStore %30 %31
+%textureDimensions_7a3890 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v3uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v3uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v3uint %textureDimensions_7a3890
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_7a3890
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v3uint %textureDimensions_7a3890
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %53 = OpFunctionCall %v3uint %textureDimensions_7a3890
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v3uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_7a3890
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_7a3890
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.wgsl
index 0538678..f4c32b4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a3890.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_3d<u32>;
 
-fn textureDimensions_7a3890() {
+fn textureDimensions_7a3890() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7a3890();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7a3890();
+  prevent_dce = textureDimensions_7a3890();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7a3890();
+  prevent_dce = textureDimensions_7a3890();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7a3890();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl
index de1e023..cc1886b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_cube<u32>;
 
 // fn textureDimensions(texture: texture_cube<u32>) -> vec2<u32>
-fn textureDimensions_7a9e30() {
+fn textureDimensions_7a9e30() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7a9e30();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7a9e30();
+  prevent_dce = textureDimensions_7a9e30();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7a9e30();
+  prevent_dce = textureDimensions_7a9e30();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7a9e30();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.dxc.hlsl
index 52ccf80..a87f3a6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7a9e30() {
+uint2 textureDimensions_7a9e30() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7a9e30();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7a9e30();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7a9e30()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7a9e30();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7a9e30()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7a9e30();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.fxc.hlsl
index 52ccf80..a87f3a6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7a9e30() {
+uint2 textureDimensions_7a9e30() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7a9e30();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7a9e30();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7a9e30()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7a9e30();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7a9e30()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7a9e30();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.glsl
index a5484a2..3aaf678 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp usamplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_7a9e30() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_7a9e30();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_7a9e30() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_7a9e30() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_7a9e30();
+  prevent_dce.inner = textureDimensions_7a9e30();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_7a9e30() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_7a9e30() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_7a9e30();
+  prevent_dce.inner = textureDimensions_7a9e30();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_7a9e30() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_7a9e30();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.msl
index 8244dd9..1f7e6fa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7a9e30(texturecube<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_7a9e30(texturecube<uint, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_7a9e30(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_7a9e30(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_7a9e30(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7a9e30(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7a9e30(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7a9e30(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.spvasm
index c544c20..67046a4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7a9e30 "textureDimensions_7a9e30"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7a9e30 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v2uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_7a9e30 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v2uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_7a9e30
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_7a9e30
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_7a9e30
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_7a9e30
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_7a9e30
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_7a9e30
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.wgsl
index d29020c..b199663 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7a9e30.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_cube<u32>;
 
-fn textureDimensions_7a9e30() {
+fn textureDimensions_7a9e30() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7a9e30();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7a9e30();
+  prevent_dce = textureDimensions_7a9e30();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7a9e30();
+  prevent_dce = textureDimensions_7a9e30();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7a9e30();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl
index 59b3b4d..cdb32f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32float, read>) -> u32
-fn textureDimensions_7c753b() {
+fn textureDimensions_7c753b() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7c753b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7c753b();
+  prevent_dce = textureDimensions_7c753b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7c753b();
+  prevent_dce = textureDimensions_7c753b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7c753b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.dxc.hlsl
index f26b62b..1db987d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7c753b() {
+uint textureDimensions_7c753b() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7c753b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7c753b();
+  prevent_dce.Store(0u, asuint(textureDimensions_7c753b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7c753b();
+  prevent_dce.Store(0u, asuint(textureDimensions_7c753b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7c753b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.fxc.hlsl
index f26b62b..1db987d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7c753b() {
+uint textureDimensions_7c753b() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7c753b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7c753b();
+  prevent_dce.Store(0u, asuint(textureDimensions_7c753b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7c753b();
+  prevent_dce.Store(0u, asuint(textureDimensions_7c753b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7c753b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.glsl
index 74f588d..8fb7c8a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_7c753b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_7c753b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp readonly image2D arg_0;
+uint textureDimensions_7c753b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_7c753b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_7c753b();
+  prevent_dce.inner = textureDimensions_7c753b();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp readonly image2D arg_0;
+uint textureDimensions_7c753b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_7c753b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_7c753b();
+  prevent_dce.inner = textureDimensions_7c753b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32f) uniform highp readonly image2D arg_0;
+uint textureDimensions_7c753b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_7c753b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.msl
index 445d3cd..6e7a838 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7c753b(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_7c753b(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_7c753b(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_7c753b(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_7c753b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7c753b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7c753b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7c753b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.spvasm
index d7e6423..fb7b95a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7c753b "textureDimensions_7c753b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7c753b = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_7c753b = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_7c753b
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_7c753b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_7c753b
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_7c753b
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_7c753b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_7c753b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.wgsl
index 15533d0..50000e6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c753b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32float, read>;
 
-fn textureDimensions_7c753b() {
+fn textureDimensions_7c753b() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7c753b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7c753b();
+  prevent_dce = textureDimensions_7c753b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7c753b();
+  prevent_dce = textureDimensions_7c753b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7c753b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl
index 6c86762..24240e4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32sint, read_write>) -> vec2<u32>
-fn textureDimensions_7c7c64() {
+fn textureDimensions_7c7c64() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7c7c64();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7c7c64();
+  prevent_dce = textureDimensions_7c7c64();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7c7c64();
+  prevent_dce = textureDimensions_7c7c64();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7c7c64();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.dxc.hlsl
index a77b85d..dae5b6a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7c7c64() {
+uint2 textureDimensions_7c7c64() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7c7c64();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7c7c64();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7c7c64()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7c7c64();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7c7c64()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7c7c64();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.fxc.hlsl
index a77b85d..dae5b6a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7c7c64() {
+uint2 textureDimensions_7c7c64() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7c7c64();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7c7c64();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7c7c64()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7c7c64();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7c7c64()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7c7c64();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.msl
index 4b4d437..61a8bfe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7c7c64(texture2d_array<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_7c7c64(texture2d_array<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_7c7c64(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_7c7c64(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_7c7c64(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7c7c64(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7c7c64(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7c7c64(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.spvasm
index 894f0dd..7efe268 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,75 +21,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7c7c64 "textureDimensions_7c7c64"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7c7c64 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_7c7c64 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_7c7c64
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_7c7c64
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_7c7c64
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_7c7c64
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_7c7c64
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_7c7c64
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.wgsl
index 8398940..8c06909 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7c7c64.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32sint, read_write>;
 
-fn textureDimensions_7c7c64() {
+fn textureDimensions_7c7c64() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7c7c64();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7c7c64();
+  prevent_dce = textureDimensions_7c7c64();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7c7c64();
+  prevent_dce = textureDimensions_7c7c64();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7c7c64();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl
index 7c0d151..a8902ab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32uint, read>) -> u32
-fn textureDimensions_7d8439() {
+fn textureDimensions_7d8439() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7d8439();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7d8439();
+  prevent_dce = textureDimensions_7d8439();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7d8439();
+  prevent_dce = textureDimensions_7d8439();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7d8439();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.dxc.hlsl
index fbed68c..c7cd0be 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7d8439() {
+uint textureDimensions_7d8439() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7d8439();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7d8439();
+  prevent_dce.Store(0u, asuint(textureDimensions_7d8439()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7d8439();
+  prevent_dce.Store(0u, asuint(textureDimensions_7d8439()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7d8439();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.fxc.hlsl
index fbed68c..c7cd0be 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7d8439() {
+uint textureDimensions_7d8439() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7d8439();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7d8439();
+  prevent_dce.Store(0u, asuint(textureDimensions_7d8439()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7d8439();
+  prevent_dce.Store(0u, asuint(textureDimensions_7d8439()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7d8439();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.msl
index 6669a37..a735040 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7d8439(texture1d<uint, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_7d8439(texture1d<uint, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_7d8439(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_7d8439(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_7d8439(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7d8439(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7d8439(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7d8439(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.spvasm
index f041802..e1bbd4a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,72 +22,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7d8439 "textureDimensions_7d8439"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7d8439 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_7d8439 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_7d8439
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_7d8439
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_7d8439
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_7d8439
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_7d8439
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_7d8439
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.wgsl
index 9056f2b..38bdab7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7d8439.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32uint, read>;
 
-fn textureDimensions_7d8439() {
+fn textureDimensions_7d8439() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7d8439();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7d8439();
+  prevent_dce = textureDimensions_7d8439();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7d8439();
+  prevent_dce = textureDimensions_7d8439();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7d8439();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl
index 3f51525..459d96c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8sint, read_write>) -> vec3<u32>
-fn textureDimensions_7ea4b5() {
+fn textureDimensions_7ea4b5() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7ea4b5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce = textureDimensions_7ea4b5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce = textureDimensions_7ea4b5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7ea4b5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.dxc.hlsl
index a279e24..04014ae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7ea4b5() {
+uint3 textureDimensions_7ea4b5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7ea4b5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7ea4b5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7ea4b5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7ea4b5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.fxc.hlsl
index a279e24..04014ae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7ea4b5() {
+uint3 textureDimensions_7ea4b5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7ea4b5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7ea4b5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_7ea4b5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7ea4b5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.glsl
index b77fcdb..08d0831 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_7ea4b5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_7ea4b5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_7ea4b5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_7ea4b5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce.inner = textureDimensions_7ea4b5();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_7ea4b5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_7ea4b5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce.inner = textureDimensions_7ea4b5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_7ea4b5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_7ea4b5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.msl
index fc2012e..d1b799e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7ea4b5(texture3d<int, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_7ea4b5(texture3d<int, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_7ea4b5(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_7ea4b5(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_7ea4b5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7ea4b5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7ea4b5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7ea4b5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.spvasm
index eeb33e4..7fe614c3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7ea4b5 "textureDimensions_7ea4b5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7ea4b5 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_7ea4b5 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_7ea4b5
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_7ea4b5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_7ea4b5
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_7ea4b5
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_7ea4b5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_7ea4b5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.wgsl
index 9fd1368..04a7f43 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7ea4b5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8sint, read_write>;
 
-fn textureDimensions_7ea4b5() {
+fn textureDimensions_7ea4b5() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7ea4b5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce = textureDimensions_7ea4b5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7ea4b5();
+  prevent_dce = textureDimensions_7ea4b5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7ea4b5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl
index 4a38dd2..a59b12d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16uint, read>) -> vec2<u32>
-fn textureDimensions_7edb05() {
+fn textureDimensions_7edb05() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7edb05();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7edb05();
+  prevent_dce = textureDimensions_7edb05();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7edb05();
+  prevent_dce = textureDimensions_7edb05();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7edb05();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.dxc.hlsl
index 3cc7970..a27563f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7edb05() {
+uint2 textureDimensions_7edb05() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7edb05();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7edb05();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7edb05()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7edb05();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7edb05()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7edb05();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.fxc.hlsl
index 3cc7970..a27563f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_7edb05() {
+uint2 textureDimensions_7edb05() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_7edb05();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_7edb05();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7edb05()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_7edb05();
+  prevent_dce.Store2(0u, asuint(textureDimensions_7edb05()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_7edb05();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.glsl
index b4cc3ec..2d3247c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp readonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_7edb05() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_7edb05();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_7edb05() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_7edb05() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_7edb05();
+  prevent_dce.inner = textureDimensions_7edb05();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_7edb05() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_7edb05() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_7edb05();
+  prevent_dce.inner = textureDimensions_7edb05();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_7edb05() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_7edb05();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.msl
index cb6b073..635086b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_7edb05(texture2d_array<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_7edb05(texture2d_array<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_7edb05(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_7edb05(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_7edb05(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_7edb05(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_7edb05(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_7edb05(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.spvasm
index 21e3776..2dd5090 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_7edb05 "textureDimensions_7edb05"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_7edb05 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_7edb05 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_7edb05
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_7edb05
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_7edb05
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_7edb05
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_7edb05
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_7edb05
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.wgsl
index e3ed291..96cf95a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/7edb05.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16uint, read>;
 
-fn textureDimensions_7edb05() {
+fn textureDimensions_7edb05() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7edb05();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_7edb05();
+  prevent_dce = textureDimensions_7edb05();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_7edb05();
+  prevent_dce = textureDimensions_7edb05();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_7edb05();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl
index 976cff2..ba02d1e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<bgra8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<bgra8unorm, read>) -> vec3<u32>
-fn textureDimensions_8057cb() {
+fn textureDimensions_8057cb() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8057cb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8057cb();
+  prevent_dce = textureDimensions_8057cb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8057cb();
+  prevent_dce = textureDimensions_8057cb();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8057cb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.dxc.hlsl
index e99a6d2..e606ad9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8057cb() {
+uint3 textureDimensions_8057cb() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8057cb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8057cb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8057cb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8057cb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8057cb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8057cb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.fxc.hlsl
index e99a6d2..e606ad9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8057cb() {
+uint3 textureDimensions_8057cb() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8057cb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8057cb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8057cb()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8057cb();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8057cb()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8057cb();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.glsl
index 9009e12..8bc5dd5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_8057cb() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8057cb();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_8057cb() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_8057cb() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_8057cb();
+  prevent_dce.inner = textureDimensions_8057cb();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_8057cb() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_8057cb() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_8057cb();
+  prevent_dce.inner = textureDimensions_8057cb();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_8057cb() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_8057cb();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.msl
index bcf8c18..1b8b9e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8057cb(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_8057cb(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_8057cb(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_8057cb(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_8057cb(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8057cb(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8057cb(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8057cb(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.spvasm
index 63bcdf4..16682ca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8057cb "textureDimensions_8057cb"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8057cb = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_8057cb = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_8057cb
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8057cb
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_8057cb
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_8057cb
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8057cb
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8057cb
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.wgsl
index 8e6c611..7c07936 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8057cb.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<bgra8unorm, read>;
 
-fn textureDimensions_8057cb() {
+fn textureDimensions_8057cb() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8057cb();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8057cb();
+  prevent_dce = textureDimensions_8057cb();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8057cb();
+  prevent_dce = textureDimensions_8057cb();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8057cb();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl
index fd28e07..4d51a77 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<bgra8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<bgra8unorm, read_write>) -> vec3<u32>
-fn textureDimensions_8243a1() {
+fn textureDimensions_8243a1() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8243a1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8243a1();
+  prevent_dce = textureDimensions_8243a1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8243a1();
+  prevent_dce = textureDimensions_8243a1();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8243a1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.dxc.hlsl
index e28c072..e349c9d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8243a1() {
+uint3 textureDimensions_8243a1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8243a1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8243a1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8243a1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8243a1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8243a1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8243a1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.fxc.hlsl
index e28c072..e349c9d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8243a1() {
+uint3 textureDimensions_8243a1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8243a1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8243a1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8243a1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8243a1();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8243a1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8243a1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.glsl
index 18a6326..9ddafb9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_8243a1() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8243a1();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_8243a1() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_8243a1() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_8243a1();
+  prevent_dce.inner = textureDimensions_8243a1();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_8243a1() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_8243a1() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_8243a1();
+  prevent_dce.inner = textureDimensions_8243a1();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_8243a1() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_8243a1();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.msl
index 22181a2..fb90328 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8243a1(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_8243a1(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_8243a1(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_8243a1(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_8243a1(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8243a1(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8243a1(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8243a1(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.spvasm
index 34d9e68..41fc4d3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8243a1 "textureDimensions_8243a1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8243a1 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_8243a1 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_8243a1
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8243a1
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_8243a1
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_8243a1
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8243a1
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8243a1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.wgsl
index 08b5900..5a38759 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8243a1.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<bgra8unorm, read_write>;
 
-fn textureDimensions_8243a1() {
+fn textureDimensions_8243a1() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8243a1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8243a1();
+  prevent_dce = textureDimensions_8243a1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8243a1();
+  prevent_dce = textureDimensions_8243a1();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8243a1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl
index c0504d6..1fafbc6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32sint, read_write>) -> vec2<u32>
-fn textureDimensions_835f90() {
+fn textureDimensions_835f90() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_835f90();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_835f90();
+  prevent_dce = textureDimensions_835f90();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_835f90();
+  prevent_dce = textureDimensions_835f90();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_835f90();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.dxc.hlsl
index a20313f..5a243cd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_835f90() {
+uint2 textureDimensions_835f90() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_835f90();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_835f90();
+  prevent_dce.Store2(0u, asuint(textureDimensions_835f90()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_835f90();
+  prevent_dce.Store2(0u, asuint(textureDimensions_835f90()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_835f90();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.fxc.hlsl
index a20313f..5a243cd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_835f90() {
+uint2 textureDimensions_835f90() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_835f90();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_835f90();
+  prevent_dce.Store2(0u, asuint(textureDimensions_835f90()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_835f90();
+  prevent_dce.Store2(0u, asuint(textureDimensions_835f90()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_835f90();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.msl
index 273b59f..232f4e3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_835f90(texture2d<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_835f90(texture2d<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_835f90(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_835f90(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_835f90(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_835f90(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_835f90(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_835f90(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.spvasm
index 0a5db9b..79437fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_835f90 "textureDimensions_835f90"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_835f90 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_835f90 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_835f90
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_835f90
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_835f90
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_835f90
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_835f90
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_835f90
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.wgsl
index 118f466..164dd3f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/835f90.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32sint, read_write>;
 
-fn textureDimensions_835f90() {
+fn textureDimensions_835f90() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_835f90();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_835f90();
+  prevent_dce = textureDimensions_835f90();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_835f90();
+  prevent_dce = textureDimensions_835f90();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_835f90();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl
index c281b23..9978dda 100644
--- a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8sint, read>) -> u32
-fn textureDimensions_841ebe() {
+fn textureDimensions_841ebe() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_841ebe();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_841ebe();
+  prevent_dce = textureDimensions_841ebe();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_841ebe();
+  prevent_dce = textureDimensions_841ebe();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_841ebe();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.dxc.hlsl
index 10603e2..624efaa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_841ebe() {
+uint textureDimensions_841ebe() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_841ebe();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_841ebe();
+  prevent_dce.Store(0u, asuint(textureDimensions_841ebe()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_841ebe();
+  prevent_dce.Store(0u, asuint(textureDimensions_841ebe()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_841ebe();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.fxc.hlsl
index 10603e2..624efaa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_841ebe() {
+uint textureDimensions_841ebe() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_841ebe();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_841ebe();
+  prevent_dce.Store(0u, asuint(textureDimensions_841ebe()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_841ebe();
+  prevent_dce.Store(0u, asuint(textureDimensions_841ebe()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_841ebe();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.glsl
index 1e1b0c2..3e87fb7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_841ebe() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_841ebe();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_841ebe() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_841ebe() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_841ebe();
+  prevent_dce.inner = textureDimensions_841ebe();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_841ebe() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_841ebe() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_841ebe();
+  prevent_dce.inner = textureDimensions_841ebe();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_841ebe() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_841ebe();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.msl
index 4a333b4..e93187a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_841ebe(texture1d<int, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_841ebe(texture1d<int, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_841ebe(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_841ebe(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_841ebe(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_841ebe(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_841ebe(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_841ebe(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.spvasm
index cb2ceb4..30d0021 100644
--- a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_841ebe "textureDimensions_841ebe"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_841ebe = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_841ebe = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_841ebe
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_841ebe
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_841ebe
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_841ebe
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_841ebe
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_841ebe
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.wgsl
index 4822bb7..a89146f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/841ebe.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8sint, read>;
 
-fn textureDimensions_841ebe() {
+fn textureDimensions_841ebe() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_841ebe();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_841ebe();
+  prevent_dce = textureDimensions_841ebe();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_841ebe();
+  prevent_dce = textureDimensions_841ebe();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_841ebe();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl
index 64c8938..2873057 100644
--- a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<bgra8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<bgra8unorm, write>) -> u32
-fn textureDimensions_84f363() {
+fn textureDimensions_84f363() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_84f363();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_84f363();
+  prevent_dce = textureDimensions_84f363();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_84f363();
+  prevent_dce = textureDimensions_84f363();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_84f363();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.dxc.hlsl
index bd53d10..0b839e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_84f363() {
+uint textureDimensions_84f363() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_84f363();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_84f363();
+  prevent_dce.Store(0u, asuint(textureDimensions_84f363()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_84f363();
+  prevent_dce.Store(0u, asuint(textureDimensions_84f363()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_84f363();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.fxc.hlsl
index bd53d10..0b839e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_84f363() {
+uint textureDimensions_84f363() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_84f363();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_84f363();
+  prevent_dce.Store(0u, asuint(textureDimensions_84f363()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_84f363();
+  prevent_dce.Store(0u, asuint(textureDimensions_84f363()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_84f363();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.glsl
index 50dac2a..b270078 100644
--- a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_84f363() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_84f363();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_84f363() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_84f363() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_84f363();
+  prevent_dce.inner = textureDimensions_84f363();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_84f363() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_84f363() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_84f363();
+  prevent_dce.inner = textureDimensions_84f363();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_84f363() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_84f363();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.msl
index c6f246a..67ba6ca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_84f363(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_84f363(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_84f363(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_84f363(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_84f363(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_84f363(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_84f363(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_84f363(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.spvasm
index 0b4c1cd..a2d0524 100644
--- a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_84f363 "textureDimensions_84f363"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_84f363 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_84f363 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_84f363
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_84f363
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_84f363
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_84f363
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_84f363
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_84f363
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.wgsl
index 8a3fd51..c932f7c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/84f363.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<bgra8unorm, write>;
 
-fn textureDimensions_84f363() {
+fn textureDimensions_84f363() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_84f363();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_84f363();
+  prevent_dce = textureDimensions_84f363();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_84f363();
+  prevent_dce = textureDimensions_84f363();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_84f363();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl
index 383d63b..1cc1a53 100644
--- a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8snorm, write>) -> vec2<u32>
-fn textureDimensions_867ead() {
+fn textureDimensions_867ead() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_867ead();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_867ead();
+  prevent_dce = textureDimensions_867ead();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_867ead();
+  prevent_dce = textureDimensions_867ead();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_867ead();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.dxc.hlsl
index 5a613e1..d7a8cb8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_867ead() {
+uint2 textureDimensions_867ead() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_867ead();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_867ead();
+  prevent_dce.Store2(0u, asuint(textureDimensions_867ead()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_867ead();
+  prevent_dce.Store2(0u, asuint(textureDimensions_867ead()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_867ead();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.fxc.hlsl
index 5a613e1..d7a8cb8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_867ead() {
+uint2 textureDimensions_867ead() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_867ead();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_867ead();
+  prevent_dce.Store2(0u, asuint(textureDimensions_867ead()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_867ead();
+  prevent_dce.Store2(0u, asuint(textureDimensions_867ead()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_867ead();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.glsl
index c32faa0..78869c6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_867ead() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_867ead();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_867ead() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_867ead() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_867ead();
+  prevent_dce.inner = textureDimensions_867ead();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_867ead() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_867ead() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_867ead();
+  prevent_dce.inner = textureDimensions_867ead();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_867ead() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_867ead();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.msl
index 53c9ef9..3233ada 100644
--- a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_867ead(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_867ead(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_867ead(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_867ead(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_867ead(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_867ead(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_867ead(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_867ead(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.spvasm
index d7f86ed..9d27ed8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_867ead "textureDimensions_867ead"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_867ead = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_867ead = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_867ead
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_867ead
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_867ead
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_867ead
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_867ead
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_867ead
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.wgsl
index aa25992..6fe3c09 100644
--- a/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/867ead.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8snorm, write>;
 
-fn textureDimensions_867ead() {
+fn textureDimensions_867ead() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_867ead();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_867ead();
+  prevent_dce = textureDimensions_867ead();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_867ead();
+  prevent_dce = textureDimensions_867ead();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_867ead();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl
index ab991c9..0e5386d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<f32>;
 
 // fn textureDimensions(texture: texture_cube_array<f32>) -> vec2<u32>
-fn textureDimensions_879b73() {
+fn textureDimensions_879b73() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_879b73();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_879b73();
+  prevent_dce = textureDimensions_879b73();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_879b73();
+  prevent_dce = textureDimensions_879b73();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_879b73();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.dxc.hlsl
index 1461f6a..b8d3508 100644
--- a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_879b73() {
+uint2 textureDimensions_879b73() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_879b73();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_879b73();
+  prevent_dce.Store2(0u, asuint(textureDimensions_879b73()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_879b73();
+  prevent_dce.Store2(0u, asuint(textureDimensions_879b73()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_879b73();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.fxc.hlsl
index 1461f6a..b8d3508 100644
--- a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_879b73() {
+uint2 textureDimensions_879b73() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_879b73();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_879b73();
+  prevent_dce.Store2(0u, asuint(textureDimensions_879b73()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_879b73();
+  prevent_dce.Store2(0u, asuint(textureDimensions_879b73()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_879b73();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.msl
index 99cb052..fbb3e44 100644
--- a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_879b73(texturecube_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_879b73(texturecube_array<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_879b73(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_879b73(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_879b73(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_879b73(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_879b73(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_879b73(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.spvasm
index f6f7d49..2651b76 100644
--- a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,76 +21,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_879b73 "textureDimensions_879b73"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_879b73 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v3uint %24 %int_0
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_879b73 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v3uint %26 %int_0
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_879b73
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_879b73
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_879b73
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_879b73
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_879b73
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_879b73
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.wgsl
index 1f03510..fbedacd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/879b73.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
-fn textureDimensions_879b73() {
+fn textureDimensions_879b73() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_879b73();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_879b73();
+  prevent_dce = textureDimensions_879b73();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_879b73();
+  prevent_dce = textureDimensions_879b73();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_879b73();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl
index 9b73e1a..5f260e6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32uint, read>) -> vec2<u32>
-fn textureDimensions_87b42d() {
+fn textureDimensions_87b42d() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_87b42d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_87b42d();
+  prevent_dce = textureDimensions_87b42d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_87b42d();
+  prevent_dce = textureDimensions_87b42d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_87b42d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.dxc.hlsl
index 2f2dc58..6b56a36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_87b42d() {
+uint2 textureDimensions_87b42d() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_87b42d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_87b42d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_87b42d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_87b42d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_87b42d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_87b42d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.fxc.hlsl
index 2f2dc58..6b56a36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_87b42d() {
+uint2 textureDimensions_87b42d() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_87b42d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_87b42d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_87b42d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_87b42d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_87b42d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_87b42d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.glsl
index a94c8e1..f5059fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp readonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_87b42d() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_87b42d();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_87b42d() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_87b42d() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_87b42d();
+  prevent_dce.inner = textureDimensions_87b42d();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_87b42d() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_87b42d() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_87b42d();
+  prevent_dce.inner = textureDimensions_87b42d();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32ui) uniform highp readonly uimage2DArray arg_0;
+uvec2 textureDimensions_87b42d() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_87b42d();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.msl
index 46d061a..b1e1c45 100644
--- a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_87b42d(texture2d_array<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_87b42d(texture2d_array<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_87b42d(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_87b42d(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_87b42d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_87b42d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_87b42d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_87b42d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.spvasm
index cf3cdf8..a397073 100644
--- a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_87b42d "textureDimensions_87b42d"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_87b42d = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_87b42d = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_87b42d
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_87b42d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_87b42d
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_87b42d
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_87b42d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_87b42d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.wgsl
index 2b85019..afb0532 100644
--- a/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/87b42d.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32uint, read>;
 
-fn textureDimensions_87b42d() {
+fn textureDimensions_87b42d() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_87b42d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_87b42d();
+  prevent_dce = textureDimensions_87b42d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_87b42d();
+  prevent_dce = textureDimensions_87b42d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_87b42d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl
index 63671d6..f519406 100644
--- a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8unorm, read>) -> vec2<u32>
-fn textureDimensions_881dd4() {
+fn textureDimensions_881dd4() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_881dd4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_881dd4();
+  prevent_dce = textureDimensions_881dd4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_881dd4();
+  prevent_dce = textureDimensions_881dd4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_881dd4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.dxc.hlsl
index 22bf658..9f540f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_881dd4() {
+uint2 textureDimensions_881dd4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_881dd4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_881dd4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_881dd4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_881dd4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_881dd4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_881dd4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.fxc.hlsl
index 22bf658..9f540f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_881dd4() {
+uint2 textureDimensions_881dd4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_881dd4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_881dd4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_881dd4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_881dd4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_881dd4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_881dd4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.glsl
index 3b1176f..f62bc9b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_881dd4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_881dd4();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_881dd4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_881dd4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_881dd4();
+  prevent_dce.inner = textureDimensions_881dd4();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_881dd4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_881dd4() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_881dd4();
+  prevent_dce.inner = textureDimensions_881dd4();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_881dd4() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_881dd4();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.msl
index 6e4ea66..b644830 100644
--- a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_881dd4(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_881dd4(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_881dd4(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_881dd4(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_881dd4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_881dd4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_881dd4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_881dd4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.spvasm
index 8f3723e..0d7ab89 100644
--- a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_881dd4 "textureDimensions_881dd4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_881dd4 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_881dd4 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_881dd4
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_881dd4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_881dd4
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_881dd4
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_881dd4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_881dd4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.wgsl
index b97309a..0534b774 100644
--- a/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/881dd4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8unorm, read>;
 
-fn textureDimensions_881dd4() {
+fn textureDimensions_881dd4() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_881dd4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_881dd4();
+  prevent_dce = textureDimensions_881dd4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_881dd4();
+  prevent_dce = textureDimensions_881dd4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_881dd4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl
index df6c228..2f6342d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32sint, read_write>) -> u32
-fn textureDimensions_8a2b17() {
+fn textureDimensions_8a2b17() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8a2b17();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8a2b17();
+  prevent_dce = textureDimensions_8a2b17();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8a2b17();
+  prevent_dce = textureDimensions_8a2b17();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8a2b17();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.dxc.hlsl
index 6517412..c7f2595 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8a2b17() {
+uint textureDimensions_8a2b17() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8a2b17();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8a2b17();
+  prevent_dce.Store(0u, asuint(textureDimensions_8a2b17()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8a2b17();
+  prevent_dce.Store(0u, asuint(textureDimensions_8a2b17()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8a2b17();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.fxc.hlsl
index 6517412..c7f2595 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8a2b17() {
+uint textureDimensions_8a2b17() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8a2b17();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8a2b17();
+  prevent_dce.Store(0u, asuint(textureDimensions_8a2b17()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8a2b17();
+  prevent_dce.Store(0u, asuint(textureDimensions_8a2b17()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8a2b17();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.glsl
index d1d2a28..9347193 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_8a2b17() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8a2b17();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_8a2b17() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_8a2b17() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_8a2b17();
+  prevent_dce.inner = textureDimensions_8a2b17();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_8a2b17() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_8a2b17() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_8a2b17();
+  prevent_dce.inner = textureDimensions_8a2b17();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_8a2b17() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_8a2b17();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.msl
index 51cb65a..bfc08a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8a2b17(texture1d<int, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_8a2b17(texture1d<int, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_8a2b17(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_8a2b17(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_8a2b17(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8a2b17(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8a2b17(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8a2b17(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.spvasm
index 216e527..19150f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8a2b17 "textureDimensions_8a2b17"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8a2b17 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_8a2b17 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_8a2b17
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8a2b17
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_8a2b17
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_8a2b17
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8a2b17
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8a2b17
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.wgsl
index 3372682..1dcf978 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a2b17.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32sint, read_write>;
 
-fn textureDimensions_8a2b17() {
+fn textureDimensions_8a2b17() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8a2b17();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8a2b17();
+  prevent_dce = textureDimensions_8a2b17();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8a2b17();
+  prevent_dce = textureDimensions_8a2b17();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8a2b17();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl
index 49d9210..0daf7b4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32float, write>) -> vec2<u32>
-fn textureDimensions_8a35f9() {
+fn textureDimensions_8a35f9() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8a35f9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8a35f9();
+  prevent_dce = textureDimensions_8a35f9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8a35f9();
+  prevent_dce = textureDimensions_8a35f9();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8a35f9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.dxc.hlsl
index 651d729..a8601a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8a35f9() {
+uint2 textureDimensions_8a35f9() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8a35f9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8a35f9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8a35f9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8a35f9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8a35f9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8a35f9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.fxc.hlsl
index 651d729..a8601a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8a35f9() {
+uint2 textureDimensions_8a35f9() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8a35f9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8a35f9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8a35f9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8a35f9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8a35f9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8a35f9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.msl
index 6742474..eae579b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8a35f9(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_8a35f9(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_8a35f9(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_8a35f9(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_8a35f9(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8a35f9(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8a35f9(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8a35f9(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.spvasm
index 2175604..c4a0ee2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8a35f9 "textureDimensions_8a35f9"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8a35f9 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_8a35f9 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_8a35f9
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8a35f9
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_8a35f9
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_8a35f9
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8a35f9
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8a35f9
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.wgsl
index ac32635..35760f9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8a35f9.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32float, write>;
 
-fn textureDimensions_8a35f9() {
+fn textureDimensions_8a35f9() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8a35f9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8a35f9();
+  prevent_dce = textureDimensions_8a35f9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8a35f9();
+  prevent_dce = textureDimensions_8a35f9();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8a35f9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl
index b1d858b..8a7c254 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r8unorm, read>) -> vec2<u32>
-fn textureDimensions_8af728() {
+fn textureDimensions_8af728() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8af728();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8af728();
+  prevent_dce = textureDimensions_8af728();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8af728();
+  prevent_dce = textureDimensions_8af728();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8af728();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.dxc.hlsl
index a057749..4800352 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8af728() {
+uint2 textureDimensions_8af728() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8af728();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8af728();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8af728()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8af728();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8af728()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8af728();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.fxc.hlsl
index a057749..4800352 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8af728() {
+uint2 textureDimensions_8af728() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8af728();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8af728();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8af728()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8af728();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8af728()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8af728();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.msl
index da4be3e..bfdba07 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8af728(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_8af728(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_8af728(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_8af728(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_8af728(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8af728(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8af728(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8af728(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.spvasm
index 9864468..d4a0b51 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,75 +21,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8af728 "textureDimensions_8af728"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8af728 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_8af728 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_8af728
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_8af728
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_8af728
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_8af728
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_8af728
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_8af728
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.wgsl
index a4213da..7be68c7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8af728.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r8unorm, read>;
 
-fn textureDimensions_8af728() {
+fn textureDimensions_8af728() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8af728();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8af728();
+  prevent_dce = textureDimensions_8af728();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8af728();
+  prevent_dce = textureDimensions_8af728();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8af728();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl
index 2e8467c..2dbe6e6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8uint, read_write>) -> vec3<u32>
-fn textureDimensions_8b9906() {
+fn textureDimensions_8b9906() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8b9906();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8b9906();
+  prevent_dce = textureDimensions_8b9906();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8b9906();
+  prevent_dce = textureDimensions_8b9906();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8b9906();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.dxc.hlsl
index 7ea7200..0ffbdd8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8b9906() {
+uint3 textureDimensions_8b9906() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8b9906();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8b9906();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8b9906()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8b9906();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8b9906()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8b9906();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.fxc.hlsl
index 7ea7200..0ffbdd8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8b9906() {
+uint3 textureDimensions_8b9906() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8b9906();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8b9906();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8b9906()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8b9906();
+  prevent_dce.Store3(0u, asuint(textureDimensions_8b9906()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8b9906();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.glsl
index 7f86988..ed2ec4e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_8b9906() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8b9906();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_8b9906() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_8b9906() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_8b9906();
+  prevent_dce.inner = textureDimensions_8b9906();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_8b9906() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_8b9906() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_8b9906();
+  prevent_dce.inner = textureDimensions_8b9906();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_8b9906() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_8b9906();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.msl
index 6e290ec..1775660 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8b9906(texture3d<uint, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_8b9906(texture3d<uint, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_8b9906(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_8b9906(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_8b9906(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8b9906(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8b9906(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8b9906(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.spvasm
index 4eb41e2..e729f4b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8b9906 "textureDimensions_8b9906"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8b9906 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_8b9906 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_8b9906
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8b9906
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_8b9906
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_8b9906
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8b9906
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8b9906
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.wgsl
index d57d855..b1b0112 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8b9906.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8uint, read_write>;
 
-fn textureDimensions_8b9906() {
+fn textureDimensions_8b9906() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8b9906();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8b9906();
+  prevent_dce = textureDimensions_8b9906();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8b9906();
+  prevent_dce = textureDimensions_8b9906();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8b9906();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl
index 12d446b..c3e0642 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8snorm, read_write>) -> vec2<u32>
-fn textureDimensions_8bd369() {
+fn textureDimensions_8bd369() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8bd369();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8bd369();
+  prevent_dce = textureDimensions_8bd369();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8bd369();
+  prevent_dce = textureDimensions_8bd369();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8bd369();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.dxc.hlsl
index ffd28f4..8c87873 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8bd369() {
+uint2 textureDimensions_8bd369() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8bd369();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8bd369();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8bd369()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8bd369();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8bd369()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8bd369();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.fxc.hlsl
index ffd28f4..8c87873 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8bd369() {
+uint2 textureDimensions_8bd369() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8bd369();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8bd369();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8bd369()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8bd369();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8bd369()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8bd369();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.glsl
index e3f37bf..6f240cc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_8bd369() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8bd369();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_8bd369() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_8bd369() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_8bd369();
+  prevent_dce.inner = textureDimensions_8bd369();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_8bd369() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_8bd369() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_8bd369();
+  prevent_dce.inner = textureDimensions_8bd369();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_8bd369() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_8bd369();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.msl
index 5f1af28..34023ae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8bd369(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_8bd369(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_8bd369(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_8bd369(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_8bd369(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8bd369(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8bd369(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8bd369(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.spvasm
index ec10b20..2c31319 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8bd369 "textureDimensions_8bd369"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8bd369 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_8bd369 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_8bd369
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_8bd369
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_8bd369
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_8bd369
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_8bd369
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_8bd369
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.wgsl
index ec3e95e..e4d6144 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8bd369.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8snorm, read_write>;
 
-fn textureDimensions_8bd369() {
+fn textureDimensions_8bd369() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8bd369();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8bd369();
+  prevent_dce = textureDimensions_8bd369();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8bd369();
+  prevent_dce = textureDimensions_8bd369();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8bd369();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl
index ffb2da5..f522243 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32uint, read>) -> vec2<u32>
-fn textureDimensions_8e15f4() {
+fn textureDimensions_8e15f4() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8e15f4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8e15f4();
+  prevent_dce = textureDimensions_8e15f4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8e15f4();
+  prevent_dce = textureDimensions_8e15f4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8e15f4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.dxc.hlsl
index 4b9942e..c06c59f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8e15f4() {
+uint2 textureDimensions_8e15f4() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8e15f4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8e15f4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8e15f4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8e15f4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8e15f4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8e15f4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.fxc.hlsl
index 4b9942e..c06c59f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8e15f4() {
+uint2 textureDimensions_8e15f4() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8e15f4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8e15f4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8e15f4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8e15f4();
+  prevent_dce.Store2(0u, asuint(textureDimensions_8e15f4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8e15f4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.msl
index 2a513ab..a28a817 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8e15f4(texture2d<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_8e15f4(texture2d<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_8e15f4(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_8e15f4(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_8e15f4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8e15f4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8e15f4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8e15f4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.spvasm
index ee61a3d..8f7d841 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8e15f4 "textureDimensions_8e15f4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8e15f4 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_8e15f4 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_8e15f4
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8e15f4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_8e15f4
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_8e15f4
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8e15f4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8e15f4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.wgsl
index 41c3303..e4e678a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e15f4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32uint, read>;
 
-fn textureDimensions_8e15f4() {
+fn textureDimensions_8e15f4() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8e15f4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8e15f4();
+  prevent_dce = textureDimensions_8e15f4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8e15f4();
+  prevent_dce = textureDimensions_8e15f4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8e15f4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl
index 8bed195..bcbb636 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32sint, read>) -> u32
-fn textureDimensions_8e5de6() {
+fn textureDimensions_8e5de6() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8e5de6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8e5de6();
+  prevent_dce = textureDimensions_8e5de6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8e5de6();
+  prevent_dce = textureDimensions_8e5de6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8e5de6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.dxc.hlsl
index 381c7f1..181bebc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8e5de6() {
+uint textureDimensions_8e5de6() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8e5de6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8e5de6();
+  prevent_dce.Store(0u, asuint(textureDimensions_8e5de6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8e5de6();
+  prevent_dce.Store(0u, asuint(textureDimensions_8e5de6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8e5de6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.fxc.hlsl
index 381c7f1..181bebc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8e5de6() {
+uint textureDimensions_8e5de6() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8e5de6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8e5de6();
+  prevent_dce.Store(0u, asuint(textureDimensions_8e5de6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8e5de6();
+  prevent_dce.Store(0u, asuint(textureDimensions_8e5de6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8e5de6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.glsl
index a4253ae..2034799 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_8e5de6() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8e5de6();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_8e5de6() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_8e5de6() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_8e5de6();
+  prevent_dce.inner = textureDimensions_8e5de6();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_8e5de6() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_8e5de6() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_8e5de6();
+  prevent_dce.inner = textureDimensions_8e5de6();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_8e5de6() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_8e5de6();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.msl
index 10f98b6..d7494e6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8e5de6(texture1d<int, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_8e5de6(texture1d<int, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_8e5de6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_8e5de6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_8e5de6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8e5de6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8e5de6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8e5de6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.spvasm
index 13ba65c..a9b5597 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8e5de6 "textureDimensions_8e5de6"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 R32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8e5de6 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_8e5de6 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_8e5de6
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8e5de6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_8e5de6
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_8e5de6
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8e5de6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8e5de6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.wgsl
index 6a5ac68..572a2a0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8e5de6.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32sint, read>;
 
-fn textureDimensions_8e5de6() {
+fn textureDimensions_8e5de6() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8e5de6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8e5de6();
+  prevent_dce = textureDimensions_8e5de6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8e5de6();
+  prevent_dce = textureDimensions_8e5de6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8e5de6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl
index 3021b8b..c690618 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32sint, write>) -> u32
-fn textureDimensions_8efd47() {
+fn textureDimensions_8efd47() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8efd47();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8efd47();
+  prevent_dce = textureDimensions_8efd47();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8efd47();
+  prevent_dce = textureDimensions_8efd47();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8efd47();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.dxc.hlsl
index e890060..5898703 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8efd47() {
+uint textureDimensions_8efd47() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8efd47();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8efd47();
+  prevent_dce.Store(0u, asuint(textureDimensions_8efd47()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8efd47();
+  prevent_dce.Store(0u, asuint(textureDimensions_8efd47()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8efd47();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.fxc.hlsl
index e890060..5898703 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_8efd47() {
+uint textureDimensions_8efd47() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_8efd47();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_8efd47();
+  prevent_dce.Store(0u, asuint(textureDimensions_8efd47()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_8efd47();
+  prevent_dce.Store(0u, asuint(textureDimensions_8efd47()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_8efd47();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.glsl
index 7db2772..8564b03 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_8efd47() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8efd47();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_8efd47() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_8efd47() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_8efd47();
+  prevent_dce.inner = textureDimensions_8efd47();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_8efd47() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_8efd47() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_8efd47();
+  prevent_dce.inner = textureDimensions_8efd47();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_8efd47() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_8efd47();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.msl
index 2db510c..5ed4fe7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_8efd47(texture1d<int, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_8efd47(texture1d<int, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_8efd47(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_8efd47(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_8efd47(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_8efd47(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_8efd47(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_8efd47(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.spvasm
index 4e710ec..1b3d1ca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_8efd47 "textureDimensions_8efd47"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_8efd47 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_8efd47 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_8efd47
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_8efd47
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_8efd47
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_8efd47
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_8efd47
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_8efd47
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.wgsl
index 4d79064..4bc96cd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/8efd47.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32sint, write>;
 
-fn textureDimensions_8efd47() {
+fn textureDimensions_8efd47() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8efd47();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_8efd47();
+  prevent_dce = textureDimensions_8efd47();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_8efd47();
+  prevent_dce = textureDimensions_8efd47();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_8efd47();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl
index 0d44cee..51f7d67 100644
--- a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32float, write>) -> vec3<u32>
-fn textureDimensions_902179() {
+fn textureDimensions_902179() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_902179();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_902179();
+  prevent_dce = textureDimensions_902179();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_902179();
+  prevent_dce = textureDimensions_902179();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_902179();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.dxc.hlsl
index dcbd8c7..52baa84 100644
--- a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_902179() {
+uint3 textureDimensions_902179() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_902179();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_902179();
+  prevent_dce.Store3(0u, asuint(textureDimensions_902179()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_902179();
+  prevent_dce.Store3(0u, asuint(textureDimensions_902179()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_902179();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.fxc.hlsl
index dcbd8c7..52baa84 100644
--- a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_902179() {
+uint3 textureDimensions_902179() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_902179();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_902179();
+  prevent_dce.Store3(0u, asuint(textureDimensions_902179()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_902179();
+  prevent_dce.Store3(0u, asuint(textureDimensions_902179()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_902179();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.glsl
index 44bd150..9d08d87 100644
--- a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32f) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_902179() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_902179();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_902179() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_902179() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_902179();
+  prevent_dce.inner = textureDimensions_902179();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_902179() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_902179() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_902179();
+  prevent_dce.inner = textureDimensions_902179();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_902179() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_902179();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.msl
index 5810dfc..9120402 100644
--- a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_902179(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_902179(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_902179(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_902179(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_902179(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_902179(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_902179(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_902179(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.spvasm
index 431b4dc..4ab9c75 100644
--- a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_902179 "textureDimensions_902179"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 R32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_902179 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_902179 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_902179
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_902179
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_902179
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_902179
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_902179
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_902179
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.wgsl
index 96e9ba7..7764539 100644
--- a/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/902179.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32float, write>;
 
-fn textureDimensions_902179() {
+fn textureDimensions_902179() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_902179();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_902179();
+  prevent_dce = textureDimensions_902179();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_902179();
+  prevent_dce = textureDimensions_902179();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_902179();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl
index 61a8656..9e296b7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16sint, read>) -> vec2<u32>
-fn textureDimensions_904b0f() {
+fn textureDimensions_904b0f() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_904b0f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_904b0f();
+  prevent_dce = textureDimensions_904b0f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_904b0f();
+  prevent_dce = textureDimensions_904b0f();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_904b0f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.dxc.hlsl
index 5a3a07e..e34af49 100644
--- a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_904b0f() {
+uint2 textureDimensions_904b0f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_904b0f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_904b0f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_904b0f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_904b0f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_904b0f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_904b0f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.fxc.hlsl
index 5a3a07e..e34af49 100644
--- a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_904b0f() {
+uint2 textureDimensions_904b0f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_904b0f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_904b0f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_904b0f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_904b0f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_904b0f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_904b0f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.glsl
index f422cb9..c7f66b6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp readonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_904b0f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_904b0f();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_904b0f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_904b0f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_904b0f();
+  prevent_dce.inner = textureDimensions_904b0f();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_904b0f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_904b0f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_904b0f();
+  prevent_dce.inner = textureDimensions_904b0f();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_904b0f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_904b0f();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.msl
index ec71160..3530cdd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_904b0f(texture2d_array<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_904b0f(texture2d_array<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_904b0f(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_904b0f(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_904b0f(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_904b0f(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_904b0f(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_904b0f(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.spvasm
index 9df5109..2452e68 100644
--- a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_904b0f "textureDimensions_904b0f"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_904b0f = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_904b0f = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_904b0f
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_904b0f
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_904b0f
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_904b0f
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_904b0f
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_904b0f
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.wgsl
index 29bf953..9643cba 100644
--- a/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/904b0f.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16sint, read>;
 
-fn textureDimensions_904b0f() {
+fn textureDimensions_904b0f() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_904b0f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_904b0f();
+  prevent_dce = textureDimensions_904b0f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_904b0f();
+  prevent_dce = textureDimensions_904b0f();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_904b0f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl
index a9261f7..75acb83 100644
--- a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16sint, write>) -> vec2<u32>
-fn textureDimensions_90dd74() {
+fn textureDimensions_90dd74() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_90dd74();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_90dd74();
+  prevent_dce = textureDimensions_90dd74();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_90dd74();
+  prevent_dce = textureDimensions_90dd74();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_90dd74();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.dxc.hlsl
index 0c336b5..d6bcf75 100644
--- a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_90dd74() {
+uint2 textureDimensions_90dd74() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_90dd74();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_90dd74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_90dd74()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_90dd74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_90dd74()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_90dd74();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.fxc.hlsl
index 0c336b5..d6bcf75 100644
--- a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_90dd74() {
+uint2 textureDimensions_90dd74() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_90dd74();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_90dd74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_90dd74()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_90dd74();
+  prevent_dce.Store2(0u, asuint(textureDimensions_90dd74()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_90dd74();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.glsl
index b114547..5b04b8b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_90dd74() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_90dd74();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_90dd74() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_90dd74() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_90dd74();
+  prevent_dce.inner = textureDimensions_90dd74();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_90dd74() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_90dd74() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_90dd74();
+  prevent_dce.inner = textureDimensions_90dd74();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_90dd74() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_90dd74();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.msl
index 81147f3..0c024af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_90dd74(texture2d_array<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_90dd74(texture2d_array<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_90dd74(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_90dd74(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_90dd74(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_90dd74(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_90dd74(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_90dd74(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.spvasm
index e5b3923..319ba2f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_90dd74 "textureDimensions_90dd74"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_90dd74 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_90dd74 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_90dd74
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_90dd74
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_90dd74
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_90dd74
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_90dd74
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_90dd74
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.wgsl
index acb40dd..4cf5239 100644
--- a/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/90dd74.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16sint, write>;
 
-fn textureDimensions_90dd74() {
+fn textureDimensions_90dd74() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_90dd74();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_90dd74();
+  prevent_dce = textureDimensions_90dd74();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_90dd74();
+  prevent_dce = textureDimensions_90dd74();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_90dd74();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl
index 86fadf1..5914336 100644
--- a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32sint, read_write>) -> vec3<u32>
-fn textureDimensions_91e3b4() {
+fn textureDimensions_91e3b4() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_91e3b4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_91e3b4();
+  prevent_dce = textureDimensions_91e3b4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_91e3b4();
+  prevent_dce = textureDimensions_91e3b4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_91e3b4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.dxc.hlsl
index b4e70cc..5da5db2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_91e3b4() {
+uint3 textureDimensions_91e3b4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_91e3b4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_91e3b4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_91e3b4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_91e3b4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_91e3b4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_91e3b4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.fxc.hlsl
index b4e70cc..5da5db2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_91e3b4() {
+uint3 textureDimensions_91e3b4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_91e3b4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_91e3b4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_91e3b4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_91e3b4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_91e3b4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_91e3b4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.msl
index 0a14e0c..c747920 100644
--- a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_91e3b4(texture3d<int, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_91e3b4(texture3d<int, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_91e3b4(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_91e3b4(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_91e3b4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_91e3b4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_91e3b4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_91e3b4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.spvasm
index 1a95e52..7188500 100644
--- a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_91e3b4 "textureDimensions_91e3b4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_91e3b4 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_91e3b4 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_91e3b4
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_91e3b4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_91e3b4
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_91e3b4
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_91e3b4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_91e3b4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.wgsl
index f008ab6..5cb5d36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/91e3b4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32sint, read_write>;
 
-fn textureDimensions_91e3b4() {
+fn textureDimensions_91e3b4() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_91e3b4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_91e3b4();
+  prevent_dce = textureDimensions_91e3b4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_91e3b4();
+  prevent_dce = textureDimensions_91e3b4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_91e3b4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl
index 8d864e9..6845683 100644
--- a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_1d<u32>;
 
 // fn textureDimensions(texture: texture_1d<u32>, level: i32) -> u32
-fn textureDimensions_920006() {
+fn textureDimensions_920006() -> u32{
   var arg_1 = 1i;
   var res: u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_920006();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_920006();
+  prevent_dce = textureDimensions_920006();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_920006();
+  prevent_dce = textureDimensions_920006();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_920006();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.dxc.hlsl
index f4eb46a..070e8e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_920006() {
+uint textureDimensions_920006() {
   int arg_1 = 1;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_920006();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_920006();
+  prevent_dce.Store(0u, asuint(textureDimensions_920006()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_920006();
+  prevent_dce.Store(0u, asuint(textureDimensions_920006()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_920006();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.fxc.hlsl
index f4eb46a..070e8e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_920006() {
+uint textureDimensions_920006() {
   int arg_1 = 1;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_920006();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_920006();
+  prevent_dce.Store(0u, asuint(textureDimensions_920006()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_920006();
+  prevent_dce.Store(0u, asuint(textureDimensions_920006()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_920006();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.glsl
index 4374ab9..8f439fd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_920006() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_920006();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2D arg_0_1;
+uint textureDimensions_920006() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_920006() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_920006();
+  prevent_dce.inner = textureDimensions_920006();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usampler2D arg_0_1;
+uint textureDimensions_920006() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_920006() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_920006();
+  prevent_dce.inner = textureDimensions_920006();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp usampler2D arg_0_1;
+uint textureDimensions_920006() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_920006();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.msl
index 2716c97..16935ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_920006(texture1d<uint, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_920006(texture1d<uint, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_920006(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_920006(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_920006(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_920006(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_920006(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_920006(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.spvasm
index dccc067..f1fa786 100644
--- a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,78 +22,105 @@
                OpName %textureDimensions_920006 "textureDimensions_920006"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %24 = OpConstantNull %int
+         %26 = OpConstantNull %int
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %30 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_920006 = OpFunction %void None %16
-         %19 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %24
-        %res = OpVariable %_ptr_Function_uint Function %30
+%textureDimensions_920006 = OpFunction %uint None %19
+         %21 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %26
+        %res = OpVariable %_ptr_Function_uint Function %9
                OpStore %arg_1 %int_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %int %arg_1
-         %25 = OpImageQuerySizeLod %uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %34 = OpLoad %uint %res
-               OpStore %33 %34
+         %28 = OpLoad %15 %arg_0
+         %29 = OpLoad %int %arg_1
+         %27 = OpImageQuerySizeLod %uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %uint %textureDimensions_920006
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_920006
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %uint %textureDimensions_920006
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %55 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %56 = OpFunctionCall %uint %textureDimensions_920006
+               OpStore %55 %56
+         %57 = OpLoad %VertexOutput %out
+               OpReturnValue %57
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %59 = OpLabel
+         %60 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %61 = OpCompositeExtract %v4float %60 0
+               OpStore %pos_1 %61
+         %62 = OpCompositeExtract %uint %60 1
+               OpStore %prevent_dce_1 %62
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_920006
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_920006
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.wgsl
index d64130a..34cfe46 100644
--- a/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/920006.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_1d<u32>;
 
-fn textureDimensions_920006() {
+fn textureDimensions_920006() -> u32 {
   var arg_1 = 1i;
   var res : u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_920006();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_920006();
+  prevent_dce = textureDimensions_920006();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_920006();
+  prevent_dce = textureDimensions_920006();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_920006();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl
index feb210d..0c250a0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8sint, write>) -> u32
-fn textureDimensions_92552e() {
+fn textureDimensions_92552e() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_92552e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_92552e();
+  prevent_dce = textureDimensions_92552e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_92552e();
+  prevent_dce = textureDimensions_92552e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_92552e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.dxc.hlsl
index 42a8ccd..afdeacc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_92552e() {
+uint textureDimensions_92552e() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_92552e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_92552e();
+  prevent_dce.Store(0u, asuint(textureDimensions_92552e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_92552e();
+  prevent_dce.Store(0u, asuint(textureDimensions_92552e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_92552e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.fxc.hlsl
index 42a8ccd..afdeacc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_92552e() {
+uint textureDimensions_92552e() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_92552e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_92552e();
+  prevent_dce.Store(0u, asuint(textureDimensions_92552e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_92552e();
+  prevent_dce.Store(0u, asuint(textureDimensions_92552e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_92552e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.glsl
index faaf1a1..e66dfe4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_92552e() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_92552e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_92552e() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_92552e() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_92552e();
+  prevent_dce.inner = textureDimensions_92552e();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_92552e() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_92552e() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_92552e();
+  prevent_dce.inner = textureDimensions_92552e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_92552e() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_92552e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.msl
index 73e3e9e..3841a64 100644
--- a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_92552e(texture1d<int, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_92552e(texture1d<int, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_92552e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_92552e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_92552e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_92552e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_92552e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_92552e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.spvasm
index a003355..598bea9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_92552e "textureDimensions_92552e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_92552e = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_92552e = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_92552e
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_92552e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_92552e
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_92552e
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_92552e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_92552e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.wgsl
index ee96d82..7510eea 100644
--- a/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/92552e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8sint, write>;
 
-fn textureDimensions_92552e() {
+fn textureDimensions_92552e() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_92552e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_92552e();
+  prevent_dce = textureDimensions_92552e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_92552e();
+  prevent_dce = textureDimensions_92552e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_92552e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl
index d8030e1..d42a92d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32uint, write>) -> vec2<u32>
-fn textureDimensions_9573f3() {
+fn textureDimensions_9573f3() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9573f3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9573f3();
+  prevent_dce = textureDimensions_9573f3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9573f3();
+  prevent_dce = textureDimensions_9573f3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9573f3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.dxc.hlsl
index e392b5e..b5ef49e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9573f3() {
+uint2 textureDimensions_9573f3() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9573f3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9573f3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9573f3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9573f3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9573f3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9573f3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.fxc.hlsl
index e392b5e..b5ef49e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9573f3() {
+uint2 textureDimensions_9573f3() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9573f3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9573f3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9573f3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9573f3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9573f3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9573f3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.msl
index fbbfdb4..92dbd40 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9573f3(texture2d<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9573f3(texture2d<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9573f3(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9573f3(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9573f3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9573f3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9573f3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9573f3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.spvasm
index 35533d1..9cddcf0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9573f3 "textureDimensions_9573f3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9573f3 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_9573f3 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_9573f3
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_9573f3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_9573f3
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_9573f3
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_9573f3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_9573f3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.wgsl
index db6f380..d0263ed 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9573f3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32uint, write>;
 
-fn textureDimensions_9573f3() {
+fn textureDimensions_9573f3() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9573f3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9573f3();
+  prevent_dce = textureDimensions_9573f3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9573f3();
+  prevent_dce = textureDimensions_9573f3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9573f3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl
index 7c13579..cacf390 100644
--- a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_1d<u32>;
 
 // fn textureDimensions(texture: texture_1d<u32>) -> u32
-fn textureDimensions_965645() {
+fn textureDimensions_965645() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_965645();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_965645();
+  prevent_dce = textureDimensions_965645();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_965645();
+  prevent_dce = textureDimensions_965645();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_965645();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.dxc.hlsl
index f09a850..3ba9c36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_965645() {
+uint textureDimensions_965645() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_965645();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_965645();
+  prevent_dce.Store(0u, asuint(textureDimensions_965645()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_965645();
+  prevent_dce.Store(0u, asuint(textureDimensions_965645()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_965645();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.fxc.hlsl
index f09a850..3ba9c36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_965645() {
+uint textureDimensions_965645() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_965645();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_965645();
+  prevent_dce.Store(0u, asuint(textureDimensions_965645()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_965645();
+  prevent_dce.Store(0u, asuint(textureDimensions_965645()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_965645();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.glsl
index 5c73662..11a6898 100644
--- a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp usampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_965645() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_965645();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2D arg_0_1;
+uint textureDimensions_965645() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_965645() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_965645();
+  prevent_dce.inner = textureDimensions_965645();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp usampler2D arg_0_1;
+uint textureDimensions_965645() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_965645() {
-  uint res = uvec2(textureSize(arg_0_1, 0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_965645();
+  prevent_dce.inner = textureDimensions_965645();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp usampler2D arg_0_1;
+uint textureDimensions_965645() {
+  uint res = uvec2(textureSize(arg_0_1, 0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_965645();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.msl
index 0a2e55d..39b14638 100644
--- a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_965645(texture1d<uint, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_965645(texture1d<uint, access::sample> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_965645(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_965645(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_965645(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_965645(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_965645(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_965645(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.spvasm
index af4716b..5ddf778 100644
--- a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_965645 "textureDimensions_965645"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %26 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_965645 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %26
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySizeLod %uint %21 %int_0
-               OpStore %res %20
-         %29 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %30 = OpLoad %uint %res
-               OpStore %29 %30
+%textureDimensions_965645 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySizeLod %uint %23 %int_0
+               OpStore %res %22
+         %28 = OpLoad %uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %uint %textureDimensions_965645
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_965645
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %uint %textureDimensions_965645
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %52 = OpFunctionCall %uint %textureDimensions_965645
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_965645
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_965645
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.wgsl
index c05ae26..794984c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/965645.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_1d<u32>;
 
-fn textureDimensions_965645() {
+fn textureDimensions_965645() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_965645();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_965645();
+  prevent_dce = textureDimensions_965645();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_965645();
+  prevent_dce = textureDimensions_965645();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_965645();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl
index b440210..f21c80a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<i32>;
 
 // fn textureDimensions(texture: texture_cube_array<i32>) -> vec2<u32>
-fn textureDimensions_98b2d3() {
+fn textureDimensions_98b2d3() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_98b2d3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_98b2d3();
+  prevent_dce = textureDimensions_98b2d3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_98b2d3();
+  prevent_dce = textureDimensions_98b2d3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_98b2d3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.dxc.hlsl
index b3b68dd..8d5c755 100644
--- a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_98b2d3() {
+uint2 textureDimensions_98b2d3() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_98b2d3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_98b2d3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_98b2d3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_98b2d3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_98b2d3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_98b2d3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.fxc.hlsl
index b3b68dd..8d5c755 100644
--- a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_98b2d3() {
+uint2 textureDimensions_98b2d3() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_98b2d3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_98b2d3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_98b2d3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_98b2d3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_98b2d3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_98b2d3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.msl
index 0f9c39b..0dd7331 100644
--- a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_98b2d3(texturecube_array<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_98b2d3(texturecube_array<int, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_98b2d3(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_98b2d3(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_98b2d3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_98b2d3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_98b2d3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_98b2d3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.spvasm
index 968a038..20a27ef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,76 +21,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_98b2d3 "textureDimensions_98b2d3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_98b2d3 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySizeLod %v3uint %25 %int_0
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_98b2d3 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySizeLod %v3uint %27 %int_0
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_98b2d3
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_98b2d3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_98b2d3
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_98b2d3
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_98b2d3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_98b2d3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.wgsl
index c6ef29b..80485dd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/98b2d3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<i32>;
 
-fn textureDimensions_98b2d3() {
+fn textureDimensions_98b2d3() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_98b2d3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_98b2d3();
+  prevent_dce = textureDimensions_98b2d3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_98b2d3();
+  prevent_dce = textureDimensions_98b2d3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_98b2d3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl
index c392877..b845e90 100644
--- a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn textureDimensions(texture: texture_depth_2d, level: u32) -> vec2<u32>
-fn textureDimensions_991ea9() {
+fn textureDimensions_991ea9() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_991ea9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_991ea9();
+  prevent_dce = textureDimensions_991ea9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_991ea9();
+  prevent_dce = textureDimensions_991ea9();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_991ea9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.dxc.hlsl
index 932fb4a..46751e0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_991ea9() {
+uint2 textureDimensions_991ea9() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_991ea9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_991ea9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_991ea9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_991ea9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_991ea9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_991ea9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.fxc.hlsl
index 932fb4a..46751e0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_991ea9() {
+uint2 textureDimensions_991ea9() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_991ea9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_991ea9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_991ea9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_991ea9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_991ea9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_991ea9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.glsl
index 3e56e87..196976a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_991ea9() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_991ea9();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_991ea9() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_991ea9() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_991ea9();
+  prevent_dce.inner = textureDimensions_991ea9();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_991ea9() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_991ea9() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_991ea9();
+  prevent_dce.inner = textureDimensions_991ea9();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uvec2 textureDimensions_991ea9() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_991ea9();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.msl
index e99ef42..ca5b4fb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_991ea9(depth2d<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_991ea9(depth2d<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depth2d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_991ea9(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depth2d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_991ea9(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depth2d<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_991ea9(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depth2d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_991ea9(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depth2d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depth2d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depth2d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_991ea9(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depth2d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_991ea9(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.spvasm
index 6eec615..93d83a9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_991ea9 "textureDimensions_991ea9"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %30 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_991ea9 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %30
+%textureDimensions_991ea9 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v2uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %34 = OpLoad %v2uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v2uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v2uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_991ea9
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_991ea9
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v2uint %textureDimensions_991ea9
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_991ea9
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_991ea9
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_991ea9
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.wgsl
index f8434c8..12f4c94 100644
--- a/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/991ea9.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-fn textureDimensions_991ea9() {
+fn textureDimensions_991ea9() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_991ea9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_991ea9();
+  prevent_dce = textureDimensions_991ea9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_991ea9();
+  prevent_dce = textureDimensions_991ea9();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_991ea9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl
index eb89af1..40f0380 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32uint, read_write>) -> u32
-fn textureDimensions_9944d5() {
+fn textureDimensions_9944d5() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9944d5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9944d5();
+  prevent_dce = textureDimensions_9944d5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9944d5();
+  prevent_dce = textureDimensions_9944d5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9944d5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.dxc.hlsl
index 4635cf3..d2610a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9944d5() {
+uint textureDimensions_9944d5() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9944d5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9944d5();
+  prevent_dce.Store(0u, asuint(textureDimensions_9944d5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9944d5();
+  prevent_dce.Store(0u, asuint(textureDimensions_9944d5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9944d5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.fxc.hlsl
index 4635cf3..d2610a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9944d5() {
+uint textureDimensions_9944d5() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9944d5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9944d5();
+  prevent_dce.Store(0u, asuint(textureDimensions_9944d5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9944d5();
+  prevent_dce.Store(0u, asuint(textureDimensions_9944d5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9944d5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.glsl
index d3e01c9..87daa8b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_9944d5() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9944d5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp uimage2D arg_0;
+uint textureDimensions_9944d5() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_9944d5() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9944d5();
+  prevent_dce.inner = textureDimensions_9944d5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp uimage2D arg_0;
+uint textureDimensions_9944d5() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_9944d5() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9944d5();
+  prevent_dce.inner = textureDimensions_9944d5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32ui) uniform highp uimage2D arg_0;
+uint textureDimensions_9944d5() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9944d5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.msl
index 4efe153..5f5fea1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9944d5(texture1d<uint, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_9944d5(texture1d<uint, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9944d5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9944d5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_9944d5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9944d5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9944d5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9944d5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.spvasm
index 97916d2..6587eea 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9944d5 "textureDimensions_9944d5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 R32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9944d5 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_9944d5 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_9944d5
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_9944d5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_9944d5
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_9944d5
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_9944d5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_9944d5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.wgsl
index 34e8af8..c4d5366 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9944d5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32uint, read_write>;
 
-fn textureDimensions_9944d5() {
+fn textureDimensions_9944d5() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9944d5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9944d5();
+  prevent_dce = textureDimensions_9944d5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9944d5();
+  prevent_dce = textureDimensions_9944d5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9944d5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl
index 1155116..2bbd80a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<bgra8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<bgra8unorm, read>) -> vec2<u32>
-fn textureDimensions_9b10a0() {
+fn textureDimensions_9b10a0() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9b10a0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9b10a0();
+  prevent_dce = textureDimensions_9b10a0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9b10a0();
+  prevent_dce = textureDimensions_9b10a0();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9b10a0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.dxc.hlsl
index a6aefe8..42919bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9b10a0() {
+uint2 textureDimensions_9b10a0() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9b10a0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9b10a0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b10a0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9b10a0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b10a0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9b10a0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.fxc.hlsl
index a6aefe8..42919bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9b10a0() {
+uint2 textureDimensions_9b10a0() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9b10a0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9b10a0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b10a0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9b10a0();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b10a0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9b10a0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.glsl
index af66211..1a7bb91 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_9b10a0() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9b10a0();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_9b10a0() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9b10a0() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9b10a0();
+  prevent_dce.inner = textureDimensions_9b10a0();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_9b10a0() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9b10a0() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9b10a0();
+  prevent_dce.inner = textureDimensions_9b10a0();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_9b10a0() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9b10a0();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.msl
index bc2ff2f..a08012e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9b10a0(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9b10a0(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9b10a0(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9b10a0(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9b10a0(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9b10a0(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9b10a0(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9b10a0(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.spvasm
index 922dcd2..72421c8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9b10a0 "textureDimensions_9b10a0"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9b10a0 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_9b10a0 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_9b10a0
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_9b10a0
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_9b10a0
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_9b10a0
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_9b10a0
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_9b10a0
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.wgsl
index 343b260..d27aa4f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b10a0.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<bgra8unorm, read>;
 
-fn textureDimensions_9b10a0() {
+fn textureDimensions_9b10a0() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9b10a0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9b10a0();
+  prevent_dce = textureDimensions_9b10a0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9b10a0();
+  prevent_dce = textureDimensions_9b10a0();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9b10a0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl
index f7efacc..118cda5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_cube<f32>;
 
 // fn textureDimensions(texture: texture_cube<f32>) -> vec2<u32>
-fn textureDimensions_9b223b() {
+fn textureDimensions_9b223b() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9b223b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9b223b();
+  prevent_dce = textureDimensions_9b223b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9b223b();
+  prevent_dce = textureDimensions_9b223b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9b223b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.dxc.hlsl
index 0992aac..aef0f13 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9b223b() {
+uint2 textureDimensions_9b223b() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9b223b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9b223b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b223b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9b223b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b223b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9b223b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.fxc.hlsl
index 0992aac..aef0f13 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9b223b() {
+uint2 textureDimensions_9b223b() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9b223b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9b223b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b223b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9b223b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9b223b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9b223b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.glsl
index b456160..8d3ff5f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp samplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_9b223b() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9b223b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_9b223b() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9b223b() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9b223b();
+  prevent_dce.inner = textureDimensions_9b223b();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_9b223b() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9b223b() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9b223b();
+  prevent_dce.inner = textureDimensions_9b223b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_9b223b() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9b223b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.msl
index 37f5771..3f6930f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9b223b(texturecube<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9b223b(texturecube<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9b223b(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9b223b(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9b223b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9b223b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9b223b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9b223b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.spvasm
index 61b083f..35239d7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9b223b "textureDimensions_9b223b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9b223b = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v2uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_9b223b = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v2uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_9b223b
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_9b223b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_9b223b
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_9b223b
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_9b223b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_9b223b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.wgsl
index c74b7e7..accf6a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9b223b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
-fn textureDimensions_9b223b() {
+fn textureDimensions_9b223b() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9b223b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9b223b();
+  prevent_dce = textureDimensions_9b223b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9b223b();
+  prevent_dce = textureDimensions_9b223b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9b223b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl
index f415fbd..7b49013 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube<u32>;
 
 // fn textureDimensions(texture: texture_cube<u32>, level: u32) -> vec2<u32>
-fn textureDimensions_9baf27() {
+fn textureDimensions_9baf27() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9baf27();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9baf27();
+  prevent_dce = textureDimensions_9baf27();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9baf27();
+  prevent_dce = textureDimensions_9baf27();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9baf27();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.dxc.hlsl
index 852415f..4812322 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9baf27() {
+uint2 textureDimensions_9baf27() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9baf27();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9baf27();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9baf27()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9baf27();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9baf27()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9baf27();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.fxc.hlsl
index 852415f..4812322 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9baf27() {
+uint2 textureDimensions_9baf27() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9baf27();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9baf27();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9baf27()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9baf27();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9baf27()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9baf27();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.glsl
index c01974d..e410d7b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usamplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_9baf27() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9baf27();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_9baf27() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9baf27() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9baf27();
+  prevent_dce.inner = textureDimensions_9baf27();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_9baf27() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9baf27() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9baf27();
+  prevent_dce.inner = textureDimensions_9baf27();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_9baf27() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9baf27();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.msl
index 240c665..22978fd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9baf27(texturecube<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9baf27(texturecube<uint, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9baf27(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9baf27(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9baf27(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9baf27(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9baf27(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9baf27(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.spvasm
index 2ac8bb4..ea410ab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_9baf27 "textureDimensions_9baf27"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %30 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_9baf27 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %30
+%textureDimensions_9baf27 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v2uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %34 = OpLoad %v2uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v2uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v2uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_9baf27
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_9baf27
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v2uint %textureDimensions_9baf27
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_9baf27
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_9baf27
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_9baf27
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.wgsl
index 1800a6d..1d1adf2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9baf27.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube<u32>;
 
-fn textureDimensions_9baf27() {
+fn textureDimensions_9baf27() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9baf27();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9baf27();
+  prevent_dce = textureDimensions_9baf27();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9baf27();
+  prevent_dce = textureDimensions_9baf27();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9baf27();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl
index c17895b..991fdd1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_1d<u32>;
 
 // fn textureDimensions(texture: texture_1d<u32>, level: u32) -> u32
-fn textureDimensions_9c7a00() {
+fn textureDimensions_9c7a00() -> u32{
   var arg_1 = 1u;
   var res: u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9c7a00();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9c7a00();
+  prevent_dce = textureDimensions_9c7a00();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9c7a00();
+  prevent_dce = textureDimensions_9c7a00();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9c7a00();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.dxc.hlsl
index 3f22fa2..f138b31 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9c7a00() {
+uint textureDimensions_9c7a00() {
   uint arg_1 = 1u;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9c7a00();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9c7a00();
+  prevent_dce.Store(0u, asuint(textureDimensions_9c7a00()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9c7a00();
+  prevent_dce.Store(0u, asuint(textureDimensions_9c7a00()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9c7a00();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.fxc.hlsl
index 3f22fa2..f138b31 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9c7a00() {
+uint textureDimensions_9c7a00() {
   uint arg_1 = 1u;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9c7a00();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9c7a00();
+  prevent_dce.Store(0u, asuint(textureDimensions_9c7a00()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9c7a00();
+  prevent_dce.Store(0u, asuint(textureDimensions_9c7a00()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9c7a00();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.glsl
index 1bb3946..2f79e19 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_9c7a00() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9c7a00();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2D arg_0_1;
+uint textureDimensions_9c7a00() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_9c7a00() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9c7a00();
+  prevent_dce.inner = textureDimensions_9c7a00();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usampler2D arg_0_1;
+uint textureDimensions_9c7a00() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_9c7a00() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9c7a00();
+  prevent_dce.inner = textureDimensions_9c7a00();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp usampler2D arg_0_1;
+uint textureDimensions_9c7a00() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9c7a00();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.msl
index a9d09c0..3794f09 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9c7a00(texture1d<uint, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_9c7a00(texture1d<uint, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9c7a00(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9c7a00(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_9c7a00(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9c7a00(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9c7a00(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9c7a00(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.spvasm
index 77a30ca..3bbefba 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,75 +22,101 @@
                OpName %textureDimensions_9c7a00 "textureDimensions_9c7a00"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %23 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_9c7a00 = OpFunction %void None %16
-         %19 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %23
-        %res = OpVariable %_ptr_Function_uint Function %23
+%textureDimensions_9c7a00 = OpFunction %uint None %19
+         %21 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %9
+        %res = OpVariable %_ptr_Function_uint Function %9
                OpStore %arg_1 %uint_1
-         %25 = OpLoad %11 %arg_0
-         %26 = OpLoad %uint %arg_1
-         %24 = OpImageQuerySizeLod %uint %25 %26
-               OpStore %res %24
-         %30 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %31 = OpLoad %uint %res
-               OpStore %30 %31
+         %26 = OpLoad %15 %arg_0
+         %27 = OpLoad %uint %arg_1
+         %25 = OpImageQuerySizeLod %uint %26 %27
+               OpStore %res %25
+         %29 = OpLoad %uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %uint %textureDimensions_9c7a00
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_9c7a00
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %uint %textureDimensions_9c7a00
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %51 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %52 = OpFunctionCall %uint %textureDimensions_9c7a00
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_9c7a00
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_9c7a00
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.wgsl
index 7d57524..60f4b47 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9c7a00.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_1d<u32>;
 
-fn textureDimensions_9c7a00() {
+fn textureDimensions_9c7a00() -> u32 {
   var arg_1 = 1u;
   var res : u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9c7a00();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9c7a00();
+  prevent_dce = textureDimensions_9c7a00();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9c7a00();
+  prevent_dce = textureDimensions_9c7a00();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9c7a00();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl
index cb50446..48b06ec 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube<u32>;
 
 // fn textureDimensions(texture: texture_cube<u32>, level: i32) -> vec2<u32>
-fn textureDimensions_9cd4ca() {
+fn textureDimensions_9cd4ca() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9cd4ca();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce = textureDimensions_9cd4ca();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce = textureDimensions_9cd4ca();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9cd4ca();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.dxc.hlsl
index 32b790a..53a29e4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9cd4ca() {
+uint2 textureDimensions_9cd4ca() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9cd4ca();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9cd4ca()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9cd4ca()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9cd4ca();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.fxc.hlsl
index 32b790a..53a29e4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9cd4ca() {
+uint2 textureDimensions_9cd4ca() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9cd4ca();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9cd4ca()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9cd4ca()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9cd4ca();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.glsl
index 9637636..b972031 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usamplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_9cd4ca() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9cd4ca();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_9cd4ca() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9cd4ca() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce.inner = textureDimensions_9cd4ca();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_9cd4ca() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9cd4ca() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce.inner = textureDimensions_9cd4ca();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usamplerCube arg_0_1;
+uvec2 textureDimensions_9cd4ca() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9cd4ca();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.msl
index 10b24fe..01b9841 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9cd4ca(texturecube<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9cd4ca(texturecube<uint, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9cd4ca(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9cd4ca(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9cd4ca(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9cd4ca(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9cd4ca(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9cd4ca(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.spvasm
index 776f53d..e462491 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_9cd4ca "textureDimensions_9cd4ca"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9cd4ca = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_9cd4ca = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_9cd4ca
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_9cd4ca
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_9cd4ca
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_9cd4ca
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_9cd4ca
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_9cd4ca
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.wgsl
index 568a73d..f9ea63e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd4ca.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube<u32>;
 
-fn textureDimensions_9cd4ca() {
+fn textureDimensions_9cd4ca() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9cd4ca();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce = textureDimensions_9cd4ca();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9cd4ca();
+  prevent_dce = textureDimensions_9cd4ca();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9cd4ca();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl
index 38e7754..12257f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32float, write>) -> vec3<u32>
-fn textureDimensions_9cd8ad() {
+fn textureDimensions_9cd8ad() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9cd8ad();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce = textureDimensions_9cd8ad();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce = textureDimensions_9cd8ad();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9cd8ad();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.dxc.hlsl
index 411be2e..8687f94 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9cd8ad() {
+uint3 textureDimensions_9cd8ad() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9cd8ad();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_9cd8ad()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_9cd8ad()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9cd8ad();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.fxc.hlsl
index 411be2e..8687f94 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9cd8ad() {
+uint3 textureDimensions_9cd8ad() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9cd8ad();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_9cd8ad()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce.Store3(0u, asuint(textureDimensions_9cd8ad()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9cd8ad();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.msl
index 11a7158..fc27713 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9cd8ad(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_9cd8ad(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_9cd8ad(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_9cd8ad(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_9cd8ad(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9cd8ad(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9cd8ad(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9cd8ad(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.spvasm
index 73218ee..2feb3ab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9cd8ad "textureDimensions_9cd8ad"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9cd8ad = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_9cd8ad = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_9cd8ad
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_9cd8ad
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_9cd8ad
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_9cd8ad
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_9cd8ad
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_9cd8ad
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.wgsl
index 42490bf..e5a7e29 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9cd8ad.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32float, write>;
 
-fn textureDimensions_9cd8ad() {
+fn textureDimensions_9cd8ad() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9cd8ad();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce = textureDimensions_9cd8ad();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9cd8ad();
+  prevent_dce = textureDimensions_9cd8ad();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9cd8ad();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl
index 17c87e2..1ef50b0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32float, read>) -> vec2<u32>
-fn textureDimensions_9d0bac() {
+fn textureDimensions_9d0bac() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9d0bac();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9d0bac();
+  prevent_dce = textureDimensions_9d0bac();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9d0bac();
+  prevent_dce = textureDimensions_9d0bac();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9d0bac();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.dxc.hlsl
index 1daf99e..1b42e37 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9d0bac() {
+uint2 textureDimensions_9d0bac() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9d0bac();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9d0bac();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9d0bac()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9d0bac();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9d0bac()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9d0bac();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.fxc.hlsl
index 1daf99e..1b42e37 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9d0bac() {
+uint2 textureDimensions_9d0bac() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9d0bac();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9d0bac();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9d0bac()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9d0bac();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9d0bac()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9d0bac();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.glsl
index 55b3483..c00d60c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_9d0bac() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9d0bac();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_9d0bac() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9d0bac() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9d0bac();
+  prevent_dce.inner = textureDimensions_9d0bac();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_9d0bac() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9d0bac() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9d0bac();
+  prevent_dce.inner = textureDimensions_9d0bac();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32f) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_9d0bac() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9d0bac();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.msl
index 2c37917..ebe3dd6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9d0bac(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9d0bac(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9d0bac(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9d0bac(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9d0bac(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9d0bac(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9d0bac(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9d0bac(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.spvasm
index df30003..d8b1a89 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9d0bac "textureDimensions_9d0bac"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9d0bac = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_9d0bac = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_9d0bac
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_9d0bac
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_9d0bac
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_9d0bac
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_9d0bac
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_9d0bac
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.wgsl
index bd133d7..f796866 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d0bac.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32float, read>;
 
-fn textureDimensions_9d0bac() {
+fn textureDimensions_9d0bac() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9d0bac();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9d0bac();
+  prevent_dce = textureDimensions_9d0bac();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9d0bac();
+  prevent_dce = textureDimensions_9d0bac();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9d0bac();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl
index 6e33b08..4c6f85a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8snorm, read>) -> u32
-fn textureDimensions_9d68b8() {
+fn textureDimensions_9d68b8() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9d68b8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9d68b8();
+  prevent_dce = textureDimensions_9d68b8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9d68b8();
+  prevent_dce = textureDimensions_9d68b8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9d68b8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.dxc.hlsl
index 51024d0..e7712c2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9d68b8() {
+uint textureDimensions_9d68b8() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9d68b8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9d68b8();
+  prevent_dce.Store(0u, asuint(textureDimensions_9d68b8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9d68b8();
+  prevent_dce.Store(0u, asuint(textureDimensions_9d68b8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9d68b8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.fxc.hlsl
index 51024d0..e7712c2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9d68b8() {
+uint textureDimensions_9d68b8() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9d68b8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9d68b8();
+  prevent_dce.Store(0u, asuint(textureDimensions_9d68b8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9d68b8();
+  prevent_dce.Store(0u, asuint(textureDimensions_9d68b8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9d68b8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.glsl
index 606427a..f669f7a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_9d68b8() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9d68b8();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp readonly image2D arg_0;
+uint textureDimensions_9d68b8() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_9d68b8() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9d68b8();
+  prevent_dce.inner = textureDimensions_9d68b8();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp readonly image2D arg_0;
+uint textureDimensions_9d68b8() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_9d68b8() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9d68b8();
+  prevent_dce.inner = textureDimensions_9d68b8();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8_snorm) uniform highp readonly image2D arg_0;
+uint textureDimensions_9d68b8() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9d68b8();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.msl
index e8a81a3..977843a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9d68b8(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_9d68b8(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9d68b8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9d68b8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_9d68b8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9d68b8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9d68b8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9d68b8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.spvasm
index a7c41bf..902cee6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9d68b8 "textureDimensions_9d68b8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9d68b8 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_9d68b8 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_9d68b8
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_9d68b8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_9d68b8
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_9d68b8
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_9d68b8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_9d68b8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.wgsl
index 2362157..9119b63 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9d68b8.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8snorm, read>;
 
-fn textureDimensions_9d68b8() {
+fn textureDimensions_9d68b8() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9d68b8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9d68b8();
+  prevent_dce = textureDimensions_9d68b8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9d68b8();
+  prevent_dce = textureDimensions_9d68b8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9d68b8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl
index a857d47..3d91f99 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32float, read>) -> vec2<u32>
-fn textureDimensions_9dc27a() {
+fn textureDimensions_9dc27a() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9dc27a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9dc27a();
+  prevent_dce = textureDimensions_9dc27a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9dc27a();
+  prevent_dce = textureDimensions_9dc27a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9dc27a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.dxc.hlsl
index a97dcc6..74ae3fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9dc27a() {
+uint2 textureDimensions_9dc27a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9dc27a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9dc27a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9dc27a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9dc27a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9dc27a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9dc27a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.fxc.hlsl
index a97dcc6..74ae3fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9dc27a() {
+uint2 textureDimensions_9dc27a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9dc27a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9dc27a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9dc27a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9dc27a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9dc27a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9dc27a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.msl
index ac2aefb..692eb0b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9dc27a(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9dc27a(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9dc27a(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9dc27a(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9dc27a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9dc27a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9dc27a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9dc27a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.spvasm
index c277a29..42e8f28 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,75 +21,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9dc27a "textureDimensions_9dc27a"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9dc27a = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_9dc27a = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_9dc27a
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_9dc27a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_9dc27a
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_9dc27a
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_9dc27a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_9dc27a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.wgsl
index 98a96cc..d6006e7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9dc27a.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32float, read>;
 
-fn textureDimensions_9dc27a() {
+fn textureDimensions_9dc27a() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9dc27a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9dc27a();
+  prevent_dce = textureDimensions_9dc27a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9dc27a();
+  prevent_dce = textureDimensions_9dc27a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9dc27a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl
index f0dd9b9..bd6dace 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureDimensions(texture: texture_2d_array<u32>, level: i32) -> vec2<u32>
-fn textureDimensions_9e0794() {
+fn textureDimensions_9e0794() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9e0794();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9e0794();
+  prevent_dce = textureDimensions_9e0794();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9e0794();
+  prevent_dce = textureDimensions_9e0794();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9e0794();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.dxc.hlsl
index 407da92..8a34884 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9e0794() {
+uint2 textureDimensions_9e0794() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9e0794();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9e0794();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9e0794()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9e0794();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9e0794()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9e0794();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.fxc.hlsl
index 407da92..8a34884 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9e0794() {
+uint2 textureDimensions_9e0794() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9e0794();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9e0794();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9e0794()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9e0794();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9e0794()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9e0794();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.glsl
index 0168a03..82bab0d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_9e0794() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9e0794();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_9e0794() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9e0794() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_9e0794();
+  prevent_dce.inner = textureDimensions_9e0794();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_9e0794() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_9e0794() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_9e0794();
+  prevent_dce.inner = textureDimensions_9e0794();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usampler2DArray arg_0_1;
+uvec2 textureDimensions_9e0794() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_9e0794();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.msl
index 74b4480..88224ec 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9e0794(texture2d_array<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9e0794(texture2d_array<uint, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9e0794(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9e0794(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9e0794(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9e0794(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9e0794(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9e0794(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.spvasm
index ba8abd1..b14e70b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,81 +21,108 @@
                OpName %textureDimensions_9e0794 "textureDimensions_9e0794"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9e0794 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_9e0794 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_9e0794
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_9e0794
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_9e0794
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_9e0794
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_9e0794
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_9e0794
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.wgsl
index ebf2ca8..1d4009f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9e0794.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
-fn textureDimensions_9e0794() {
+fn textureDimensions_9e0794() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9e0794();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9e0794();
+  prevent_dce = textureDimensions_9e0794();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9e0794();
+  prevent_dce = textureDimensions_9e0794();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9e0794();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl
index 54544d8..ddf22a9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn textureDimensions(texture: texture_depth_cube_array) -> vec2<u32>
-fn textureDimensions_9fcc3b() {
+fn textureDimensions_9fcc3b() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9fcc3b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce = textureDimensions_9fcc3b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce = textureDimensions_9fcc3b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9fcc3b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.dxc.hlsl
index 501e9bd..d788dcc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9fcc3b() {
+uint2 textureDimensions_9fcc3b() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9fcc3b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9fcc3b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9fcc3b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9fcc3b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.fxc.hlsl
index 501e9bd..d788dcc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_9fcc3b() {
+uint2 textureDimensions_9fcc3b() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_9fcc3b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9fcc3b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_9fcc3b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_9fcc3b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.msl
index 83fc78d..5866b4c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_9fcc3b(depthcube_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_9fcc3b(depthcube_array<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depthcube_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_9fcc3b(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depthcube_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_9fcc3b(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depthcube_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_9fcc3b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depthcube_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_9fcc3b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depthcube_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depthcube_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depthcube_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_9fcc3b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depthcube_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_9fcc3b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.spvasm
index e7bb90b..8117b86 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,76 +21,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_9fcc3b "textureDimensions_9fcc3b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_9fcc3b = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v3uint %24 %int_0
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_9fcc3b = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v3uint %26 %int_0
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_9fcc3b
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_9fcc3b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_9fcc3b
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_9fcc3b
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_9fcc3b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_9fcc3b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.wgsl
index bfcab8a..995d390 100644
--- a/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/9fcc3b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-fn textureDimensions_9fcc3b() {
+fn textureDimensions_9fcc3b() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9fcc3b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce = textureDimensions_9fcc3b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_9fcc3b();
+  prevent_dce = textureDimensions_9fcc3b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_9fcc3b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl
index f705590..81f9eae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32uint, read_write>) -> vec3<u32>
-fn textureDimensions_a105a5() {
+fn textureDimensions_a105a5() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a105a5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a105a5();
+  prevent_dce = textureDimensions_a105a5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a105a5();
+  prevent_dce = textureDimensions_a105a5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a105a5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.dxc.hlsl
index 66acd66..8a52cb6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a105a5() {
+uint3 textureDimensions_a105a5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a105a5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a105a5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a105a5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a105a5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a105a5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a105a5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.fxc.hlsl
index 66acd66..8a52cb6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a105a5() {
+uint3 textureDimensions_a105a5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a105a5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a105a5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a105a5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a105a5();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a105a5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a105a5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.glsl
index 36d07bd..68a1922 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_a105a5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a105a5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_a105a5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_a105a5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a105a5();
+  prevent_dce.inner = textureDimensions_a105a5();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_a105a5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_a105a5() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a105a5();
+  prevent_dce.inner = textureDimensions_a105a5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_a105a5() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a105a5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.msl
index 6f9707d..321c9ba5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a105a5(texture3d<uint, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_a105a5(texture3d<uint, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_a105a5(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_a105a5(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_a105a5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a105a5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a105a5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a105a5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.spvasm
index 1e8255c..7266160 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a105a5 "textureDimensions_a105a5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a105a5 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_a105a5 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_a105a5
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_a105a5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_a105a5
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_a105a5
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_a105a5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_a105a5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.wgsl
index 81f99bf..eea6b65 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a105a5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32uint, read_write>;
 
-fn textureDimensions_a105a5() {
+fn textureDimensions_a105a5() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a105a5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a105a5();
+  prevent_dce = textureDimensions_a105a5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a105a5();
+  prevent_dce = textureDimensions_a105a5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a105a5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl
index 90bba94..376e0f2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16float, read_write>) -> vec2<u32>
-fn textureDimensions_a14386() {
+fn textureDimensions_a14386() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a14386();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a14386();
+  prevent_dce = textureDimensions_a14386();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a14386();
+  prevent_dce = textureDimensions_a14386();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a14386();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.dxc.hlsl
index df2277b..e74b745 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a14386() {
+uint2 textureDimensions_a14386() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a14386();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a14386();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a14386()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a14386();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a14386()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a14386();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.fxc.hlsl
index df2277b..e74b745 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a14386() {
+uint2 textureDimensions_a14386() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a14386();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a14386();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a14386()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a14386();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a14386()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a14386();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.glsl
index 05f3368..37943e0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_a14386() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a14386();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_a14386() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a14386() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a14386();
+  prevent_dce.inner = textureDimensions_a14386();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_a14386() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a14386() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a14386();
+  prevent_dce.inner = textureDimensions_a14386();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_a14386() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a14386();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.msl
index 4154898..63e8906 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a14386(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_a14386(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_a14386(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_a14386(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_a14386(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a14386(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a14386(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a14386(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.spvasm
index a0b3c44..5101658 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a14386 "textureDimensions_a14386"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a14386 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_a14386 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_a14386
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_a14386
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_a14386
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_a14386
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_a14386
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_a14386
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.wgsl
index dcffd34..c502580 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a14386.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16float, read_write>;
 
-fn textureDimensions_a14386() {
+fn textureDimensions_a14386() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a14386();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a14386();
+  prevent_dce = textureDimensions_a14386();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a14386();
+  prevent_dce = textureDimensions_a14386();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a14386();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl
index fffc6ce..a6e9c63 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<u32>;
 
 // fn textureDimensions(texture: texture_cube_array<u32>) -> vec2<u32>
-fn textureDimensions_a1598a() {
+fn textureDimensions_a1598a() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a1598a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a1598a();
+  prevent_dce = textureDimensions_a1598a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a1598a();
+  prevent_dce = textureDimensions_a1598a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a1598a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.dxc.hlsl
index fec0480..ce8d913 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a1598a() {
+uint2 textureDimensions_a1598a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a1598a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a1598a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a1598a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a1598a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a1598a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a1598a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.fxc.hlsl
index fec0480..ce8d913 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCubeArray<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a1598a() {
+uint2 textureDimensions_a1598a() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a1598a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a1598a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a1598a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a1598a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a1598a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a1598a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.msl
index d32e662..ab612cd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a1598a(texturecube_array<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_a1598a(texturecube_array<uint, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_a1598a(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_a1598a(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_a1598a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a1598a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a1598a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a1598a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.spvasm
index 9aba6f2..fbd517c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,76 +21,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a1598a "textureDimensions_a1598a"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a1598a = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v3uint %24 %int_0
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_a1598a = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v3uint %26 %int_0
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_a1598a
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_a1598a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_a1598a
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_a1598a
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_a1598a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_a1598a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.wgsl
index 94245b7..6019484 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a1598a.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<u32>;
 
-fn textureDimensions_a1598a() {
+fn textureDimensions_a1598a() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a1598a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a1598a();
+  prevent_dce = textureDimensions_a1598a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a1598a();
+  prevent_dce = textureDimensions_a1598a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a1598a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl
index f59767e..114b7e5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r8unorm, write>) -> vec3<u32>
-fn textureDimensions_a20ba2() {
+fn textureDimensions_a20ba2() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a20ba2();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a20ba2();
+  prevent_dce = textureDimensions_a20ba2();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a20ba2();
+  prevent_dce = textureDimensions_a20ba2();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a20ba2();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.dxc.hlsl
index 205a438..056cc58 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a20ba2() {
+uint3 textureDimensions_a20ba2() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a20ba2();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a20ba2();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a20ba2()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a20ba2();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a20ba2()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a20ba2();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.fxc.hlsl
index 205a438..056cc58 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a20ba2() {
+uint3 textureDimensions_a20ba2() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a20ba2();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a20ba2();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a20ba2()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a20ba2();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a20ba2()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a20ba2();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.msl
index 87cfc47..bd6518a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a20ba2(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_a20ba2(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_a20ba2(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_a20ba2(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_a20ba2(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a20ba2(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a20ba2(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a20ba2(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.spvasm
index cddc7bd..7226ee5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a20ba2 "textureDimensions_a20ba2"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 R8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a20ba2 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_a20ba2 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_a20ba2
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_a20ba2
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_a20ba2
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_a20ba2
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_a20ba2
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_a20ba2
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.wgsl
index e5b4bb5..3385fd5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a20ba2.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r8unorm, write>;
 
-fn textureDimensions_a20ba2() {
+fn textureDimensions_a20ba2() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a20ba2();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a20ba2();
+  prevent_dce = textureDimensions_a20ba2();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a20ba2();
+  prevent_dce = textureDimensions_a20ba2();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a20ba2();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl
index 8008af1..416084e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8unorm, read>) -> vec3<u32>
-fn textureDimensions_a25d9b() {
+fn textureDimensions_a25d9b() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a25d9b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a25d9b();
+  prevent_dce = textureDimensions_a25d9b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a25d9b();
+  prevent_dce = textureDimensions_a25d9b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a25d9b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.dxc.hlsl
index de8b046..5b28495 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a25d9b() {
+uint3 textureDimensions_a25d9b() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a25d9b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a25d9b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a25d9b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a25d9b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a25d9b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a25d9b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.fxc.hlsl
index de8b046..5b28495 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a25d9b() {
+uint3 textureDimensions_a25d9b() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a25d9b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a25d9b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a25d9b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a25d9b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a25d9b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a25d9b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.glsl
index 4a28a66..a359a59 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_a25d9b() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a25d9b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_a25d9b() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_a25d9b() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a25d9b();
+  prevent_dce.inner = textureDimensions_a25d9b();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_a25d9b() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_a25d9b() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a25d9b();
+  prevent_dce.inner = textureDimensions_a25d9b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_a25d9b() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a25d9b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.msl
index df1ac0f..25dc598 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a25d9b(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_a25d9b(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_a25d9b(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_a25d9b(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_a25d9b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a25d9b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a25d9b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a25d9b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.spvasm
index 3d0abc9..3f76b58 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a25d9b "textureDimensions_a25d9b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a25d9b = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_a25d9b = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_a25d9b
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_a25d9b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_a25d9b
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_a25d9b
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_a25d9b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_a25d9b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.wgsl
index 9c4eb99..54bf8b4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a25d9b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8unorm, read>;
 
-fn textureDimensions_a25d9b() {
+fn textureDimensions_a25d9b() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a25d9b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a25d9b();
+  prevent_dce = textureDimensions_a25d9b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a25d9b();
+  prevent_dce = textureDimensions_a25d9b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a25d9b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl
index 2b44c0e..f3d7a8a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube<i32>;
 
 // fn textureDimensions(texture: texture_cube<i32>, level: i32) -> vec2<u32>
-fn textureDimensions_a2ba5e() {
+fn textureDimensions_a2ba5e() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a2ba5e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce = textureDimensions_a2ba5e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce = textureDimensions_a2ba5e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a2ba5e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.dxc.hlsl
index ba9a499..952a6c8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a2ba5e() {
+uint2 textureDimensions_a2ba5e() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a2ba5e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a2ba5e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a2ba5e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a2ba5e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.fxc.hlsl
index ba9a499..952a6c8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a2ba5e() {
+uint2 textureDimensions_a2ba5e() {
   int arg_1 = 1;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a2ba5e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a2ba5e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a2ba5e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a2ba5e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.glsl
index 9e9d10f..55c0be5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isamplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_a2ba5e() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a2ba5e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_a2ba5e() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a2ba5e() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce.inner = textureDimensions_a2ba5e();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_a2ba5e() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a2ba5e() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce.inner = textureDimensions_a2ba5e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_a2ba5e() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a2ba5e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.msl
index 48fa657..23499a6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a2ba5e(texturecube<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_a2ba5e(texturecube<int, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_a2ba5e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_a2ba5e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_a2ba5e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a2ba5e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a2ba5e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a2ba5e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.spvasm
index 3e7549b..7b828b3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_a2ba5e "textureDimensions_a2ba5e"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a2ba5e = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_a2ba5e = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_a2ba5e
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_a2ba5e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_a2ba5e
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_a2ba5e
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_a2ba5e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_a2ba5e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.wgsl
index 8e65fcb..a6e2876 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a2ba5e.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube<i32>;
 
-fn textureDimensions_a2ba5e() {
+fn textureDimensions_a2ba5e() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a2ba5e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce = textureDimensions_a2ba5e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a2ba5e();
+  prevent_dce = textureDimensions_a2ba5e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a2ba5e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl
index 1eab903..9ddb140 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16float, read>) -> vec3<u32>
-fn textureDimensions_a3ea91() {
+fn textureDimensions_a3ea91() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a3ea91();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a3ea91();
+  prevent_dce = textureDimensions_a3ea91();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a3ea91();
+  prevent_dce = textureDimensions_a3ea91();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a3ea91();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.dxc.hlsl
index 503338f..f536ed2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a3ea91() {
+uint3 textureDimensions_a3ea91() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a3ea91();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a3ea91();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a3ea91()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a3ea91();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a3ea91()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a3ea91();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.fxc.hlsl
index 503338f..f536ed2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a3ea91() {
+uint3 textureDimensions_a3ea91() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a3ea91();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a3ea91();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a3ea91()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a3ea91();
+  prevent_dce.Store3(0u, asuint(textureDimensions_a3ea91()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a3ea91();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.glsl
index 147f3a3..7ac7d69 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16f) uniform highp readonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_a3ea91() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a3ea91();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_a3ea91() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_a3ea91() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a3ea91();
+  prevent_dce.inner = textureDimensions_a3ea91();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_a3ea91() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_a3ea91() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a3ea91();
+  prevent_dce.inner = textureDimensions_a3ea91();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_a3ea91() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a3ea91();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.msl
index d161824..874b272 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a3ea91(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_a3ea91(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_a3ea91(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_a3ea91(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_a3ea91(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a3ea91(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a3ea91(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a3ea91(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.spvasm
index d34788b..07ca8ad 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a3ea91 "textureDimensions_a3ea91"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a3ea91 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_a3ea91 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_a3ea91
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_a3ea91
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_a3ea91
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_a3ea91
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_a3ea91
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_a3ea91
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.wgsl
index 836f39f..39ead80 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a3ea91.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16float, read>;
 
-fn textureDimensions_a3ea91() {
+fn textureDimensions_a3ea91() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a3ea91();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a3ea91();
+  prevent_dce = textureDimensions_a3ea91();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a3ea91();
+  prevent_dce = textureDimensions_a3ea91();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a3ea91();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl
index 987bc88..22798dc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d<i32>;
 
 // fn textureDimensions(texture: texture_2d<i32>, level: u32) -> vec2<u32>
-fn textureDimensions_a48049() {
+fn textureDimensions_a48049() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a48049();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a48049();
+  prevent_dce = textureDimensions_a48049();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a48049();
+  prevent_dce = textureDimensions_a48049();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a48049();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.dxc.hlsl
index 52650d5..6e1a8cb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a48049() {
+uint2 textureDimensions_a48049() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a48049();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a48049();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a48049()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a48049();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a48049()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a48049();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.fxc.hlsl
index 52650d5..6e1a8cb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a48049() {
+uint2 textureDimensions_a48049() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a48049();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a48049();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a48049()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a48049();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a48049()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a48049();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.glsl
index f152fe5..92aca12 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_a48049() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a48049();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_a48049() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a48049() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a48049();
+  prevent_dce.inner = textureDimensions_a48049();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_a48049() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a48049() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a48049();
+  prevent_dce.inner = textureDimensions_a48049();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_a48049() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a48049();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.msl
index 4e383e6..b363763 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a48049(texture2d<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_a48049(texture2d<int, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_a48049(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_a48049(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_a48049(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a48049(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a48049(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a48049(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.spvasm
index f26c041..62f8de5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,105 @@
                OpName %textureDimensions_a48049 "textureDimensions_a48049"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+         %27 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %31 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_a48049 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %31
+%textureDimensions_a48049 = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v2uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %35 = OpLoad %v2uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v2uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v2uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_a48049
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_a48049
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v2uint %textureDimensions_a48049
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %55 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %56 = OpFunctionCall %v2uint %textureDimensions_a48049
+               OpStore %55 %56
+         %57 = OpLoad %VertexOutput %out
+               OpReturnValue %57
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %59 = OpLabel
+         %60 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %61 = OpCompositeExtract %v4float %60 0
+               OpStore %pos_1 %61
+         %62 = OpCompositeExtract %v2uint %60 1
+               OpStore %prevent_dce_1 %62
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_a48049
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_a48049
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.wgsl
index 7c309cd..588cab6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a48049.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d<i32>;
 
-fn textureDimensions_a48049() {
+fn textureDimensions_a48049() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a48049();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a48049();
+  prevent_dce = textureDimensions_a48049();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a48049();
+  prevent_dce = textureDimensions_a48049();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a48049();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl
index 9523a6d..236ea65 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureDimensions(texture: texture_depth_2d_array) -> vec2<u32>
-fn textureDimensions_a4cd56() {
+fn textureDimensions_a4cd56() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a4cd56();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a4cd56();
+  prevent_dce = textureDimensions_a4cd56();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a4cd56();
+  prevent_dce = textureDimensions_a4cd56();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a4cd56();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.dxc.hlsl
index 367aa08..4d17222 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a4cd56() {
+uint2 textureDimensions_a4cd56() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a4cd56();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a4cd56();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a4cd56()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a4cd56();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a4cd56()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a4cd56();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.fxc.hlsl
index 367aa08..4d17222 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a4cd56() {
+uint2 textureDimensions_a4cd56() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a4cd56();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a4cd56();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a4cd56()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a4cd56();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a4cd56()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a4cd56();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.glsl
index 6825de2..1610652 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_a4cd56() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a4cd56();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_a4cd56() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a4cd56() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a4cd56();
+  prevent_dce.inner = textureDimensions_a4cd56();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_a4cd56() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a4cd56() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a4cd56();
+  prevent_dce.inner = textureDimensions_a4cd56();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_a4cd56() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a4cd56();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.msl
index 8d4b437..0b4378f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a4cd56(depth2d_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_a4cd56(depth2d_array<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depth2d_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_a4cd56(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depth2d_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_a4cd56(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depth2d_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_a4cd56(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depth2d_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a4cd56(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depth2d_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depth2d_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depth2d_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a4cd56(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depth2d_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a4cd56(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.spvasm
index 5c981bd..3d9d5ff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 48
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a4cd56 "textureDimensions_a4cd56"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %29 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %34 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %44 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %50 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a4cd56 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %29
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v3uint %24 %int_0
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %32 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %33 = OpLoad %v2uint %res
-               OpStore %32 %33
+%textureDimensions_a4cd56 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v3uint %26 %int_0
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %31 = OpLoad %v2uint %res
+               OpReturnValue %31
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %32
+         %35 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_a4cd56
+               OpStore %38 %39
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %34
-         %36 = OpLabel
-         %37 = OpFunctionCall %void %textureDimensions_a4cd56
-               OpReturnValue %5
+%compute_main = OpFunction %void None %32
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_a4cd56
+               OpStore %42 %43
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %40
+%vertex_main_inner = OpFunction %VertexOutput None %44
+         %47 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %50
+         %52 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %52 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_a4cd56
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %32
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_a4cd56
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_a4cd56
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.wgsl
index e59960e..d878e53 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a4cd56.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-fn textureDimensions_a4cd56() {
+fn textureDimensions_a4cd56() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a4cd56();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a4cd56();
+  prevent_dce = textureDimensions_a4cd56();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a4cd56();
+  prevent_dce = textureDimensions_a4cd56();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a4cd56();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl
index 1b31b45..c54d957 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16sint, read>) -> vec2<u32>
-fn textureDimensions_a65776() {
+fn textureDimensions_a65776() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a65776();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a65776();
+  prevent_dce = textureDimensions_a65776();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a65776();
+  prevent_dce = textureDimensions_a65776();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a65776();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.dxc.hlsl
index 46c6a77..49a3575 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a65776() {
+uint2 textureDimensions_a65776() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a65776();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a65776();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a65776()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a65776();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a65776()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a65776();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.fxc.hlsl
index 46c6a77..49a3575 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a65776() {
+uint2 textureDimensions_a65776() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a65776();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a65776();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a65776()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a65776();
+  prevent_dce.Store2(0u, asuint(textureDimensions_a65776()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a65776();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.glsl
index 4666480..47ed1ba 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_a65776() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a65776();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_a65776() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a65776() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a65776();
+  prevent_dce.inner = textureDimensions_a65776();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_a65776() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_a65776() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a65776();
+  prevent_dce.inner = textureDimensions_a65776();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_a65776() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a65776();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.msl
index eedd1cd..36053a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a65776(texture2d<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_a65776(texture2d<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_a65776(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_a65776(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_a65776(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a65776(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a65776(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a65776(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.spvasm
index e07651b..792ac59 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a65776 "textureDimensions_a65776"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a65776 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_a65776 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_a65776
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_a65776
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_a65776
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_a65776
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_a65776
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_a65776
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.wgsl
index 3edcf284..685ee79 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a65776.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16sint, read>;
 
-fn textureDimensions_a65776() {
+fn textureDimensions_a65776() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a65776();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a65776();
+  prevent_dce = textureDimensions_a65776();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a65776();
+  prevent_dce = textureDimensions_a65776();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a65776();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl
index 2d0089b..4fb4691 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8snorm, read_write>) -> u32
-fn textureDimensions_a7ae4c() {
+fn textureDimensions_a7ae4c() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a7ae4c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce = textureDimensions_a7ae4c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce = textureDimensions_a7ae4c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a7ae4c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.dxc.hlsl
index 7f590d8..9908b1a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a7ae4c() {
+uint textureDimensions_a7ae4c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a7ae4c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce.Store(0u, asuint(textureDimensions_a7ae4c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce.Store(0u, asuint(textureDimensions_a7ae4c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a7ae4c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.fxc.hlsl
index 7f590d8..9908b1a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_a7ae4c() {
+uint textureDimensions_a7ae4c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_a7ae4c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce.Store(0u, asuint(textureDimensions_a7ae4c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce.Store(0u, asuint(textureDimensions_a7ae4c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_a7ae4c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.glsl
index eb4cd4e..59e3915 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_a7ae4c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a7ae4c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uint textureDimensions_a7ae4c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_a7ae4c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce.inner = textureDimensions_a7ae4c();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uint textureDimensions_a7ae4c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_a7ae4c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce.inner = textureDimensions_a7ae4c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uint textureDimensions_a7ae4c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_a7ae4c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.msl
index ed8d1a5..72fe4cb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_a7ae4c(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_a7ae4c(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_a7ae4c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_a7ae4c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_a7ae4c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_a7ae4c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_a7ae4c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_a7ae4c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.spvasm
index 5b8e97a..d8f96aa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_a7ae4c "textureDimensions_a7ae4c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_a7ae4c = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_a7ae4c = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_a7ae4c
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_a7ae4c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_a7ae4c
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_a7ae4c
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_a7ae4c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_a7ae4c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.wgsl
index 8681511..cc643af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/a7ae4c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8snorm, read_write>;
 
-fn textureDimensions_a7ae4c() {
+fn textureDimensions_a7ae4c() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a7ae4c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce = textureDimensions_a7ae4c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_a7ae4c();
+  prevent_dce = textureDimensions_a7ae4c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_a7ae4c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl
index e9d6b96..034b243 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32sint, write>) -> vec2<u32>
-fn textureDimensions_aa4353() {
+fn textureDimensions_aa4353() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_aa4353();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_aa4353();
+  prevent_dce = textureDimensions_aa4353();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_aa4353();
+  prevent_dce = textureDimensions_aa4353();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_aa4353();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.dxc.hlsl
index edc2683..5b38798 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_aa4353() {
+uint2 textureDimensions_aa4353() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_aa4353();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_aa4353();
+  prevent_dce.Store2(0u, asuint(textureDimensions_aa4353()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_aa4353();
+  prevent_dce.Store2(0u, asuint(textureDimensions_aa4353()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_aa4353();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.fxc.hlsl
index edc2683..5b38798 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_aa4353() {
+uint2 textureDimensions_aa4353() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_aa4353();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_aa4353();
+  prevent_dce.Store2(0u, asuint(textureDimensions_aa4353()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_aa4353();
+  prevent_dce.Store2(0u, asuint(textureDimensions_aa4353()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_aa4353();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.glsl
index c03e503..7ab6c18 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_aa4353() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_aa4353();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_aa4353() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_aa4353() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_aa4353();
+  prevent_dce.inner = textureDimensions_aa4353();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_aa4353() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_aa4353() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_aa4353();
+  prevent_dce.inner = textureDimensions_aa4353();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_aa4353() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_aa4353();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.msl
index 10c4286..9609718 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_aa4353(texture2d<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_aa4353(texture2d<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_aa4353(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_aa4353(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_aa4353(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_aa4353(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_aa4353(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_aa4353(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.spvasm
index 950004e..7a79b78 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_aa4353 "textureDimensions_aa4353"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_aa4353 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_aa4353 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_aa4353
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_aa4353
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_aa4353
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_aa4353
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_aa4353
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_aa4353
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.wgsl
index 3d4a4fc..c075a28 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aa4353.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32sint, write>;
 
-fn textureDimensions_aa4353() {
+fn textureDimensions_aa4353() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_aa4353();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_aa4353();
+  prevent_dce = textureDimensions_aa4353();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_aa4353();
+  prevent_dce = textureDimensions_aa4353();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_aa4353();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl
index 2c7a205..999377c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_1d<f32>;
 
 // fn textureDimensions(texture: texture_1d<f32>, level: u32) -> u32
-fn textureDimensions_aac604() {
+fn textureDimensions_aac604() -> u32{
   var arg_1 = 1u;
   var res: u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_aac604();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_aac604();
+  prevent_dce = textureDimensions_aac604();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_aac604();
+  prevent_dce = textureDimensions_aac604();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_aac604();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.dxc.hlsl
index 4cd137b..60d5dd1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_aac604() {
+uint textureDimensions_aac604() {
   uint arg_1 = 1u;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_aac604();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_aac604();
+  prevent_dce.Store(0u, asuint(textureDimensions_aac604()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_aac604();
+  prevent_dce.Store(0u, asuint(textureDimensions_aac604()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_aac604();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.fxc.hlsl
index 4cd137b..60d5dd1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_aac604() {
+uint textureDimensions_aac604() {
   uint arg_1 = 1u;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_aac604();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_aac604();
+  prevent_dce.Store(0u, asuint(textureDimensions_aac604()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_aac604();
+  prevent_dce.Store(0u, asuint(textureDimensions_aac604()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_aac604();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.glsl
index 1bd5a3a..f018dfe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_aac604() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_aac604();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uint textureDimensions_aac604() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_aac604() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_aac604();
+  prevent_dce.inner = textureDimensions_aac604();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uint textureDimensions_aac604() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_aac604() {
-  uint arg_1 = 1u;
-  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_aac604();
+  prevent_dce.inner = textureDimensions_aac604();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uint textureDimensions_aac604() {
+  uint arg_1 = 1u;
+  uint res = uvec2(textureSize(arg_0_1, int(arg_1))).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_aac604();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.msl
index 5a169d0..2c6ee66 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_aac604(texture1d<float, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_aac604(texture1d<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_aac604(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_aac604(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_aac604(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_aac604(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_aac604(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_aac604(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.spvasm
index 246ec84..69ebdf5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,75 +22,101 @@
                OpName %textureDimensions_aac604 "textureDimensions_aac604"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %23 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_aac604 = OpFunction %void None %16
-         %19 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %23
-        %res = OpVariable %_ptr_Function_uint Function %23
+%textureDimensions_aac604 = OpFunction %uint None %19
+         %21 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %9
+        %res = OpVariable %_ptr_Function_uint Function %9
                OpStore %arg_1 %uint_1
-         %25 = OpLoad %11 %arg_0
-         %26 = OpLoad %uint %arg_1
-         %24 = OpImageQuerySizeLod %uint %25 %26
-               OpStore %res %24
-         %30 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %31 = OpLoad %uint %res
-               OpStore %30 %31
+         %26 = OpLoad %15 %arg_0
+         %27 = OpLoad %uint %arg_1
+         %25 = OpImageQuerySizeLod %uint %26 %27
+               OpStore %res %25
+         %29 = OpLoad %uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %uint %textureDimensions_aac604
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_aac604
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %uint %textureDimensions_aac604
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %51 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %52 = OpFunctionCall %uint %textureDimensions_aac604
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_aac604
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_aac604
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.wgsl
index a17627b..9b8456e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/aac604.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
-fn textureDimensions_aac604() {
+fn textureDimensions_aac604() -> u32 {
   var arg_1 = 1u;
   var res : u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_aac604();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_aac604();
+  prevent_dce = textureDimensions_aac604();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_aac604();
+  prevent_dce = textureDimensions_aac604();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_aac604();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl
index bcb80b7..29d5337 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8uint, write>) -> u32
-fn textureDimensions_ad7d3b() {
+fn textureDimensions_ad7d3b() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ad7d3b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce = textureDimensions_ad7d3b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce = textureDimensions_ad7d3b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ad7d3b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.dxc.hlsl
index 392ca6b..45d54fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ad7d3b() {
+uint textureDimensions_ad7d3b() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ad7d3b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce.Store(0u, asuint(textureDimensions_ad7d3b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce.Store(0u, asuint(textureDimensions_ad7d3b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ad7d3b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.fxc.hlsl
index 392ca6b..45d54fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ad7d3b() {
+uint textureDimensions_ad7d3b() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ad7d3b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce.Store(0u, asuint(textureDimensions_ad7d3b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce.Store(0u, asuint(textureDimensions_ad7d3b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ad7d3b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.glsl
index 2935395..6efb560 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_ad7d3b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_ad7d3b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_ad7d3b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_ad7d3b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce.inner = textureDimensions_ad7d3b();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_ad7d3b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_ad7d3b() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce.inner = textureDimensions_ad7d3b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_ad7d3b() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_ad7d3b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.msl
index 496ffa5..53612f6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ad7d3b(texture1d<uint, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_ad7d3b(texture1d<uint, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_ad7d3b(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_ad7d3b(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_ad7d3b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ad7d3b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ad7d3b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ad7d3b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.spvasm
index 971ee8a..622246f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ad7d3b "textureDimensions_ad7d3b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ad7d3b = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_ad7d3b = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_ad7d3b
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_ad7d3b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_ad7d3b
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_ad7d3b
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_ad7d3b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_ad7d3b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.wgsl
index 4e887c3..7bf9f0a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ad7d3b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8uint, write>;
 
-fn textureDimensions_ad7d3b() {
+fn textureDimensions_ad7d3b() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ad7d3b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce = textureDimensions_ad7d3b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ad7d3b();
+  prevent_dce = textureDimensions_ad7d3b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ad7d3b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl
index 5ac048f..9382189 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32float, read_write>) -> vec3<u32>
-fn textureDimensions_ae4595() {
+fn textureDimensions_ae4595() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ae4595();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ae4595();
+  prevent_dce = textureDimensions_ae4595();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ae4595();
+  prevent_dce = textureDimensions_ae4595();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ae4595();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.dxc.hlsl
index 711201a..ffa363f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ae4595() {
+uint3 textureDimensions_ae4595() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ae4595();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ae4595();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ae4595()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ae4595();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ae4595()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ae4595();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.fxc.hlsl
index 711201a..ffa363f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ae4595() {
+uint3 textureDimensions_ae4595() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ae4595();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ae4595();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ae4595()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ae4595();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ae4595()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ae4595();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.msl
index eeb3cce..9f76096 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ae4595(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_ae4595(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_ae4595(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_ae4595(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_ae4595(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ae4595(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ae4595(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ae4595(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.spvasm
index b708736..9b707a7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ae4595 "textureDimensions_ae4595"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ae4595 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_ae4595 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_ae4595
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_ae4595
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_ae4595
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_ae4595
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_ae4595
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_ae4595
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.wgsl
index 2ed99f0..19499a1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae4595.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32float, read_write>;
 
-fn textureDimensions_ae4595() {
+fn textureDimensions_ae4595() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ae4595();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ae4595();
+  prevent_dce = textureDimensions_ae4595();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ae4595();
+  prevent_dce = textureDimensions_ae4595();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ae4595();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl
index afcaaff..7328074 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16uint, read_write>) -> u32
-fn textureDimensions_ae75a7() {
+fn textureDimensions_ae75a7() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ae75a7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ae75a7();
+  prevent_dce = textureDimensions_ae75a7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ae75a7();
+  prevent_dce = textureDimensions_ae75a7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ae75a7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.dxc.hlsl
index 5012542..d63ae7e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ae75a7() {
+uint textureDimensions_ae75a7() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ae75a7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ae75a7();
+  prevent_dce.Store(0u, asuint(textureDimensions_ae75a7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ae75a7();
+  prevent_dce.Store(0u, asuint(textureDimensions_ae75a7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ae75a7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.fxc.hlsl
index 5012542..d63ae7e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ae75a7() {
+uint textureDimensions_ae75a7() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ae75a7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ae75a7();
+  prevent_dce.Store(0u, asuint(textureDimensions_ae75a7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ae75a7();
+  prevent_dce.Store(0u, asuint(textureDimensions_ae75a7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ae75a7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.glsl
index 33ffa2e..0dd2b10 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_ae75a7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_ae75a7();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_ae75a7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_ae75a7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_ae75a7();
+  prevent_dce.inner = textureDimensions_ae75a7();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_ae75a7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_ae75a7() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_ae75a7();
+  prevent_dce.inner = textureDimensions_ae75a7();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_ae75a7() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_ae75a7();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.msl
index 6952278..bb3fe7d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ae75a7(texture1d<uint, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_ae75a7(texture1d<uint, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_ae75a7(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_ae75a7(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_ae75a7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ae75a7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ae75a7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ae75a7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.spvasm
index f45a6ba..2fe304e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ae75a7 "textureDimensions_ae75a7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ae75a7 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_ae75a7 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_ae75a7
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_ae75a7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_ae75a7
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_ae75a7
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_ae75a7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_ae75a7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.wgsl
index cf27394..e3b4e71 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ae75a7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16uint, read_write>;
 
-fn textureDimensions_ae75a7() {
+fn textureDimensions_ae75a7() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ae75a7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ae75a7();
+  prevent_dce = textureDimensions_ae75a7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ae75a7();
+  prevent_dce = textureDimensions_ae75a7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ae75a7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl
index ce6338c..7eae86e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32sint, write>) -> vec2<u32>
-fn textureDimensions_af46ab() {
+fn textureDimensions_af46ab() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_af46ab();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_af46ab();
+  prevent_dce = textureDimensions_af46ab();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_af46ab();
+  prevent_dce = textureDimensions_af46ab();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_af46ab();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.dxc.hlsl
index d2c7015..8a79cad 100644
--- a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_af46ab() {
+uint2 textureDimensions_af46ab() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_af46ab();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_af46ab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_af46ab()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_af46ab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_af46ab()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_af46ab();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.fxc.hlsl
index d2c7015..8a79cad 100644
--- a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_af46ab() {
+uint2 textureDimensions_af46ab() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_af46ab();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_af46ab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_af46ab()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_af46ab();
+  prevent_dce.Store2(0u, asuint(textureDimensions_af46ab()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_af46ab();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.msl
index 98dd440..54b28a1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_af46ab(texture2d_array<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_af46ab(texture2d_array<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_af46ab(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_af46ab(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_af46ab(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_af46ab(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_af46ab(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_af46ab(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.spvasm
index 253712e..d88b6377 100644
--- a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,76 +21,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_af46ab "textureDimensions_af46ab"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_af46ab = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_af46ab = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_af46ab
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_af46ab
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_af46ab
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_af46ab
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_af46ab
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_af46ab
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.wgsl
index b01989a..fba624d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/af46ab.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32sint, write>;
 
-fn textureDimensions_af46ab() {
+fn textureDimensions_af46ab() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_af46ab();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_af46ab();
+  prevent_dce = textureDimensions_af46ab();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_af46ab();
+  prevent_dce = textureDimensions_af46ab();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_af46ab();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl
index 90a8e61..6465c72 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16sint, read_write>) -> vec2<u32>
-fn textureDimensions_b16352() {
+fn textureDimensions_b16352() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b16352();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b16352();
+  prevent_dce = textureDimensions_b16352();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b16352();
+  prevent_dce = textureDimensions_b16352();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b16352();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.dxc.hlsl
index e3850fc..30d3948 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b16352() {
+uint2 textureDimensions_b16352() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b16352();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b16352();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b16352()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b16352();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b16352()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b16352();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.fxc.hlsl
index e3850fc..30d3948 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b16352() {
+uint2 textureDimensions_b16352() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b16352();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b16352();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b16352()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b16352();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b16352()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b16352();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.glsl
index 70c71a4..21a6161 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_b16352() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b16352();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_b16352() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b16352() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b16352();
+  prevent_dce.inner = textureDimensions_b16352();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_b16352() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b16352() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b16352();
+  prevent_dce.inner = textureDimensions_b16352();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_b16352() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b16352();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.msl
index 3835ab0..d65c464 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b16352(texture2d<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_b16352(texture2d<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b16352(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b16352(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_b16352(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b16352(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b16352(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b16352(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.spvasm
index 9cab36f..e1e1ce7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b16352 "textureDimensions_b16352"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b16352 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_b16352 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_b16352
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_b16352
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_b16352
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_b16352
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_b16352
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_b16352
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.wgsl
index 3db99da..ae60012 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b16352.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16sint, read_write>;
 
-fn textureDimensions_b16352() {
+fn textureDimensions_b16352() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b16352();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b16352();
+  prevent_dce = textureDimensions_b16352();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b16352();
+  prevent_dce = textureDimensions_b16352();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b16352();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl
index b3a4d64..8158689 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8sint, read_write>) -> vec2<u32>
-fn textureDimensions_b284b8() {
+fn textureDimensions_b284b8() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b284b8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b284b8();
+  prevent_dce = textureDimensions_b284b8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b284b8();
+  prevent_dce = textureDimensions_b284b8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b284b8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.dxc.hlsl
index de726e2..f5f119b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b284b8() {
+uint2 textureDimensions_b284b8() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b284b8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b284b8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b284b8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b284b8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b284b8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b284b8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.fxc.hlsl
index de726e2..f5f119b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b284b8() {
+uint2 textureDimensions_b284b8() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b284b8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b284b8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b284b8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b284b8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b284b8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b284b8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.glsl
index ac03184..a50f60c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_b284b8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b284b8();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_b284b8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b284b8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b284b8();
+  prevent_dce.inner = textureDimensions_b284b8();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_b284b8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b284b8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b284b8();
+  prevent_dce.inner = textureDimensions_b284b8();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_b284b8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b284b8();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.msl
index a04c751..3463d19 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b284b8(texture2d<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_b284b8(texture2d<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b284b8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b284b8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_b284b8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b284b8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b284b8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b284b8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.spvasm
index 3b3ae51..1ff9f0c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b284b8 "textureDimensions_b284b8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b284b8 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_b284b8 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_b284b8
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_b284b8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_b284b8
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_b284b8
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_b284b8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_b284b8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.wgsl
index 82895bf..03e360d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b284b8.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8sint, read_write>;
 
-fn textureDimensions_b284b8() {
+fn textureDimensions_b284b8() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b284b8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b284b8();
+  prevent_dce = textureDimensions_b284b8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b284b8();
+  prevent_dce = textureDimensions_b284b8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b284b8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl
index 1f47c9e..6278bb1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<f32>;
 
 // fn textureDimensions(texture: texture_cube_array<f32>, level: i32) -> vec2<u32>
-fn textureDimensions_b3ab5e() {
+fn textureDimensions_b3ab5e() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b3ab5e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce = textureDimensions_b3ab5e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce = textureDimensions_b3ab5e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b3ab5e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.dxc.hlsl
index f23f00f..c056a7d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b3ab5e() {
+uint2 textureDimensions_b3ab5e() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b3ab5e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b3ab5e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b3ab5e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b3ab5e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.fxc.hlsl
index f23f00f..c056a7d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b3ab5e() {
+uint2 textureDimensions_b3ab5e() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b3ab5e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b3ab5e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b3ab5e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b3ab5e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.msl
index 20a6b96..e798c05 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b3ab5e(texturecube_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_b3ab5e(texturecube_array<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b3ab5e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b3ab5e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_b3ab5e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b3ab5e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b3ab5e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b3ab5e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.spvasm
index ca3f4c5..77a21f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,81 +22,108 @@
                OpName %textureDimensions_b3ab5e "textureDimensions_b3ab5e"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b3ab5e = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_b3ab5e = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_b3ab5e
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_b3ab5e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_b3ab5e
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_b3ab5e
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_b3ab5e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_b3ab5e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.wgsl
index ed0e9c3..a9539ef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b3ab5e.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
-fn textureDimensions_b3ab5e() {
+fn textureDimensions_b3ab5e() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b3ab5e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce = textureDimensions_b3ab5e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b3ab5e();
+  prevent_dce = textureDimensions_b3ab5e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b3ab5e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl
index c5c11d3..6e15d1c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_1d<i32>;
 
 // fn textureDimensions(texture: texture_1d<i32>, level: i32) -> u32
-fn textureDimensions_b46d97() {
+fn textureDimensions_b46d97() -> u32{
   var arg_1 = 1i;
   var res: u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b46d97();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b46d97();
+  prevent_dce = textureDimensions_b46d97();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b46d97();
+  prevent_dce = textureDimensions_b46d97();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b46d97();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.dxc.hlsl
index 4add3de..93faa77 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b46d97() {
+uint textureDimensions_b46d97() {
   int arg_1 = 1;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b46d97();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b46d97();
+  prevent_dce.Store(0u, asuint(textureDimensions_b46d97()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b46d97();
+  prevent_dce.Store(0u, asuint(textureDimensions_b46d97()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b46d97();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.fxc.hlsl
index 4add3de..93faa77 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b46d97() {
+uint textureDimensions_b46d97() {
   int arg_1 = 1;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b46d97();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b46d97();
+  prevent_dce.Store(0u, asuint(textureDimensions_b46d97()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b46d97();
+  prevent_dce.Store(0u, asuint(textureDimensions_b46d97()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b46d97();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.glsl
index 02a72ac..6c599f8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_b46d97() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b46d97();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2D arg_0_1;
+uint textureDimensions_b46d97() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_b46d97() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b46d97();
+  prevent_dce.inner = textureDimensions_b46d97();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isampler2D arg_0_1;
+uint textureDimensions_b46d97() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_b46d97() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b46d97();
+  prevent_dce.inner = textureDimensions_b46d97();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp isampler2D arg_0_1;
+uint textureDimensions_b46d97() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b46d97();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.msl
index e15df18..918ad9c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b46d97(texture1d<int, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_b46d97(texture1d<int, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b46d97(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b46d97(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_b46d97(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b46d97(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b46d97(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b46d97(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.spvasm
index 87415e5..d726b80 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,78 +22,105 @@
                OpName %textureDimensions_b46d97 "textureDimensions_b46d97"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %24 = OpConstantNull %int
+         %26 = OpConstantNull %int
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %30 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b46d97 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %24
-        %res = OpVariable %_ptr_Function_uint Function %30
+%textureDimensions_b46d97 = OpFunction %uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %26
+        %res = OpVariable %_ptr_Function_uint Function %9
                OpStore %arg_1 %int_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %int %arg_1
-         %25 = OpImageQuerySizeLod %uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %34 = OpLoad %uint %res
-               OpStore %33 %34
+         %28 = OpLoad %15 %arg_0
+         %29 = OpLoad %int %arg_1
+         %27 = OpImageQuerySizeLod %uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %uint %textureDimensions_b46d97
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_b46d97
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %uint %textureDimensions_b46d97
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %55 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %56 = OpFunctionCall %uint %textureDimensions_b46d97
+               OpStore %55 %56
+         %57 = OpLoad %VertexOutput %out
+               OpReturnValue %57
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %59 = OpLabel
+         %60 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %61 = OpCompositeExtract %v4float %60 0
+               OpStore %pos_1 %61
+         %62 = OpCompositeExtract %uint %60 1
+               OpStore %prevent_dce_1 %62
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_b46d97
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_b46d97
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.wgsl
index b623537..0c06896 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b46d97.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_1d<i32>;
 
-fn textureDimensions_b46d97() {
+fn textureDimensions_b46d97() -> u32 {
   var arg_1 = 1i;
   var res : u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b46d97();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b46d97();
+  prevent_dce = textureDimensions_b46d97();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b46d97();
+  prevent_dce = textureDimensions_b46d97();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b46d97();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl
index 7116a32..d1a2b98 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32float, write>) -> u32
-fn textureDimensions_b51345() {
+fn textureDimensions_b51345() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b51345();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b51345();
+  prevent_dce = textureDimensions_b51345();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b51345();
+  prevent_dce = textureDimensions_b51345();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b51345();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.dxc.hlsl
index 1c06d8b..4f888a6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b51345() {
+uint textureDimensions_b51345() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b51345();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b51345();
+  prevent_dce.Store(0u, asuint(textureDimensions_b51345()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b51345();
+  prevent_dce.Store(0u, asuint(textureDimensions_b51345()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b51345();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.fxc.hlsl
index 1c06d8b..4f888a6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b51345() {
+uint textureDimensions_b51345() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b51345();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b51345();
+  prevent_dce.Store(0u, asuint(textureDimensions_b51345()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b51345();
+  prevent_dce.Store(0u, asuint(textureDimensions_b51345()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b51345();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.msl
index 2fe576c..9daecb1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b51345(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_b51345(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b51345(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b51345(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_b51345(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b51345(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b51345(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b51345(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.spvasm
index 8776968..e4e48d4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,72 +22,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b51345 "textureDimensions_b51345"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b51345 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_b51345 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_b51345
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_b51345
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_b51345
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_b51345
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_b51345
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_b51345
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.wgsl
index 7eab351..a735f3d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b51345.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32float, write>;
 
-fn textureDimensions_b51345() {
+fn textureDimensions_b51345() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b51345();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b51345();
+  prevent_dce = textureDimensions_b51345();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b51345();
+  prevent_dce = textureDimensions_b51345();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b51345();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl
index bbcddfb..16ab593 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32uint, read>) -> vec2<u32>
-fn textureDimensions_b56112() {
+fn textureDimensions_b56112() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b56112();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b56112();
+  prevent_dce = textureDimensions_b56112();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b56112();
+  prevent_dce = textureDimensions_b56112();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b56112();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.dxc.hlsl
index 85cfaff..a5209b9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b56112() {
+uint2 textureDimensions_b56112() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b56112();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b56112();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b56112()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b56112();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b56112()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b56112();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.fxc.hlsl
index 85cfaff..a5209b9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b56112() {
+uint2 textureDimensions_b56112() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b56112();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b56112();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b56112()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b56112();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b56112()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b56112();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.glsl
index bd93954..f7e084d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_b56112() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b56112();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_b56112() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b56112() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b56112();
+  prevent_dce.inner = textureDimensions_b56112();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_b56112() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b56112() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b56112();
+  prevent_dce.inner = textureDimensions_b56112();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_b56112() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b56112();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.msl
index 067fa80..be75edc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b56112(texture2d<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_b56112(texture2d<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b56112(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b56112(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_b56112(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b56112(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b56112(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b56112(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.spvasm
index 293c96a..af31023 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b56112 "textureDimensions_b56112"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b56112 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_b56112 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_b56112
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_b56112
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_b56112
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_b56112
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_b56112
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_b56112
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.wgsl
index 8e3e9a3..8f8ec3d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b56112.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32uint, read>;
 
-fn textureDimensions_b56112() {
+fn textureDimensions_b56112() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b56112();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b56112();
+  prevent_dce = textureDimensions_b56112();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b56112();
+  prevent_dce = textureDimensions_b56112();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b56112();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl
index 7d65af6..b70f0bc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16float, read>) -> u32
-fn textureDimensions_b5ba03() {
+fn textureDimensions_b5ba03() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b5ba03();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b5ba03();
+  prevent_dce = textureDimensions_b5ba03();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b5ba03();
+  prevent_dce = textureDimensions_b5ba03();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b5ba03();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.dxc.hlsl
index faf4823..55f85a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b5ba03() {
+uint textureDimensions_b5ba03() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b5ba03();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b5ba03();
+  prevent_dce.Store(0u, asuint(textureDimensions_b5ba03()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b5ba03();
+  prevent_dce.Store(0u, asuint(textureDimensions_b5ba03()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b5ba03();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.fxc.hlsl
index faf4823..55f85a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b5ba03() {
+uint textureDimensions_b5ba03() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b5ba03();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b5ba03();
+  prevent_dce.Store(0u, asuint(textureDimensions_b5ba03()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b5ba03();
+  prevent_dce.Store(0u, asuint(textureDimensions_b5ba03()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b5ba03();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.glsl
index c7f42ba..c6959a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_b5ba03() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b5ba03();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp readonly image2D arg_0;
+uint textureDimensions_b5ba03() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_b5ba03() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b5ba03();
+  prevent_dce.inner = textureDimensions_b5ba03();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp readonly image2D arg_0;
+uint textureDimensions_b5ba03() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_b5ba03() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b5ba03();
+  prevent_dce.inner = textureDimensions_b5ba03();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16f) uniform highp readonly image2D arg_0;
+uint textureDimensions_b5ba03() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b5ba03();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.msl
index 392cd4c..b907d22 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b5ba03(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_b5ba03(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b5ba03(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b5ba03(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_b5ba03(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b5ba03(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b5ba03(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b5ba03(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.spvasm
index 2a37dd6..6ba9b16 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b5ba03 "textureDimensions_b5ba03"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b5ba03 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_b5ba03 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_b5ba03
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_b5ba03
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_b5ba03
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_b5ba03
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_b5ba03
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_b5ba03
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.wgsl
index f96913d..212f1fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5ba03.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16float, read>;
 
-fn textureDimensions_b5ba03() {
+fn textureDimensions_b5ba03() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b5ba03();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b5ba03();
+  prevent_dce = textureDimensions_b5ba03();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b5ba03();
+  prevent_dce = textureDimensions_b5ba03();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b5ba03();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl
index 4f0f528..018a921 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32sint, read_write>) -> vec2<u32>
-fn textureDimensions_b5d68e() {
+fn textureDimensions_b5d68e() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b5d68e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b5d68e();
+  prevent_dce = textureDimensions_b5d68e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b5d68e();
+  prevent_dce = textureDimensions_b5d68e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b5d68e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.dxc.hlsl
index ba37cdb..90a390f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b5d68e() {
+uint2 textureDimensions_b5d68e() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b5d68e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b5d68e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b5d68e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b5d68e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b5d68e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b5d68e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.fxc.hlsl
index ba37cdb..90a390f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b5d68e() {
+uint2 textureDimensions_b5d68e() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b5d68e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b5d68e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b5d68e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b5d68e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b5d68e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b5d68e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.glsl
index fb36057..d13e7b5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_b5d68e() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b5d68e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_b5d68e() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b5d68e() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b5d68e();
+  prevent_dce.inner = textureDimensions_b5d68e();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_b5d68e() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b5d68e() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b5d68e();
+  prevent_dce.inner = textureDimensions_b5d68e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_b5d68e() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b5d68e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.msl
index d422966..0c1c456 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b5d68e(texture2d_array<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_b5d68e(texture2d_array<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b5d68e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b5d68e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_b5d68e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b5d68e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b5d68e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b5d68e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.spvasm
index d3a8712..1f5aa8a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b5d68e "textureDimensions_b5d68e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b5d68e = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_b5d68e = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_b5d68e
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_b5d68e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_b5d68e
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_b5d68e
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_b5d68e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_b5d68e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.wgsl
index f696948..ca10716 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b5d68e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32sint, read_write>;
 
-fn textureDimensions_b5d68e() {
+fn textureDimensions_b5d68e() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b5d68e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b5d68e();
+  prevent_dce = textureDimensions_b5d68e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b5d68e();
+  prevent_dce = textureDimensions_b5d68e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b5d68e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl
index 3878ea8..720bc99 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16uint, read>) -> vec3<u32>
-fn textureDimensions_b6bbf4() {
+fn textureDimensions_b6bbf4() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b6bbf4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce = textureDimensions_b6bbf4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce = textureDimensions_b6bbf4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b6bbf4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.dxc.hlsl
index 868598f..4864daf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b6bbf4() {
+uint3 textureDimensions_b6bbf4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b6bbf4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_b6bbf4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_b6bbf4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b6bbf4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.fxc.hlsl
index 868598f..4864daf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b6bbf4() {
+uint3 textureDimensions_b6bbf4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b6bbf4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_b6bbf4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_b6bbf4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b6bbf4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.glsl
index 5dd68da..2ccf33a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp readonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_b6bbf4() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b6bbf4();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_b6bbf4() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_b6bbf4() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce.inner = textureDimensions_b6bbf4();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_b6bbf4() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_b6bbf4() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce.inner = textureDimensions_b6bbf4();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16ui) uniform highp readonly uimage3D arg_0;
+uvec3 textureDimensions_b6bbf4() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b6bbf4();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.msl
index 6657c2e..a63eaa5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b6bbf4(texture3d<uint, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_b6bbf4(texture3d<uint, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_b6bbf4(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_b6bbf4(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_b6bbf4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b6bbf4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b6bbf4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b6bbf4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.spvasm
index f935538..402ab99 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b6bbf4 "textureDimensions_b6bbf4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b6bbf4 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_b6bbf4 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_b6bbf4
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_b6bbf4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_b6bbf4
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_b6bbf4
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_b6bbf4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_b6bbf4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.wgsl
index 5c03612..1dedd3f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b6bbf4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16uint, read>;
 
-fn textureDimensions_b6bbf4() {
+fn textureDimensions_b6bbf4() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b6bbf4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce = textureDimensions_b6bbf4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b6bbf4();
+  prevent_dce = textureDimensions_b6bbf4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b6bbf4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl
index bfa33eb..22fb142 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32uint, read_write>) -> vec2<u32>
-fn textureDimensions_b8287f() {
+fn textureDimensions_b8287f() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b8287f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b8287f();
+  prevent_dce = textureDimensions_b8287f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b8287f();
+  prevent_dce = textureDimensions_b8287f();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b8287f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.dxc.hlsl
index 31926ef..7ed1371 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b8287f() {
+uint2 textureDimensions_b8287f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b8287f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b8287f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b8287f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b8287f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b8287f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b8287f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.fxc.hlsl
index 31926ef..7ed1371 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b8287f() {
+uint2 textureDimensions_b8287f() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b8287f();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b8287f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b8287f()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b8287f();
+  prevent_dce.Store2(0u, asuint(textureDimensions_b8287f()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b8287f();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.glsl
index 29623d6..ddbf20e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_b8287f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b8287f();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp uimage2DArray arg_0;
+uvec2 textureDimensions_b8287f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b8287f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b8287f();
+  prevent_dce.inner = textureDimensions_b8287f();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp uimage2DArray arg_0;
+uvec2 textureDimensions_b8287f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_b8287f() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b8287f();
+  prevent_dce.inner = textureDimensions_b8287f();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32ui) uniform highp uimage2DArray arg_0;
+uvec2 textureDimensions_b8287f() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b8287f();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.msl
index 7cfb66e..63546f5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b8287f(texture2d_array<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_b8287f(texture2d_array<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b8287f(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b8287f(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_b8287f(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b8287f(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b8287f(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b8287f(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.spvasm
index c4921d3..58aa65f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b8287f "textureDimensions_b8287f"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b8287f = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_b8287f = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_b8287f
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_b8287f
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_b8287f
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_b8287f
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_b8287f
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_b8287f
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.wgsl
index b2131d9..984907c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b8287f.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32uint, read_write>;
 
-fn textureDimensions_b8287f() {
+fn textureDimensions_b8287f() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b8287f();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b8287f();
+  prevent_dce = textureDimensions_b8287f();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b8287f();
+  prevent_dce = textureDimensions_b8287f();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b8287f();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl
index 3109ba8..5ea02b2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32sint, read>) -> u32
-fn textureDimensions_b9e7ef() {
+fn textureDimensions_b9e7ef() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b9e7ef();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce = textureDimensions_b9e7ef();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce = textureDimensions_b9e7ef();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b9e7ef();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.dxc.hlsl
index 4389a3f..1637a11 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b9e7ef() {
+uint textureDimensions_b9e7ef() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b9e7ef();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce.Store(0u, asuint(textureDimensions_b9e7ef()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce.Store(0u, asuint(textureDimensions_b9e7ef()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b9e7ef();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.fxc.hlsl
index 4389a3f..1637a11 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_b9e7ef() {
+uint textureDimensions_b9e7ef() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_b9e7ef();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce.Store(0u, asuint(textureDimensions_b9e7ef()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce.Store(0u, asuint(textureDimensions_b9e7ef()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_b9e7ef();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.glsl
index 75b4efd..e7c3ada 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_b9e7ef() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_b9e7ef();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_b9e7ef() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_b9e7ef() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce.inner = textureDimensions_b9e7ef();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_b9e7ef() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_b9e7ef() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce.inner = textureDimensions_b9e7ef();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32i) uniform highp readonly iimage2D arg_0;
+uint textureDimensions_b9e7ef() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_b9e7ef();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.msl
index 8cce255..67abca3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_b9e7ef(texture1d<int, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_b9e7ef(texture1d<int, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_b9e7ef(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_b9e7ef(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_b9e7ef(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_b9e7ef(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_b9e7ef(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_b9e7ef(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.spvasm
index 993d90cc..824f653 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_b9e7ef "textureDimensions_b9e7ef"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_b9e7ef = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_b9e7ef = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_b9e7ef
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_b9e7ef
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_b9e7ef
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_b9e7ef
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_b9e7ef
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_b9e7ef
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.wgsl
index a734a13..ddaa760 100644
--- a/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/b9e7ef.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32sint, read>;
 
-fn textureDimensions_b9e7ef() {
+fn textureDimensions_b9e7ef() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b9e7ef();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce = textureDimensions_b9e7ef();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_b9e7ef();
+  prevent_dce = textureDimensions_b9e7ef();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_b9e7ef();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl
index 9e96006..2ee7392 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_3d<f32>;
 
 // fn textureDimensions(texture: texture_3d<f32>) -> vec3<u32>
-fn textureDimensions_bb95d9() {
+fn textureDimensions_bb95d9() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bb95d9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bb95d9();
+  prevent_dce = textureDimensions_bb95d9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bb95d9();
+  prevent_dce = textureDimensions_bb95d9();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bb95d9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.dxc.hlsl
index 1e1408e..8fdb963 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bb95d9() {
+uint3 textureDimensions_bb95d9() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bb95d9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bb95d9();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bb95d9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bb95d9();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bb95d9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bb95d9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.fxc.hlsl
index 1e1408e..8fdb963 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bb95d9() {
+uint3 textureDimensions_bb95d9() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bb95d9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bb95d9();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bb95d9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bb95d9();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bb95d9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bb95d9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.glsl
index 56eb05f..54d4730 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_bb95d9() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_bb95d9();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_bb95d9() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_bb95d9() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_bb95d9();
+  prevent_dce.inner = textureDimensions_bb95d9();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_bb95d9() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_bb95d9() {
-  uvec3 res = uvec3(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_bb95d9();
+  prevent_dce.inner = textureDimensions_bb95d9();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp sampler3D arg_0_1;
+uvec3 textureDimensions_bb95d9() {
+  uvec3 res = uvec3(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_bb95d9();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.msl
index a39c356..8114480 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_bb95d9(texture3d<float, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_bb95d9(texture3d<float, access::sample> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_bb95d9(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_bb95d9(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_bb95d9(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_bb95d9(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_bb95d9(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_bb95d9(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.spvasm
index 2f322c4..385cdcd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_bb95d9 "textureDimensions_bb95d9"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %27 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_bb95d9 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v3uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %31 = OpLoad %v3uint %res
-               OpStore %30 %31
+%textureDimensions_bb95d9 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v3uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v3uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v3uint %textureDimensions_bb95d9
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_bb95d9
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v3uint %textureDimensions_bb95d9
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %53 = OpFunctionCall %v3uint %textureDimensions_bb95d9
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v3uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_bb95d9
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_bb95d9
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.wgsl
index 24f70f1..e685c44 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bb95d9.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-fn textureDimensions_bb95d9() {
+fn textureDimensions_bb95d9() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bb95d9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bb95d9();
+  prevent_dce = textureDimensions_bb95d9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bb95d9();
+  prevent_dce = textureDimensions_bb95d9();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bb95d9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl
index 8c83042..4febcfa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8sint, write>) -> vec2<u32>
-fn textureDimensions_bbe285() {
+fn textureDimensions_bbe285() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bbe285();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bbe285();
+  prevent_dce = textureDimensions_bbe285();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bbe285();
+  prevent_dce = textureDimensions_bbe285();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bbe285();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.dxc.hlsl
index 6c878d7..e982eb5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bbe285() {
+uint2 textureDimensions_bbe285() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bbe285();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bbe285();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bbe285()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bbe285();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bbe285()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bbe285();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.fxc.hlsl
index 6c878d7..e982eb5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bbe285() {
+uint2 textureDimensions_bbe285() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bbe285();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bbe285();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bbe285()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bbe285();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bbe285()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bbe285();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.glsl
index 5aef035..923608d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_bbe285() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_bbe285();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_bbe285() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_bbe285() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_bbe285();
+  prevent_dce.inner = textureDimensions_bbe285();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_bbe285() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_bbe285() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_bbe285();
+  prevent_dce.inner = textureDimensions_bbe285();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_bbe285() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_bbe285();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.msl
index 28efec6..e3ff6af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_bbe285(texture2d_array<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_bbe285(texture2d_array<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_bbe285(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_bbe285(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_bbe285(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_bbe285(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_bbe285(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_bbe285(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.spvasm
index 104e650..7ae7c4a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_bbe285 "textureDimensions_bbe285"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_bbe285 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_bbe285 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_bbe285
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_bbe285
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_bbe285
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_bbe285
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_bbe285
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_bbe285
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.wgsl
index e36a21b..7a91c6a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bbe285.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8sint, write>;
 
-fn textureDimensions_bbe285() {
+fn textureDimensions_bbe285() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bbe285();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bbe285();
+  prevent_dce = textureDimensions_bbe285();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bbe285();
+  prevent_dce = textureDimensions_bbe285();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bbe285();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl
index a05d5cb..53de9dc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32float, read_write>) -> vec2<u32>
-fn textureDimensions_bc96f6() {
+fn textureDimensions_bc96f6() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bc96f6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bc96f6();
+  prevent_dce = textureDimensions_bc96f6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bc96f6();
+  prevent_dce = textureDimensions_bc96f6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bc96f6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.dxc.hlsl
index b53f8cb..6fba9b1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bc96f6() {
+uint2 textureDimensions_bc96f6() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bc96f6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bc96f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bc96f6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bc96f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bc96f6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bc96f6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.fxc.hlsl
index b53f8cb..6fba9b1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bc96f6() {
+uint2 textureDimensions_bc96f6() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bc96f6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bc96f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bc96f6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bc96f6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bc96f6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bc96f6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.glsl
index 6f6533b..f489171 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_bc96f6() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_bc96f6();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_bc96f6() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_bc96f6() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_bc96f6();
+  prevent_dce.inner = textureDimensions_bc96f6();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_bc96f6() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_bc96f6() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_bc96f6();
+  prevent_dce.inner = textureDimensions_bc96f6();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_bc96f6() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_bc96f6();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.msl
index 4f7f09a..cfc550c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_bc96f6(texture2d_array<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_bc96f6(texture2d_array<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_bc96f6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_bc96f6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_bc96f6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_bc96f6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_bc96f6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_bc96f6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.spvasm
index 4a831ab..be7339f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_bc96f6 "textureDimensions_bc96f6"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_bc96f6 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_bc96f6 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_bc96f6
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_bc96f6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_bc96f6
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_bc96f6
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_bc96f6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_bc96f6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.wgsl
index ae4b880..fa6f32f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bc96f6.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32float, read_write>;
 
-fn textureDimensions_bc96f6() {
+fn textureDimensions_bc96f6() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bc96f6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bc96f6();
+  prevent_dce = textureDimensions_bc96f6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bc96f6();
+  prevent_dce = textureDimensions_bc96f6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bc96f6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl
index b7f6cc2..9fcf659 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn textureDimensions(texture: texture_depth_cube_array, level: u32) -> vec2<u32>
-fn textureDimensions_bd94c8() {
+fn textureDimensions_bd94c8() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bd94c8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bd94c8();
+  prevent_dce = textureDimensions_bd94c8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bd94c8();
+  prevent_dce = textureDimensions_bd94c8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bd94c8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.dxc.hlsl
index e280cb8..97f6eaa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bd94c8() {
+uint2 textureDimensions_bd94c8() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bd94c8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bd94c8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bd94c8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bd94c8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bd94c8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bd94c8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.fxc.hlsl
index e280cb8..97f6eaa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bd94c8() {
+uint2 textureDimensions_bd94c8() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bd94c8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bd94c8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bd94c8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bd94c8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_bd94c8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bd94c8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.msl
index 23f52ba..ebdc7a5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_bd94c8(depthcube_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_bd94c8(depthcube_array<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depthcube_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_bd94c8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depthcube_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_bd94c8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depthcube_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_bd94c8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depthcube_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_bd94c8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depthcube_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depthcube_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depthcube_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_bd94c8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depthcube_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_bd94c8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.spvasm
index 14baf0e..58005d2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 51
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,80 +22,106 @@
                OpName %textureDimensions_bd94c8 "textureDimensions_bd94c8"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %32 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %37 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %47 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %53 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_bd94c8 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %32
+%textureDimensions_bd94c8 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %28 = OpLoad %11 %arg_0
-         %29 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %28 %29
-         %25 = OpVectorShuffle %v2uint %26 %26 0 1
-               OpStore %res %25
-         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %36 = OpLoad %v2uint %res
-               OpStore %35 %36
+         %30 = OpLoad %16 %arg_0
+         %31 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %30 %31
+         %27 = OpVectorShuffle %v2uint %28 %28 0 1
+               OpStore %res %27
+         %34 = OpLoad %v2uint %res
+               OpReturnValue %34
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %35
+         %38 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_bd94c8
+               OpStore %41 %42
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %37
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_bd94c8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %35
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %46 = OpFunctionCall %v2uint %textureDimensions_bd94c8
+               OpStore %45 %46
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %43
+%vertex_main_inner = OpFunction %VertexOutput None %47
+         %50 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %53
+         %55 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %55 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_bd94c8
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %35
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_bd94c8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %49 = OpLabel
-         %50 = OpFunctionCall %void %textureDimensions_bd94c8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.wgsl
index 3a14b19..2f17808 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bd94c8.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-fn textureDimensions_bd94c8() {
+fn textureDimensions_bd94c8() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bd94c8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bd94c8();
+  prevent_dce = textureDimensions_bd94c8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bd94c8();
+  prevent_dce = textureDimensions_bd94c8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bd94c8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl
index a9db6c9..df2f060 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32float, read>) -> vec3<u32>
-fn textureDimensions_bec716() {
+fn textureDimensions_bec716() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bec716();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bec716();
+  prevent_dce = textureDimensions_bec716();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bec716();
+  prevent_dce = textureDimensions_bec716();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bec716();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.dxc.hlsl
index cf7d9fd6..8a55bbc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bec716() {
+uint3 textureDimensions_bec716() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bec716();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bec716();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bec716()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bec716();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bec716()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bec716();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.fxc.hlsl
index cf7d9fd6..8a55bbc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bec716() {
+uint3 textureDimensions_bec716() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bec716();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bec716();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bec716()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bec716();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bec716()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bec716();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.glsl
index 7114686..ae15a5a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32f) uniform highp readonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_bec716() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_bec716();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_bec716() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_bec716() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_bec716();
+  prevent_dce.inner = textureDimensions_bec716();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_bec716() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_bec716() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_bec716();
+  prevent_dce.inner = textureDimensions_bec716();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32f) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_bec716() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_bec716();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.msl
index 72b86e6..55e3c19 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_bec716(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_bec716(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_bec716(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_bec716(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_bec716(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_bec716(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_bec716(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_bec716(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.spvasm
index 2cb96d6..751a9f1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_bec716 "textureDimensions_bec716"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_bec716 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_bec716 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_bec716
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_bec716
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_bec716
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_bec716
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_bec716
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_bec716
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.wgsl
index 3394d9f..e4876b6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bec716.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32float, read>;
 
-fn textureDimensions_bec716() {
+fn textureDimensions_bec716() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bec716();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bec716();
+  prevent_dce = textureDimensions_bec716();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bec716();
+  prevent_dce = textureDimensions_bec716();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bec716();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl
index 9fb8889..326d50d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8snorm, read>) -> vec3<u32>
-fn textureDimensions_bf9170() {
+fn textureDimensions_bf9170() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bf9170();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bf9170();
+  prevent_dce = textureDimensions_bf9170();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bf9170();
+  prevent_dce = textureDimensions_bf9170();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bf9170();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.dxc.hlsl
index b713de1..70a9f94 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bf9170() {
+uint3 textureDimensions_bf9170() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bf9170();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bf9170();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bf9170()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bf9170();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bf9170()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bf9170();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.fxc.hlsl
index b713de1..70a9f94 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_bf9170() {
+uint3 textureDimensions_bf9170() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_bf9170();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_bf9170();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bf9170()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_bf9170();
+  prevent_dce.Store3(0u, asuint(textureDimensions_bf9170()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_bf9170();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.glsl
index f3e198f..b71400b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp readonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_bf9170() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_bf9170();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_bf9170() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_bf9170() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_bf9170();
+  prevent_dce.inner = textureDimensions_bf9170();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_bf9170() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_bf9170() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_bf9170();
+  prevent_dce.inner = textureDimensions_bf9170();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8_snorm) uniform highp readonly image3D arg_0;
+uvec3 textureDimensions_bf9170() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_bf9170();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.msl
index f3ea6c8..d300568 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_bf9170(texture3d<float, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_bf9170(texture3d<float, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_bf9170(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_bf9170(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_bf9170(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_bf9170(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_bf9170(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_bf9170(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.spvasm
index 51cfbb8..6c2f73b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_bf9170 "textureDimensions_bf9170"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_bf9170 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_bf9170 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_bf9170
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_bf9170
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_bf9170
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_bf9170
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_bf9170
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_bf9170
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.wgsl
index 9388c5a..f4f68ac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/bf9170.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8snorm, read>;
 
-fn textureDimensions_bf9170() {
+fn textureDimensions_bf9170() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bf9170();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_bf9170();
+  prevent_dce = textureDimensions_bf9170();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_bf9170();
+  prevent_dce = textureDimensions_bf9170();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_bf9170();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl
index a2e6c0b..6caea5a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32float, read>) -> vec2<u32>
-fn textureDimensions_c1189e() {
+fn textureDimensions_c1189e() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c1189e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c1189e();
+  prevent_dce = textureDimensions_c1189e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c1189e();
+  prevent_dce = textureDimensions_c1189e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c1189e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.dxc.hlsl
index a0ca033..0c0d8cf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c1189e() {
+uint2 textureDimensions_c1189e() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c1189e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c1189e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1189e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c1189e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1189e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c1189e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.fxc.hlsl
index a0ca033..0c0d8cf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c1189e() {
+uint2 textureDimensions_c1189e() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c1189e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c1189e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1189e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c1189e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1189e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c1189e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.glsl
index d0dab38..b383ee9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp readonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_c1189e() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c1189e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_c1189e() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c1189e() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c1189e();
+  prevent_dce.inner = textureDimensions_c1189e();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_c1189e() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c1189e() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c1189e();
+  prevent_dce.inner = textureDimensions_c1189e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_c1189e() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c1189e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.msl
index d72929a..af31020 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c1189e(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_c1189e(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c1189e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c1189e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_c1189e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c1189e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c1189e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c1189e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.spvasm
index b1cdd1f..82a91e6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c1189e "textureDimensions_c1189e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c1189e = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_c1189e = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_c1189e
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_c1189e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_c1189e
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_c1189e
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_c1189e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_c1189e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.wgsl
index e1d57db..75947d5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1189e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32float, read>;
 
-fn textureDimensions_c1189e() {
+fn textureDimensions_c1189e() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c1189e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c1189e();
+  prevent_dce = textureDimensions_c1189e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c1189e();
+  prevent_dce = textureDimensions_c1189e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c1189e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl
index 458a1d2..81f8509 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8uint, write>) -> vec2<u32>
-fn textureDimensions_c1dbf6() {
+fn textureDimensions_c1dbf6() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c1dbf6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce = textureDimensions_c1dbf6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce = textureDimensions_c1dbf6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c1dbf6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.dxc.hlsl
index ed45ef3..4a3f8da 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c1dbf6() {
+uint2 textureDimensions_c1dbf6() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c1dbf6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1dbf6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1dbf6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c1dbf6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.fxc.hlsl
index ed45ef3..4a3f8da 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c1dbf6() {
+uint2 textureDimensions_c1dbf6() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c1dbf6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1dbf6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c1dbf6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c1dbf6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.glsl
index 2df02fa..da8ef19 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_c1dbf6() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c1dbf6();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_c1dbf6() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c1dbf6() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce.inner = textureDimensions_c1dbf6();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_c1dbf6() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c1dbf6() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce.inner = textureDimensions_c1dbf6();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_c1dbf6() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c1dbf6();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.msl
index 6aaebf5..f7f6ea1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c1dbf6(texture2d<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_c1dbf6(texture2d<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c1dbf6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c1dbf6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_c1dbf6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c1dbf6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c1dbf6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c1dbf6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.spvasm
index 8b74255..b805010 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c1dbf6 "textureDimensions_c1dbf6"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c1dbf6 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_c1dbf6 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_c1dbf6
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_c1dbf6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_c1dbf6
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_c1dbf6
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_c1dbf6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_c1dbf6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.wgsl
index fd010a3..a4d8eb8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c1dbf6.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8uint, write>;
 
-fn textureDimensions_c1dbf6() {
+fn textureDimensions_c1dbf6() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c1dbf6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce = textureDimensions_c1dbf6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c1dbf6();
+  prevent_dce = textureDimensions_c1dbf6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c1dbf6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl
index 653b2b0..1a04080 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16sint, read_write>) -> u32
-fn textureDimensions_c27466() {
+fn textureDimensions_c27466() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c27466();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c27466();
+  prevent_dce = textureDimensions_c27466();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c27466();
+  prevent_dce = textureDimensions_c27466();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c27466();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.dxc.hlsl
index ff52a78..d70ce55 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c27466() {
+uint textureDimensions_c27466() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c27466();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c27466();
+  prevent_dce.Store(0u, asuint(textureDimensions_c27466()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c27466();
+  prevent_dce.Store(0u, asuint(textureDimensions_c27466()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c27466();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.fxc.hlsl
index ff52a78..d70ce55 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c27466() {
+uint textureDimensions_c27466() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c27466();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c27466();
+  prevent_dce.Store(0u, asuint(textureDimensions_c27466()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c27466();
+  prevent_dce.Store(0u, asuint(textureDimensions_c27466()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c27466();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.glsl
index 9981db8..6e4bd34 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_c27466() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c27466();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_c27466() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_c27466() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c27466();
+  prevent_dce.inner = textureDimensions_c27466();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_c27466() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_c27466() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c27466();
+  prevent_dce.inner = textureDimensions_c27466();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_c27466() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c27466();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.msl
index 45d5138..9a6dd13 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c27466(texture1d<int, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_c27466(texture1d<int, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c27466(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c27466(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_c27466(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c27466(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c27466(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c27466(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.spvasm
index bca14d4..e931f68 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c27466 "textureDimensions_c27466"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c27466 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_c27466 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_c27466
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_c27466
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_c27466
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_c27466
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_c27466
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_c27466
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.wgsl
index e1288c7..4835acf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c27466.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16sint, read_write>;
 
-fn textureDimensions_c27466() {
+fn textureDimensions_c27466() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c27466();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c27466();
+  prevent_dce = textureDimensions_c27466();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c27466();
+  prevent_dce = textureDimensions_c27466();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c27466();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl
index b7fb6ed..e9beab1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
 
 // fn textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<u32>
-fn textureDimensions_c2cdd3() {
+fn textureDimensions_c2cdd3() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c2cdd3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce = textureDimensions_c2cdd3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce = textureDimensions_c2cdd3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c2cdd3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.dxc.hlsl
index fb25c3a..9372bdb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c2cdd3() {
+uint2 textureDimensions_c2cdd3() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c2cdd3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c2cdd3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c2cdd3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c2cdd3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.fxc.hlsl
index fb25c3a..9372bdb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c2cdd3() {
+uint2 textureDimensions_c2cdd3() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c2cdd3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c2cdd3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c2cdd3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c2cdd3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.glsl
index dde29ab..a0387eb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp sampler2DMS arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_c2cdd3() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c2cdd3();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DMS arg_0_1;
+uvec2 textureDimensions_c2cdd3() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c2cdd3() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce.inner = textureDimensions_c2cdd3();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp sampler2DMS arg_0_1;
+uvec2 textureDimensions_c2cdd3() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c2cdd3() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce.inner = textureDimensions_c2cdd3();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DMS arg_0_1;
+uvec2 textureDimensions_c2cdd3() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c2cdd3();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.msl
index 10160db..8aa2982 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c2cdd3(depth2d_ms<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_c2cdd3(depth2d_ms<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depth2d_ms<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c2cdd3(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depth2d_ms<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c2cdd3(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depth2d_ms<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_c2cdd3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depth2d_ms<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c2cdd3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depth2d_ms<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depth2d_ms<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c2cdd3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c2cdd3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.spvasm
index 48a456f..1fbe702 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c2cdd3 "textureDimensions_c2cdd3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 1 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 1 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c2cdd3 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_c2cdd3 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_c2cdd3
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_c2cdd3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_c2cdd3
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_c2cdd3
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_c2cdd3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_c2cdd3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.wgsl
index 264ca2c..5c7b343 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c2cdd3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
-fn textureDimensions_c2cdd3() {
+fn textureDimensions_c2cdd3() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c2cdd3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce = textureDimensions_c2cdd3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c2cdd3();
+  prevent_dce = textureDimensions_c2cdd3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c2cdd3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl
index e8e1dfa..04dde37 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32sint, write>) -> vec2<u32>
-fn textureDimensions_c44fc1() {
+fn textureDimensions_c44fc1() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c44fc1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c44fc1();
+  prevent_dce = textureDimensions_c44fc1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c44fc1();
+  prevent_dce = textureDimensions_c44fc1();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c44fc1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.dxc.hlsl
index 3587093..bc3439e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c44fc1() {
+uint2 textureDimensions_c44fc1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c44fc1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c44fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c44fc1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c44fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c44fc1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c44fc1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.fxc.hlsl
index 3587093..bc3439e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c44fc1() {
+uint2 textureDimensions_c44fc1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c44fc1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c44fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c44fc1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c44fc1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c44fc1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c44fc1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.glsl
index 2cf79da..656bd2b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_c44fc1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c44fc1();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_c44fc1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c44fc1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c44fc1();
+  prevent_dce.inner = textureDimensions_c44fc1();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_c44fc1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c44fc1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c44fc1();
+  prevent_dce.inner = textureDimensions_c44fc1();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_c44fc1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c44fc1();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.msl
index 71e0c37..ceb785e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c44fc1(texture2d_array<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_c44fc1(texture2d_array<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c44fc1(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c44fc1(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_c44fc1(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c44fc1(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c44fc1(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c44fc1(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.spvasm
index f20713f..ff23cb5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c44fc1 "textureDimensions_c44fc1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c44fc1 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_c44fc1 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_c44fc1
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_c44fc1
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_c44fc1
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_c44fc1
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_c44fc1
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_c44fc1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.wgsl
index 6078ed8..055252f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c44fc1.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32sint, write>;
 
-fn textureDimensions_c44fc1() {
+fn textureDimensions_c44fc1() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c44fc1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c44fc1();
+  prevent_dce = textureDimensions_c44fc1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c44fc1();
+  prevent_dce = textureDimensions_c44fc1();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c44fc1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl
index 728084e..c9f7ecc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_depth_cube;
 
 // fn textureDimensions(texture: texture_depth_cube) -> vec2<u32>
-fn textureDimensions_c5a36e() {
+fn textureDimensions_c5a36e() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c5a36e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c5a36e();
+  prevent_dce = textureDimensions_c5a36e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c5a36e();
+  prevent_dce = textureDimensions_c5a36e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c5a36e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.dxc.hlsl
index f034830..93c587d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c5a36e() {
+uint2 textureDimensions_c5a36e() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c5a36e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c5a36e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c5a36e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c5a36e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c5a36e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c5a36e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.fxc.hlsl
index f034830..93c587d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c5a36e() {
+uint2 textureDimensions_c5a36e() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c5a36e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c5a36e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c5a36e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c5a36e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c5a36e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c5a36e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.glsl
index 11fc5d3..a0cdf58 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp samplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_c5a36e() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c5a36e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_c5a36e() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c5a36e() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c5a36e();
+  prevent_dce.inner = textureDimensions_c5a36e();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_c5a36e() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c5a36e() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c5a36e();
+  prevent_dce.inner = textureDimensions_c5a36e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_c5a36e() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c5a36e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.msl
index 80d9aa2..da44c46 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c5a36e(depthcube<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_c5a36e(depthcube<float, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depthcube<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c5a36e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depthcube<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c5a36e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depthcube<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_c5a36e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depthcube<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c5a36e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depthcube<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depthcube<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depthcube<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c5a36e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depthcube<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c5a36e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.spvasm
index 1c34fe9..61e8300 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c5a36e "textureDimensions_c5a36e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c5a36e = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySizeLod %v2uint %22 %int_0
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_c5a36e = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySizeLod %v2uint %24 %int_0
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_c5a36e
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_c5a36e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_c5a36e
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_c5a36e
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_c5a36e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_c5a36e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.wgsl
index 570a9bd..0818250 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c5a36e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-fn textureDimensions_c5a36e() {
+fn textureDimensions_c5a36e() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c5a36e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c5a36e();
+  prevent_dce = textureDimensions_c5a36e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c5a36e();
+  prevent_dce = textureDimensions_c5a36e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c5a36e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl
index c50e18f..4746cd2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32sint, read_write>) -> vec2<u32>
-fn textureDimensions_c6b44c() {
+fn textureDimensions_c6b44c() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c6b44c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c6b44c();
+  prevent_dce = textureDimensions_c6b44c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c6b44c();
+  prevent_dce = textureDimensions_c6b44c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c6b44c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.dxc.hlsl
index 01d8ee5..79c0f65 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c6b44c() {
+uint2 textureDimensions_c6b44c() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c6b44c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c6b44c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c6b44c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c6b44c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c6b44c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c6b44c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.fxc.hlsl
index 01d8ee5..79c0f65 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c6b44c() {
+uint2 textureDimensions_c6b44c() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c6b44c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c6b44c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c6b44c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c6b44c();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c6b44c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c6b44c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.glsl
index 53b69e3..49668e3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_c6b44c() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c6b44c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp iimage2D arg_0;
+uvec2 textureDimensions_c6b44c() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c6b44c() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c6b44c();
+  prevent_dce.inner = textureDimensions_c6b44c();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp iimage2D arg_0;
+uvec2 textureDimensions_c6b44c() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_c6b44c() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c6b44c();
+  prevent_dce.inner = textureDimensions_c6b44c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32i) uniform highp iimage2D arg_0;
+uvec2 textureDimensions_c6b44c() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c6b44c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.msl
index 3a3f6ef..12ac573 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c6b44c(texture2d<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_c6b44c(texture2d<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c6b44c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c6b44c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_c6b44c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c6b44c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c6b44c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c6b44c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.spvasm
index d38cdae..45916da 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c6b44c "textureDimensions_c6b44c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c6b44c = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_c6b44c = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_c6b44c
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_c6b44c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_c6b44c
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_c6b44c
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_c6b44c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_c6b44c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.wgsl
index 430e44a..3b65ffa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b44c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32sint, read_write>;
 
-fn textureDimensions_c6b44c() {
+fn textureDimensions_c6b44c() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c6b44c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c6b44c();
+  prevent_dce = textureDimensions_c6b44c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c6b44c();
+  prevent_dce = textureDimensions_c6b44c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c6b44c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl
index d1ba650..b2d0a94 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r8unorm, read_write>) -> u32
-fn textureDimensions_c6b985() {
+fn textureDimensions_c6b985() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c6b985();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c6b985();
+  prevent_dce = textureDimensions_c6b985();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c6b985();
+  prevent_dce = textureDimensions_c6b985();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c6b985();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.dxc.hlsl
index 753cf17..c45d87c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c6b985() {
+uint textureDimensions_c6b985() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c6b985();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c6b985();
+  prevent_dce.Store(0u, asuint(textureDimensions_c6b985()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c6b985();
+  prevent_dce.Store(0u, asuint(textureDimensions_c6b985()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c6b985();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.fxc.hlsl
index 753cf17..c45d87c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c6b985() {
+uint textureDimensions_c6b985() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c6b985();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c6b985();
+  prevent_dce.Store(0u, asuint(textureDimensions_c6b985()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c6b985();
+  prevent_dce.Store(0u, asuint(textureDimensions_c6b985()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c6b985();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.msl
index b0a6fb9..e7f0baf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c6b985(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_c6b985(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c6b985(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c6b985(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_c6b985(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c6b985(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c6b985(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c6b985(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.spvasm
index 3de8c99..ce38051 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,71 +22,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c6b985 "textureDimensions_c6b985"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 R8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c6b985 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_c6b985 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_c6b985
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_c6b985
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_c6b985
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_c6b985
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_c6b985
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_c6b985
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.wgsl
index 5c45f89..c6d84c7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c6b985.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r8unorm, read_write>;
 
-fn textureDimensions_c6b985() {
+fn textureDimensions_c6b985() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c6b985();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c6b985();
+  prevent_dce = textureDimensions_c6b985();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c6b985();
+  prevent_dce = textureDimensions_c6b985();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c6b985();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl
index 7cd767b..26f1b394 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32float, read_write>) -> u32
-fn textureDimensions_c7ea63() {
+fn textureDimensions_c7ea63() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c7ea63();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c7ea63();
+  prevent_dce = textureDimensions_c7ea63();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c7ea63();
+  prevent_dce = textureDimensions_c7ea63();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c7ea63();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.dxc.hlsl
index e6ab0ba..094ac27 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c7ea63() {
+uint textureDimensions_c7ea63() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c7ea63();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c7ea63();
+  prevent_dce.Store(0u, asuint(textureDimensions_c7ea63()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c7ea63();
+  prevent_dce.Store(0u, asuint(textureDimensions_c7ea63()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c7ea63();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.fxc.hlsl
index e6ab0ba..094ac27 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c7ea63() {
+uint textureDimensions_c7ea63() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c7ea63();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c7ea63();
+  prevent_dce.Store(0u, asuint(textureDimensions_c7ea63()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c7ea63();
+  prevent_dce.Store(0u, asuint(textureDimensions_c7ea63()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c7ea63();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.msl
index b21b53e..03e8141 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c7ea63(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_c7ea63(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c7ea63(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c7ea63(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_c7ea63(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c7ea63(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c7ea63(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c7ea63(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.spvasm
index 27def32..d8fd854 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,71 +22,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c7ea63 "textureDimensions_c7ea63"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c7ea63 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_c7ea63 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_c7ea63
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_c7ea63
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_c7ea63
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_c7ea63
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_c7ea63
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_c7ea63
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.wgsl
index 8e1d75a..859c201 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c7ea63.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32float, read_write>;
 
-fn textureDimensions_c7ea63() {
+fn textureDimensions_c7ea63() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c7ea63();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c7ea63();
+  prevent_dce = textureDimensions_c7ea63();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c7ea63();
+  prevent_dce = textureDimensions_c7ea63();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c7ea63();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl
index bfaf33d..c591f34 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32uint, read_write>) -> vec2<u32>
-fn textureDimensions_c82420() {
+fn textureDimensions_c82420() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c82420();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c82420();
+  prevent_dce = textureDimensions_c82420();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c82420();
+  prevent_dce = textureDimensions_c82420();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c82420();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.dxc.hlsl
index 7ee2238..d489640 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c82420() {
+uint2 textureDimensions_c82420() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c82420();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c82420();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c82420()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c82420();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c82420()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c82420();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.fxc.hlsl
index 7ee2238..d489640 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c82420() {
+uint2 textureDimensions_c82420() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c82420();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c82420();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c82420()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c82420();
+  prevent_dce.Store2(0u, asuint(textureDimensions_c82420()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c82420();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.msl
index 4197b49..7980481 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c82420(texture2d<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_c82420(texture2d<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_c82420(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_c82420(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_c82420(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c82420(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c82420(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c82420(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.spvasm
index 7a321b6..fa17a6a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_c82420 "textureDimensions_c82420"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_c82420 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_c82420 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_c82420
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_c82420
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_c82420
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_c82420
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_c82420
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_c82420
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.wgsl
index a380918..04ac8b7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c82420.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32uint, read_write>;
 
-fn textureDimensions_c82420() {
+fn textureDimensions_c82420() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c82420();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c82420();
+  prevent_dce = textureDimensions_c82420();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c82420();
+  prevent_dce = textureDimensions_c82420();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c82420();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl
index 0502820..412dde6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_3d<i32>;
 
 // fn textureDimensions(texture: texture_3d<i32>, level: u32) -> vec3<u32>
-fn textureDimensions_c871f3() {
+fn textureDimensions_c871f3() -> vec3<u32>{
   var arg_1 = 1u;
   var res: vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c871f3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c871f3();
+  prevent_dce = textureDimensions_c871f3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c871f3();
+  prevent_dce = textureDimensions_c871f3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c871f3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.dxc.hlsl
index 772d682..31999c6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c871f3() {
+uint3 textureDimensions_c871f3() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c871f3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c871f3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_c871f3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c871f3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_c871f3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c871f3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.fxc.hlsl
index 772d682..31999c6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_c871f3() {
+uint3 textureDimensions_c871f3() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_c871f3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_c871f3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_c871f3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_c871f3();
+  prevent_dce.Store3(0u, asuint(textureDimensions_c871f3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_c871f3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.glsl
index 87fd624..b419bb2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.glsl
@@ -1,48 +1,26 @@
 #version 310 es
-
-uniform highp isampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_c871f3() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_c871f3();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_c871f3() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_c871f3() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_c871f3();
+  prevent_dce.inner = textureDimensions_c871f3();
 }
 
 void main() {
@@ -52,19 +30,24 @@
 #version 310 es
 
 uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_c871f3() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_c871f3() {
-  uint arg_1 = 1u;
-  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_c871f3();
+  prevent_dce.inner = textureDimensions_c871f3();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -72,3 +55,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp isampler3D arg_0_1;
+uvec3 textureDimensions_c871f3() {
+  uint arg_1 = 1u;
+  uvec3 res = uvec3(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_c871f3();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.msl
index 16c8e01..46b00dd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_c871f3(texture3d<int, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_c871f3(texture3d<int, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint3 res = uint3(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1), tint_symbol_1.get_depth(arg_1));
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_c871f3(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_c871f3(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_c871f3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_c871f3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_c871f3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_c871f3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.spvasm
index 2668008..b482d29 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,105 @@
                OpName %textureDimensions_c871f3 "textureDimensions_c871f3"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+         %27 = OpConstantNull %uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %31 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_c871f3 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %25
-        %res = OpVariable %_ptr_Function_v3uint Function %31
+%textureDimensions_c871f3 = OpFunction %v3uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %27
+        %res = OpVariable %_ptr_Function_v3uint Function %10
                OpStore %arg_1 %uint_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %35 = OpLoad %v3uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v3uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v3uint %textureDimensions_c871f3
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_c871f3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v3uint %textureDimensions_c871f3
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %55 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %56 = OpFunctionCall %v3uint %textureDimensions_c871f3
+               OpStore %55 %56
+         %57 = OpLoad %VertexOutput %out
+               OpReturnValue %57
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %59 = OpLabel
+         %60 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %61 = OpCompositeExtract %v4float %60 0
+               OpStore %pos_1 %61
+         %62 = OpCompositeExtract %v3uint %60 1
+               OpStore %prevent_dce_1 %62
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_c871f3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_c871f3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.wgsl
index b423864..f072b28 100644
--- a/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/c871f3.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_3d<i32>;
 
-fn textureDimensions_c871f3() {
+fn textureDimensions_c871f3() -> vec3<u32> {
   var arg_1 = 1u;
   var res : vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c871f3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_c871f3();
+  prevent_dce = textureDimensions_c871f3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_c871f3();
+  prevent_dce = textureDimensions_c871f3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_c871f3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl
index 536d7b9..f8e58df 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8uint, read_write>) -> vec2<u32>
-fn textureDimensions_ca10cc() {
+fn textureDimensions_ca10cc() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ca10cc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ca10cc();
+  prevent_dce = textureDimensions_ca10cc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ca10cc();
+  prevent_dce = textureDimensions_ca10cc();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ca10cc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.dxc.hlsl
index a834adb..9178c32 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ca10cc() {
+uint2 textureDimensions_ca10cc() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ca10cc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ca10cc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ca10cc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ca10cc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ca10cc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ca10cc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.fxc.hlsl
index a834adb..9178c32 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ca10cc() {
+uint2 textureDimensions_ca10cc() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ca10cc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ca10cc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ca10cc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ca10cc();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ca10cc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ca10cc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.glsl
index 4586b97..2e8d68d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_ca10cc() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_ca10cc();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_ca10cc() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_ca10cc() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_ca10cc();
+  prevent_dce.inner = textureDimensions_ca10cc();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_ca10cc() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_ca10cc() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_ca10cc();
+  prevent_dce.inner = textureDimensions_ca10cc();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage2DArray arg_0;
+uvec2 textureDimensions_ca10cc() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_ca10cc();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.msl
index 2eb79f9..3ae1dff 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ca10cc(texture2d_array<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_ca10cc(texture2d_array<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_ca10cc(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_ca10cc(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_ca10cc(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ca10cc(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ca10cc(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ca10cc(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.spvasm
index 312ee4c..f8655a6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ca10cc "textureDimensions_ca10cc"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ca10cc = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_ca10cc = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_ca10cc
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_ca10cc
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_ca10cc
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_ca10cc
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_ca10cc
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_ca10cc
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.wgsl
index 5004c88..3b93855 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ca10cc.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8uint, read_write>;
 
-fn textureDimensions_ca10cc() {
+fn textureDimensions_ca10cc() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ca10cc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ca10cc();
+  prevent_dce = textureDimensions_ca10cc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ca10cc();
+  prevent_dce = textureDimensions_ca10cc();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ca10cc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl
index 2073133..85ea5e6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32sint, write>) -> vec2<u32>
-fn textureDimensions_cad3b7() {
+fn textureDimensions_cad3b7() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cad3b7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cad3b7();
+  prevent_dce = textureDimensions_cad3b7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cad3b7();
+  prevent_dce = textureDimensions_cad3b7();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cad3b7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.dxc.hlsl
index ec45c05..d2c5a02 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cad3b7() {
+uint2 textureDimensions_cad3b7() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cad3b7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cad3b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cad3b7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cad3b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cad3b7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cad3b7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.fxc.hlsl
index ec45c05..d2c5a02 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cad3b7() {
+uint2 textureDimensions_cad3b7() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cad3b7();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cad3b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cad3b7()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cad3b7();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cad3b7()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cad3b7();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.glsl
index e9cde90..60bad3d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_cad3b7() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_cad3b7();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_cad3b7() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_cad3b7() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_cad3b7();
+  prevent_dce.inner = textureDimensions_cad3b7();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_cad3b7() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_cad3b7() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_cad3b7();
+  prevent_dce.inner = textureDimensions_cad3b7();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32i) uniform highp writeonly iimage2D arg_0;
+uvec2 textureDimensions_cad3b7() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_cad3b7();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.msl
index 2242261..bb4b811 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_cad3b7(texture2d<int, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_cad3b7(texture2d<int, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_cad3b7(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_cad3b7(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_cad3b7(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_cad3b7(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_cad3b7(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_cad3b7(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.spvasm
index a4eb0f0..e5a4b0a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_cad3b7 "textureDimensions_cad3b7"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_cad3b7 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_cad3b7 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_cad3b7
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_cad3b7
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_cad3b7
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_cad3b7
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_cad3b7
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_cad3b7
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.wgsl
index c73c1ca..53388d5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cad3b7.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32sint, write>;
 
-fn textureDimensions_cad3b7() {
+fn textureDimensions_cad3b7() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cad3b7();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cad3b7();
+  prevent_dce = textureDimensions_cad3b7();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cad3b7();
+  prevent_dce = textureDimensions_cad3b7();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cad3b7();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl
index bb98294..24aa0e4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8snorm, write>) -> vec3<u32>
-fn textureDimensions_cc947b() {
+fn textureDimensions_cc947b() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cc947b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cc947b();
+  prevent_dce = textureDimensions_cc947b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cc947b();
+  prevent_dce = textureDimensions_cc947b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cc947b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.dxc.hlsl
index c31b931..445c176 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cc947b() {
+uint3 textureDimensions_cc947b() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cc947b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cc947b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_cc947b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cc947b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_cc947b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cc947b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.fxc.hlsl
index c31b931..445c176 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cc947b() {
+uint3 textureDimensions_cc947b() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cc947b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cc947b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_cc947b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cc947b();
+  prevent_dce.Store3(0u, asuint(textureDimensions_cc947b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cc947b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.glsl
index c30e042..582a37c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_cc947b() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_cc947b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_cc947b() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_cc947b() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_cc947b();
+  prevent_dce.inner = textureDimensions_cc947b();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_cc947b() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_cc947b() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_cc947b();
+  prevent_dce.inner = textureDimensions_cc947b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_cc947b() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_cc947b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.msl
index f811166..99980fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_cc947b(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_cc947b(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_cc947b(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_cc947b(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_cc947b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_cc947b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_cc947b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_cc947b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.spvasm
index 80a4f88..f4eb9e2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_cc947b "textureDimensions_cc947b"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_cc947b = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_cc947b = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_cc947b
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_cc947b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_cc947b
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_cc947b
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_cc947b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_cc947b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.wgsl
index 98d645a..f5aa850 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cc947b.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8snorm, write>;
 
-fn textureDimensions_cc947b() {
+fn textureDimensions_cc947b() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cc947b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cc947b();
+  prevent_dce = textureDimensions_cc947b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cc947b();
+  prevent_dce = textureDimensions_cc947b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cc947b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl
index 9cf6032..34872d8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32sint, read>) -> vec2<u32>
-fn textureDimensions_cd3033() {
+fn textureDimensions_cd3033() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cd3033();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cd3033();
+  prevent_dce = textureDimensions_cd3033();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cd3033();
+  prevent_dce = textureDimensions_cd3033();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cd3033();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.dxc.hlsl
index f236a40..5769061 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cd3033() {
+uint2 textureDimensions_cd3033() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cd3033();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cd3033();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cd3033()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cd3033();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cd3033()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cd3033();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.fxc.hlsl
index f236a40..5769061 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cd3033() {
+uint2 textureDimensions_cd3033() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cd3033();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cd3033();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cd3033()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cd3033();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cd3033()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cd3033();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.msl
index cde806f..2174038 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_cd3033(texture2d_array<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_cd3033(texture2d_array<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_cd3033(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_cd3033(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_cd3033(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_cd3033(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_cd3033(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_cd3033(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.spvasm
index d9c55ad..99336ef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,76 +21,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_cd3033 "textureDimensions_cd3033"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_cd3033 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_cd3033 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_cd3033
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_cd3033
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_cd3033
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_cd3033
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_cd3033
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_cd3033
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.wgsl
index 2d26cbe..5e73e07 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cd3033.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32sint, read>;
 
-fn textureDimensions_cd3033() {
+fn textureDimensions_cd3033() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cd3033();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cd3033();
+  prevent_dce = textureDimensions_cd3033();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cd3033();
+  prevent_dce = textureDimensions_cd3033();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cd3033();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl
index 995400e..3491e02 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_external;
 
 // fn textureDimensions(texture: texture_external) -> vec2<u32>
-fn textureDimensions_cdc6c9() {
+fn textureDimensions_cdc6c9() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cdc6c9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce = textureDimensions_cdc6c9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce = textureDimensions_cdc6c9();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cdc6c9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.dxc.hlsl
index b45ca2b..b610d05 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.dxc.hlsl
@@ -4,36 +4,44 @@
 };
 Texture2D<float4> arg_0 : register(t0, space1);
 
-RWByteAddressBuffer prevent_dce : register(u0, space2);
-
-void textureDimensions_cdc6c9() {
+uint2 textureDimensions_cdc6c9() {
   uint2 res = (ext_tex_params[16].xy + (1u).xx);
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cdc6c9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cdc6c9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cdc6c9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cdc6c9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.fxc.hlsl
index b45ca2b..b610d05 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.fxc.hlsl
@@ -4,36 +4,44 @@
 };
 Texture2D<float4> arg_0 : register(t0, space1);
 
-RWByteAddressBuffer prevent_dce : register(u0, space2);
-
-void textureDimensions_cdc6c9() {
+uint2 textureDimensions_cdc6c9() {
   uint2 res = (ext_tex_params[16].xy + (1u).xx);
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cdc6c9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cdc6c9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cdc6c9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cdc6c9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.glsl
index 95c24ec..0bb96d5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.glsl
@@ -1,85 +1,4 @@
 #version 310 es
-
-struct GammaTransferParams {
-  float G;
-  float A;
-  float B;
-  float C;
-  float D;
-  float E;
-  float F;
-  uint padding;
-};
-
-struct ExternalTextureParams {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  uint pad;
-  uint pad_1;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-  mat3x2 sampleTransform;
-  mat3x2 loadTransform;
-  vec2 samplePlane0RectMin;
-  vec2 samplePlane0RectMax;
-  vec2 samplePlane1RectMin;
-  vec2 samplePlane1RectMax;
-  uvec2 visibleSize;
-  vec2 plane1CoordFactor;
-};
-
-struct ExternalTextureParams_std140 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  uint pad;
-  uint pad_1;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-  vec2 sampleTransform_0;
-  vec2 sampleTransform_1;
-  vec2 sampleTransform_2;
-  vec2 loadTransform_0;
-  vec2 loadTransform_1;
-  vec2 loadTransform_2;
-  vec2 samplePlane0RectMin;
-  vec2 samplePlane0RectMax;
-  vec2 samplePlane1RectMin;
-  vec2 samplePlane1RectMax;
-  uvec2 visibleSize;
-  vec2 plane1CoordFactor;
-};
-
-layout(binding = 2, std140) uniform ext_tex_params_block_std140_ubo {
-  ExternalTextureParams_std140 inner;
-} ext_tex_params;
-
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_cdc6c9() {
-  uvec2 res = (ext_tex_params.inner.visibleSize + uvec2(1u));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_cdc6c9();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
@@ -140,17 +59,22 @@
   ExternalTextureParams_std140 inner;
 } ext_tex_params;
 
+uvec2 textureDimensions_cdc6c9() {
+  uvec2 res = (ext_tex_params.inner.visibleSize + uvec2(1u));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_cdc6c9() {
-  uvec2 res = (ext_tex_params.inner.visibleSize + uvec2(1u));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce.inner = textureDimensions_cdc6c9();
 }
 
 void main() {
@@ -216,17 +140,22 @@
   ExternalTextureParams_std140 inner;
 } ext_tex_params;
 
+uvec2 textureDimensions_cdc6c9() {
+  uvec2 res = (ext_tex_params.inner.visibleSize + uvec2(1u));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_cdc6c9() {
-  uvec2 res = (ext_tex_params.inner.visibleSize + uvec2(1u));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce.inner = textureDimensions_cdc6c9();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -234,3 +163,89 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+struct GammaTransferParams {
+  float G;
+  float A;
+  float B;
+  float C;
+  float D;
+  float E;
+  float F;
+  uint padding;
+};
+
+struct ExternalTextureParams {
+  uint numPlanes;
+  uint doYuvToRgbConversionOnly;
+  uint pad;
+  uint pad_1;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+  mat3x2 sampleTransform;
+  mat3x2 loadTransform;
+  vec2 samplePlane0RectMin;
+  vec2 samplePlane0RectMax;
+  vec2 samplePlane1RectMin;
+  vec2 samplePlane1RectMax;
+  uvec2 visibleSize;
+  vec2 plane1CoordFactor;
+};
+
+struct ExternalTextureParams_std140 {
+  uint numPlanes;
+  uint doYuvToRgbConversionOnly;
+  uint pad;
+  uint pad_1;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+  vec2 sampleTransform_0;
+  vec2 sampleTransform_1;
+  vec2 sampleTransform_2;
+  vec2 loadTransform_0;
+  vec2 loadTransform_1;
+  vec2 loadTransform_2;
+  vec2 samplePlane0RectMin;
+  vec2 samplePlane0RectMax;
+  vec2 samplePlane1RectMin;
+  vec2 samplePlane1RectMax;
+  uvec2 visibleSize;
+  vec2 plane1CoordFactor;
+};
+
+layout(binding = 2, std140) uniform ext_tex_params_block_std140_ubo {
+  ExternalTextureParams_std140 inner;
+} ext_tex_params;
+
+uvec2 textureDimensions_cdc6c9() {
+  uvec2 res = (ext_tex_params.inner.visibleSize + uvec2(1u));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_cdc6c9();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.msl
index 85ac3a3..2c9ae7d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.msl
@@ -65,34 +65,43 @@
   float2 plane1CoordFactor;
 };
 
-void textureDimensions_cdc6c9(const constant ExternalTextureParams_tint_packed_vec3* const tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_cdc6c9(const constant ExternalTextureParams_tint_packed_vec3* const tint_symbol_1) {
   uint2 res = ((*(tint_symbol_1)).visibleSize + uint2(1u));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_3 [[buffer(2)]]) {
+  *(tint_symbol_2) = textureDimensions_cdc6c9(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_5 [[buffer(2)]]) {
+  *(tint_symbol_4) = textureDimensions_cdc6c9(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(const constant ExternalTextureParams_tint_packed_vec3* const tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_cdc6c9(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(const constant ExternalTextureParams_tint_packed_vec3* const tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_cdc6c9(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_5 [[buffer(2)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_7 [[buffer(2)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_7 [[buffer(2)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_cdc6c9(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_9 [[buffer(2)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_cdc6c9(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.spvasm
index 3dc25d5..8d711e5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.spvasm
@@ -1,16 +1,17 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 59
+; Bound: 73
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %ext_tex_plane_1 "ext_tex_plane_1"
                OpName %ext_tex_params_block_std140 "ext_tex_params_block_std140"
@@ -50,11 +51,17 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_cdc6c9 "textureDimensions_cdc6c9"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %ext_tex_plane_1 DescriptorSet 1
                OpDecorate %ext_tex_plane_1 Binding 1
@@ -97,77 +104,97 @@
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-%ext_tex_plane_1 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+%ext_tex_plane_1 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %mat3v4float = OpTypeMatrix %v4float 3
 %GammaTransferParams = OpTypeStruct %float %float %float %float %float %float %float %uint
     %v3float = OpTypeVector %float 3
 %mat3v3float = OpTypeMatrix %v3float 3
     %v2float = OpTypeVector %float 2
-     %v2uint = OpTypeVector %uint 2
 %ExternalTextureParams_std140 = OpTypeStruct %uint %uint %mat3v4float %GammaTransferParams %GammaTransferParams %mat3v3float %v2float %v2float %v2float %v2float %v2float %v2float %v2float %v2float %v2float %v2float %v2uint %v2float
 %ext_tex_params_block_std140 = OpTypeStruct %ExternalTextureParams_std140
 %_ptr_Uniform_ext_tex_params_block_std140 = OpTypePointer Uniform %ext_tex_params_block_std140
 %ext_tex_params = OpVariable %_ptr_Uniform_ext_tex_params_block_std140 Uniform
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %27 = OpTypeFunction %void
+         %30 = OpTypeFunction %v2uint
      %uint_0 = OpConstant %uint 0
     %uint_16 = OpConstant %uint 16
 %_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
      %uint_1 = OpConstant %uint 1
-         %37 = OpConstantComposite %v2uint %uint_1 %uint_1
+         %39 = OpConstantComposite %v2uint %uint_1 %uint_1
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %41 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %44 = OpTypeFunction %void
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %45 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %55 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %61 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_cdc6c9 = OpFunction %void None %27
-         %30 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %41
-         %34 = OpAccessChain %_ptr_Uniform_v2uint %ext_tex_params %uint_0 %uint_16
-         %35 = OpLoad %v2uint %34
-         %38 = OpIAdd %v2uint %35 %37
-               OpStore %res %38
-         %43 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %44 = OpLoad %v2uint %res
-               OpStore %43 %44
-               OpReturn
+%textureDimensions_cdc6c9 = OpFunction %v2uint None %30
+         %32 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %36 = OpAccessChain %_ptr_Uniform_v2uint %ext_tex_params %uint_0 %uint_16
+         %37 = OpLoad %v2uint %36
+         %40 = OpIAdd %v2uint %37 %39
+               OpStore %res %40
+         %43 = OpLoad %v2uint %res
+               OpReturnValue %43
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %45
+%fragment_main = OpFunction %void None %44
          %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_cdc6c9
-               OpReturnValue %5
+         %49 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %50 = OpFunctionCall %v2uint %textureDimensions_cdc6c9
+               OpStore %49 %50
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %27
-         %50 = OpLabel
-         %51 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %51
+%compute_main = OpFunction %void None %44
+         %52 = OpLabel
+         %53 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %54 = OpFunctionCall %v2uint %textureDimensions_cdc6c9
+               OpStore %53 %54
+               OpReturn
+               OpFunctionEnd
+%vertex_main_inner = OpFunction %VertexOutput None %55
+         %58 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %61
+         %63 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %63 %5
+         %64 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %65 = OpFunctionCall %v2uint %textureDimensions_cdc6c9
+               OpStore %64 %65
+         %66 = OpLoad %VertexOutput %out
+               OpReturnValue %66
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %44
+         %68 = OpLabel
+         %69 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %70 = OpCompositeExtract %v4float %69 0
+               OpStore %pos_1 %70
+         %71 = OpCompositeExtract %v2uint %69 1
+               OpStore %prevent_dce_1 %71
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %27
-         %54 = OpLabel
-         %55 = OpFunctionCall %void %textureDimensions_cdc6c9
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %27
-         %57 = OpLabel
-         %58 = OpFunctionCall %void %textureDimensions_cdc6c9
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.wgsl
index fddb5e2..096744d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cdc6c9.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_external;
 
-fn textureDimensions_cdc6c9() {
+fn textureDimensions_cdc6c9() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cdc6c9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce = textureDimensions_cdc6c9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cdc6c9();
+  prevent_dce = textureDimensions_cdc6c9();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cdc6c9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl
index b81579e..eba76d4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32sint, read>) -> u32
-fn textureDimensions_cedabd() {
+fn textureDimensions_cedabd() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cedabd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cedabd();
+  prevent_dce = textureDimensions_cedabd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cedabd();
+  prevent_dce = textureDimensions_cedabd();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cedabd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.dxc.hlsl
index 076c805..78ead58 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cedabd() {
+uint textureDimensions_cedabd() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cedabd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cedabd();
+  prevent_dce.Store(0u, asuint(textureDimensions_cedabd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cedabd();
+  prevent_dce.Store(0u, asuint(textureDimensions_cedabd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cedabd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.fxc.hlsl
index 076c805..78ead58 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cedabd() {
+uint textureDimensions_cedabd() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cedabd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cedabd();
+  prevent_dce.Store(0u, asuint(textureDimensions_cedabd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cedabd();
+  prevent_dce.Store(0u, asuint(textureDimensions_cedabd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cedabd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.msl
index ee5c6f6..c15a2ce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_cedabd(texture1d<int, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_cedabd(texture1d<int, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_cedabd(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_cedabd(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_cedabd(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_cedabd(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_cedabd(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_cedabd(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.spvasm
index 5d9f510..a77c277 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,73 +22,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_cedabd "textureDimensions_cedabd"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_cedabd = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_cedabd = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_cedabd
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_cedabd
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_cedabd
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_cedabd
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_cedabd
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_cedabd
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.wgsl
index 4a24f85..413f80b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cedabd.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32sint, read>;
 
-fn textureDimensions_cedabd() {
+fn textureDimensions_cedabd() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cedabd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cedabd();
+  prevent_dce = textureDimensions_cedabd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cedabd();
+  prevent_dce = textureDimensions_cedabd();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cedabd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl
index afc1694..bbc1724 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_cube_array<f32>;
 
 // fn textureDimensions(texture: texture_cube_array<f32>, level: u32) -> vec2<u32>
-fn textureDimensions_cf2b50() {
+fn textureDimensions_cf2b50() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cf2b50();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cf2b50();
+  prevent_dce = textureDimensions_cf2b50();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cf2b50();
+  prevent_dce = textureDimensions_cf2b50();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cf2b50();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.dxc.hlsl
index 902eae0..ee3e138 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cf2b50() {
+uint2 textureDimensions_cf2b50() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cf2b50();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cf2b50();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cf2b50()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cf2b50();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cf2b50()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cf2b50();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.fxc.hlsl
index 902eae0..ee3e138 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCubeArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_cf2b50() {
+uint2 textureDimensions_cf2b50() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_cf2b50();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_cf2b50();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cf2b50()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_cf2b50();
+  prevent_dce.Store2(0u, asuint(textureDimensions_cf2b50()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_cf2b50();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.msl
index aa72617..e9903cb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_cf2b50(texturecube_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_cf2b50(texturecube_array<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_cf2b50(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_cf2b50(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_cf2b50(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_cf2b50(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_cf2b50(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_cf2b50(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.spvasm
index a8b9101..32586f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 51
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability SampledCubeArray
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,80 +22,106 @@
                OpName %textureDimensions_cf2b50 "textureDimensions_cf2b50"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %32 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %37 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %47 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %53 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_cf2b50 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %32
+%textureDimensions_cf2b50 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %28 = OpLoad %11 %arg_0
-         %29 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %28 %29
-         %25 = OpVectorShuffle %v2uint %26 %26 0 1
-               OpStore %res %25
-         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %36 = OpLoad %v2uint %res
-               OpStore %35 %36
+         %30 = OpLoad %16 %arg_0
+         %31 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %30 %31
+         %27 = OpVectorShuffle %v2uint %28 %28 0 1
+               OpStore %res %27
+         %34 = OpLoad %v2uint %res
+               OpReturnValue %34
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %35
+         %38 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_cf2b50
+               OpStore %41 %42
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %37
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_cf2b50
-               OpReturnValue %5
+%compute_main = OpFunction %void None %35
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %46 = OpFunctionCall %v2uint %textureDimensions_cf2b50
+               OpStore %45 %46
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %43
+%vertex_main_inner = OpFunction %VertexOutput None %47
+         %50 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %53
+         %55 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %55 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_cf2b50
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %35
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_cf2b50
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %49 = OpLabel
-         %50 = OpFunctionCall %void %textureDimensions_cf2b50
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.wgsl
index 681d13a..d32433b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/cf2b50.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
-fn textureDimensions_cf2b50() {
+fn textureDimensions_cf2b50() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cf2b50();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_cf2b50();
+  prevent_dce = textureDimensions_cf2b50();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_cf2b50();
+  prevent_dce = textureDimensions_cf2b50();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_cf2b50();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl
index cff0f12..dd5c386 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32uint, read>) -> vec3<u32>
-fn textureDimensions_d0778e() {
+fn textureDimensions_d0778e() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d0778e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d0778e();
+  prevent_dce = textureDimensions_d0778e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d0778e();
+  prevent_dce = textureDimensions_d0778e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d0778e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.dxc.hlsl
index b9a0be5..ca5d8ac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d0778e() {
+uint3 textureDimensions_d0778e() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d0778e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d0778e();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d0778e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d0778e();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d0778e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d0778e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.fxc.hlsl
index b9a0be5..ca5d8ac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d0778e() {
+uint3 textureDimensions_d0778e() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d0778e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d0778e();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d0778e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d0778e();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d0778e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d0778e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.msl
index ba21125..d0c353b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d0778e(texture3d<uint, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_d0778e(texture3d<uint, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_d0778e(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_d0778e(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_d0778e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d0778e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d0778e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d0778e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.spvasm
index c32348d..f680ca8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d0778e "textureDimensions_d0778e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d0778e = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_d0778e = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_d0778e
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_d0778e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_d0778e
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_d0778e
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_d0778e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_d0778e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.wgsl
index 2abf5a7..a10ba76 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d0778e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32uint, read>;
 
-fn textureDimensions_d0778e() {
+fn textureDimensions_d0778e() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d0778e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d0778e();
+  prevent_dce = textureDimensions_d0778e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d0778e();
+  prevent_dce = textureDimensions_d0778e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d0778e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl
index 822d2ed..b9dbe265 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16sint, write>) -> u32
-fn textureDimensions_d08a94() {
+fn textureDimensions_d08a94() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d08a94();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d08a94();
+  prevent_dce = textureDimensions_d08a94();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d08a94();
+  prevent_dce = textureDimensions_d08a94();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d08a94();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.dxc.hlsl
index f5931df..31182b0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d08a94() {
+uint textureDimensions_d08a94() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d08a94();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d08a94();
+  prevent_dce.Store(0u, asuint(textureDimensions_d08a94()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d08a94();
+  prevent_dce.Store(0u, asuint(textureDimensions_d08a94()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d08a94();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.fxc.hlsl
index f5931df..31182b0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d08a94() {
+uint textureDimensions_d08a94() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d08a94();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d08a94();
+  prevent_dce.Store(0u, asuint(textureDimensions_d08a94()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d08a94();
+  prevent_dce.Store(0u, asuint(textureDimensions_d08a94()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d08a94();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.glsl
index 3bda1a4..9cd4764 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_d08a94() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d08a94();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_d08a94() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_d08a94() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d08a94();
+  prevent_dce.inner = textureDimensions_d08a94();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_d08a94() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_d08a94() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d08a94();
+  prevent_dce.inner = textureDimensions_d08a94();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba16i) uniform highp writeonly iimage2D arg_0;
+uint textureDimensions_d08a94() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d08a94();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.msl
index 82f0a35..8258f0b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d08a94(texture1d<int, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_d08a94(texture1d<int, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d08a94(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d08a94(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_d08a94(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d08a94(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d08a94(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d08a94(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.spvasm
index 6093d3d..ac45bef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,73 +21,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d08a94 "textureDimensions_d08a94"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rgba16i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rgba16i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d08a94 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_d08a94 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_d08a94
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_d08a94
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_d08a94
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_d08a94
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_d08a94
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_d08a94
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.wgsl
index 0cac636..888c538 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d08a94.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16sint, write>;
 
-fn textureDimensions_d08a94() {
+fn textureDimensions_d08a94() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d08a94();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d08a94();
+  prevent_dce = textureDimensions_d08a94();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d08a94();
+  prevent_dce = textureDimensions_d08a94();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d08a94();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl
index 1279967..1fe56eb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<bgra8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<bgra8unorm, write>) -> vec2<u32>
-fn textureDimensions_d1b882() {
+fn textureDimensions_d1b882() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d1b882();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d1b882();
+  prevent_dce = textureDimensions_d1b882();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d1b882();
+  prevent_dce = textureDimensions_d1b882();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d1b882();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.dxc.hlsl
index ff86087..de29f86 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d1b882() {
+uint2 textureDimensions_d1b882() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d1b882();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d1b882();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d1b882()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d1b882();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d1b882()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d1b882();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.fxc.hlsl
index ff86087..de29f86 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d1b882() {
+uint2 textureDimensions_d1b882() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d1b882();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d1b882();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d1b882()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d1b882();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d1b882()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d1b882();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.glsl
index 64d0136..78480cb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_d1b882() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d1b882();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_d1b882() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d1b882() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d1b882();
+  prevent_dce.inner = textureDimensions_d1b882();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_d1b882() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d1b882() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d1b882();
+  prevent_dce.inner = textureDimensions_d1b882();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_d1b882() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d1b882();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.msl
index b1c60ce..07710f9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d1b882(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_d1b882(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d1b882(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d1b882(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_d1b882(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d1b882(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d1b882(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d1b882(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.spvasm
index 2bd4feb..23e91c7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d1b882 "textureDimensions_d1b882"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d1b882 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_d1b882 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_d1b882
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_d1b882
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_d1b882
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_d1b882
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_d1b882
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_d1b882
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.wgsl
index 12ace7e..232b617 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d1b882.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<bgra8unorm, write>;
 
-fn textureDimensions_d1b882() {
+fn textureDimensions_d1b882() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d1b882();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d1b882();
+  prevent_dce = textureDimensions_d1b882();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d1b882();
+  prevent_dce = textureDimensions_d1b882();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d1b882();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl
index 48a45ba..aa6062e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_cube;
 
 // fn textureDimensions(texture: texture_depth_cube, level: u32) -> vec2<u32>
-fn textureDimensions_d3accd() {
+fn textureDimensions_d3accd() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d3accd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d3accd();
+  prevent_dce = textureDimensions_d3accd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d3accd();
+  prevent_dce = textureDimensions_d3accd();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d3accd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.dxc.hlsl
index 3fe9782..14362e8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d3accd() {
+uint2 textureDimensions_d3accd() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d3accd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d3accd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d3accd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d3accd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d3accd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d3accd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.fxc.hlsl
index 3fe9782..14362e8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 TextureCube arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d3accd() {
+uint2 textureDimensions_d3accd() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d3accd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d3accd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d3accd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d3accd();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d3accd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d3accd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.glsl
index 09c662c..ea5ebd0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp samplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_d3accd() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d3accd();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_d3accd() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d3accd() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d3accd();
+  prevent_dce.inner = textureDimensions_d3accd();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_d3accd() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d3accd() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d3accd();
+  prevent_dce.inner = textureDimensions_d3accd();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp samplerCube arg_0_1;
+uvec2 textureDimensions_d3accd() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d3accd();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.msl
index 072f4ca..7661dfe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d3accd(depthcube<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_d3accd(depthcube<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depthcube<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d3accd(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depthcube<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d3accd(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depthcube<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_d3accd(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depthcube<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d3accd(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depthcube<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depthcube<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depthcube<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d3accd(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depthcube<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d3accd(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.spvasm
index 0c89a99..ea61f75 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_d3accd "textureDimensions_d3accd"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %30 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_d3accd = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %30
+%textureDimensions_d3accd = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v2uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %34 = OpLoad %v2uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v2uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v2uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_d3accd
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_d3accd
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v2uint %textureDimensions_d3accd
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_d3accd
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_d3accd
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_d3accd
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.wgsl
index 0c02ac3..2be50fa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d3accd.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-fn textureDimensions_d3accd() {
+fn textureDimensions_d3accd() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d3accd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d3accd();
+  prevent_dce = textureDimensions_d3accd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d3accd();
+  prevent_dce = textureDimensions_d3accd();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d3accd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl
index ad4ac26..52333f6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<bgra8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<bgra8unorm, read>) -> vec2<u32>
-fn textureDimensions_d44ac3() {
+fn textureDimensions_d44ac3() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d44ac3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d44ac3();
+  prevent_dce = textureDimensions_d44ac3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d44ac3();
+  prevent_dce = textureDimensions_d44ac3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d44ac3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.dxc.hlsl
index 08130cb..64a92d2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d44ac3() {
+uint2 textureDimensions_d44ac3() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d44ac3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d44ac3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44ac3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d44ac3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44ac3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d44ac3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.fxc.hlsl
index 08130cb..64a92d2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d44ac3() {
+uint2 textureDimensions_d44ac3() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d44ac3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d44ac3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44ac3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d44ac3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44ac3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d44ac3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.glsl
index 325e43d..76e1323 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp readonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_d44ac3() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d44ac3();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_d44ac3() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d44ac3() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d44ac3();
+  prevent_dce.inner = textureDimensions_d44ac3();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_d44ac3() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d44ac3() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d44ac3();
+  prevent_dce.inner = textureDimensions_d44ac3();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp readonly image2D arg_0;
+uvec2 textureDimensions_d44ac3() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d44ac3();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.msl
index e11f740..2c854ac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d44ac3(texture2d<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_d44ac3(texture2d<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d44ac3(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d44ac3(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_d44ac3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d44ac3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d44ac3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d44ac3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.spvasm
index 66b60c7..ce6e0d8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d44ac3 "textureDimensions_d44ac3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d44ac3 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_d44ac3 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_d44ac3
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_d44ac3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_d44ac3
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_d44ac3
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_d44ac3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_d44ac3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.wgsl
index f969d73..65cd17b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44ac3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<bgra8unorm, read>;
 
-fn textureDimensions_d44ac3() {
+fn textureDimensions_d44ac3() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d44ac3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d44ac3();
+  prevent_dce = textureDimensions_d44ac3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d44ac3();
+  prevent_dce = textureDimensions_d44ac3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d44ac3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl
index db203a9..662404f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16uint, read>) -> vec2<u32>
-fn textureDimensions_d44dd1() {
+fn textureDimensions_d44dd1() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d44dd1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d44dd1();
+  prevent_dce = textureDimensions_d44dd1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d44dd1();
+  prevent_dce = textureDimensions_d44dd1();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d44dd1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.dxc.hlsl
index 33a6956..b3f51e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d44dd1() {
+uint2 textureDimensions_d44dd1() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d44dd1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d44dd1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44dd1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d44dd1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44dd1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d44dd1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.fxc.hlsl
index 33a6956..b3f51e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d44dd1() {
+uint2 textureDimensions_d44dd1() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d44dd1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d44dd1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44dd1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d44dd1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d44dd1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d44dd1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.glsl
index f1f086b..ccbb3ae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_d44dd1() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d44dd1();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_d44dd1() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d44dd1() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d44dd1();
+  prevent_dce.inner = textureDimensions_d44dd1();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_d44dd1() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d44dd1() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d44dd1();
+  prevent_dce.inner = textureDimensions_d44dd1();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16ui) uniform highp readonly uimage2D arg_0;
+uvec2 textureDimensions_d44dd1() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d44dd1();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.msl
index a323bd4..1ad301c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d44dd1(texture2d<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_d44dd1(texture2d<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d44dd1(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d44dd1(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_d44dd1(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d44dd1(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d44dd1(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d44dd1(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.spvasm
index a027eff..8a0486a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d44dd1 "textureDimensions_d44dd1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d44dd1 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_d44dd1 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_d44dd1
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_d44dd1
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_d44dd1
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_d44dd1
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_d44dd1
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_d44dd1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.wgsl
index fabe0a8..86898b6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d44dd1.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16uint, read>;
 
-fn textureDimensions_d44dd1() {
+fn textureDimensions_d44dd1() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d44dd1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d44dd1();
+  prevent_dce = textureDimensions_d44dd1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d44dd1();
+  prevent_dce = textureDimensions_d44dd1();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d44dd1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl
index 0d7b053..b44940f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32float, write>) -> vec2<u32>
-fn textureDimensions_d63c28() {
+fn textureDimensions_d63c28() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d63c28();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d63c28();
+  prevent_dce = textureDimensions_d63c28();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d63c28();
+  prevent_dce = textureDimensions_d63c28();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d63c28();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.dxc.hlsl
index ad62aaa..412ee2d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d63c28() {
+uint2 textureDimensions_d63c28() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d63c28();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d63c28();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d63c28()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d63c28();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d63c28()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d63c28();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.fxc.hlsl
index ad62aaa..412ee2d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d63c28() {
+uint2 textureDimensions_d63c28() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d63c28();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d63c28();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d63c28()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d63c28();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d63c28()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d63c28();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.glsl
index 654471d..dc81af5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_d63c28() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d63c28();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_d63c28() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d63c28() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d63c28();
+  prevent_dce.inner = textureDimensions_d63c28();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_d63c28() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d63c28() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d63c28();
+  prevent_dce.inner = textureDimensions_d63c28();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_d63c28() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d63c28();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.msl
index c224f98..41eec67 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d63c28(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_d63c28(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d63c28(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d63c28(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_d63c28(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d63c28(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d63c28(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d63c28(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.spvasm
index b8bafbb..4e0b61b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d63c28 "textureDimensions_d63c28"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d63c28 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_d63c28 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_d63c28
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_d63c28
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_d63c28
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_d63c28
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_d63c28
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_d63c28
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.wgsl
index 591ab9c..7808717 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d63c28.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32float, write>;
 
-fn textureDimensions_d63c28() {
+fn textureDimensions_d63c28() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d63c28();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d63c28();
+  prevent_dce = textureDimensions_d63c28();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d63c28();
+  prevent_dce = textureDimensions_d63c28();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d63c28();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl
index b62ad75..a7a8b3a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32sint, read>) -> vec2<u32>
-fn textureDimensions_d6f3cf() {
+fn textureDimensions_d6f3cf() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d6f3cf();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce = textureDimensions_d6f3cf();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce = textureDimensions_d6f3cf();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d6f3cf();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.dxc.hlsl
index 340f642..a033a2fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d6f3cf() {
+uint2 textureDimensions_d6f3cf() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d6f3cf();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d6f3cf()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d6f3cf()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d6f3cf();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.fxc.hlsl
index 340f642..a033a2fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d6f3cf() {
+uint2 textureDimensions_d6f3cf() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d6f3cf();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d6f3cf()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d6f3cf()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d6f3cf();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.glsl
index bf4599a..75f9761 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_d6f3cf() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d6f3cf();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_d6f3cf() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d6f3cf() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce.inner = textureDimensions_d6f3cf();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_d6f3cf() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d6f3cf() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce.inner = textureDimensions_d6f3cf();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_d6f3cf() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d6f3cf();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.msl
index de74a3d..84d835b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d6f3cf(texture2d<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_d6f3cf(texture2d<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d6f3cf(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d6f3cf(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_d6f3cf(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d6f3cf(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d6f3cf(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d6f3cf(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.spvasm
index deb9d9c..2fad971 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d6f3cf "textureDimensions_d6f3cf"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d6f3cf = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_d6f3cf = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_d6f3cf
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_d6f3cf
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_d6f3cf
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_d6f3cf
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_d6f3cf
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_d6f3cf
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.wgsl
index 6341b52..d9cd7e2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d6f3cf.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32sint, read>;
 
-fn textureDimensions_d6f3cf() {
+fn textureDimensions_d6f3cf() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d6f3cf();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce = textureDimensions_d6f3cf();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d6f3cf();
+  prevent_dce = textureDimensions_d6f3cf();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d6f3cf();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl
index 1c3fc0b..f27fc8d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32uint, write>) -> vec2<u32>
-fn textureDimensions_d8ba68() {
+fn textureDimensions_d8ba68() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d8ba68();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d8ba68();
+  prevent_dce = textureDimensions_d8ba68();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d8ba68();
+  prevent_dce = textureDimensions_d8ba68();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d8ba68();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.dxc.hlsl
index 34b635c..0e19753 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d8ba68() {
+uint2 textureDimensions_d8ba68() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d8ba68();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d8ba68();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d8ba68()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d8ba68();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d8ba68()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d8ba68();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.fxc.hlsl
index 34b635c..0e19753 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d8ba68() {
+uint2 textureDimensions_d8ba68() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d8ba68();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d8ba68();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d8ba68()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d8ba68();
+  prevent_dce.Store2(0u, asuint(textureDimensions_d8ba68()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d8ba68();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.glsl
index c515074..f6634dc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_d8ba68() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d8ba68();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_d8ba68() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d8ba68() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d8ba68();
+  prevent_dce.inner = textureDimensions_d8ba68();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_d8ba68() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_d8ba68() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d8ba68();
+  prevent_dce.inner = textureDimensions_d8ba68();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_d8ba68() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d8ba68();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.msl
index f2039a8..e408deb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d8ba68(texture2d<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_d8ba68(texture2d<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_d8ba68(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_d8ba68(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_d8ba68(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d8ba68(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d8ba68(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d8ba68(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.spvasm
index afb1900..5d67022 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d8ba68 "textureDimensions_d8ba68"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d8ba68 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_d8ba68 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_d8ba68
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_d8ba68
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_d8ba68
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_d8ba68
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_d8ba68
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_d8ba68
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.wgsl
index dbd0a97..ecf650c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8ba68.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32uint, write>;
 
-fn textureDimensions_d8ba68() {
+fn textureDimensions_d8ba68() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d8ba68();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d8ba68();
+  prevent_dce = textureDimensions_d8ba68();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d8ba68();
+  prevent_dce = textureDimensions_d8ba68();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d8ba68();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl
index 7119145..3b383f2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8uint, write>) -> vec3<u32>
-fn textureDimensions_d8f887() {
+fn textureDimensions_d8f887() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d8f887();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d8f887();
+  prevent_dce = textureDimensions_d8f887();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d8f887();
+  prevent_dce = textureDimensions_d8f887();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d8f887();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.dxc.hlsl
index ce1c1d6..1c167d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d8f887() {
+uint3 textureDimensions_d8f887() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d8f887();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d8f887();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d8f887()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d8f887();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d8f887()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d8f887();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.fxc.hlsl
index ce1c1d6..1c167d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_d8f887() {
+uint3 textureDimensions_d8f887() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_d8f887();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_d8f887();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d8f887()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_d8f887();
+  prevent_dce.Store3(0u, asuint(textureDimensions_d8f887()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_d8f887();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.glsl
index 573658f..6cb4f4d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_d8f887() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d8f887();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_d8f887() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_d8f887() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_d8f887();
+  prevent_dce.inner = textureDimensions_d8f887();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_d8f887() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_d8f887() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_d8f887();
+  prevent_dce.inner = textureDimensions_d8f887();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage3D arg_0;
+uvec3 textureDimensions_d8f887() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_d8f887();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.msl
index 59e81b7..a45521c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_d8f887(texture3d<uint, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_d8f887(texture3d<uint, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_d8f887(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_d8f887(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_d8f887(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_d8f887(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_d8f887(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_d8f887(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.spvasm
index 2ad5ae1..92beeb2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_d8f887 "textureDimensions_d8f887"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_d8f887 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_d8f887 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_d8f887
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_d8f887
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_d8f887
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_d8f887
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_d8f887
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_d8f887
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.wgsl
index e4b5681..489e016 100644
--- a/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/d8f887.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8uint, write>;
 
-fn textureDimensions_d8f887() {
+fn textureDimensions_d8f887() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d8f887();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_d8f887();
+  prevent_dce = textureDimensions_d8f887();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_d8f887();
+  prevent_dce = textureDimensions_d8f887();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_d8f887();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl
index 475ebf5..84a0a55 100644
--- a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32float, write>) -> u32
-fn textureDimensions_da30d2() {
+fn textureDimensions_da30d2() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_da30d2();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_da30d2();
+  prevent_dce = textureDimensions_da30d2();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_da30d2();
+  prevent_dce = textureDimensions_da30d2();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_da30d2();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.dxc.hlsl
index a572135..f27e22a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_da30d2() {
+uint textureDimensions_da30d2() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_da30d2();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_da30d2();
+  prevent_dce.Store(0u, asuint(textureDimensions_da30d2()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_da30d2();
+  prevent_dce.Store(0u, asuint(textureDimensions_da30d2()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_da30d2();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.fxc.hlsl
index a572135..f27e22a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_da30d2() {
+uint textureDimensions_da30d2() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_da30d2();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_da30d2();
+  prevent_dce.Store(0u, asuint(textureDimensions_da30d2()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_da30d2();
+  prevent_dce.Store(0u, asuint(textureDimensions_da30d2()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_da30d2();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.glsl
index 86bc7d5..8f00c5f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_da30d2() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_da30d2();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_da30d2() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_da30d2() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_da30d2();
+  prevent_dce.inner = textureDimensions_da30d2();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_da30d2() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_da30d2() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_da30d2();
+  prevent_dce.inner = textureDimensions_da30d2();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_da30d2() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_da30d2();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.msl
index 038402e..b0c0274 100644
--- a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_da30d2(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_da30d2(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_da30d2(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_da30d2(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_da30d2(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_da30d2(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_da30d2(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_da30d2(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.spvasm
index 723c3be..39e2fc5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_da30d2 "textureDimensions_da30d2"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_da30d2 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_da30d2 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_da30d2
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_da30d2
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_da30d2
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_da30d2
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_da30d2
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_da30d2
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.wgsl
index 1e14937..21783ce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/da30d2.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32float, write>;
 
-fn textureDimensions_da30d2() {
+fn textureDimensions_da30d2() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_da30d2();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_da30d2();
+  prevent_dce = textureDimensions_da30d2();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_da30d2();
+  prevent_dce = textureDimensions_da30d2();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_da30d2();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl
index 4de0704..1538284 100644
--- a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16float, read>) -> vec2<u32>
-fn textureDimensions_daf0fe() {
+fn textureDimensions_daf0fe() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_daf0fe();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_daf0fe();
+  prevent_dce = textureDimensions_daf0fe();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_daf0fe();
+  prevent_dce = textureDimensions_daf0fe();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_daf0fe();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.dxc.hlsl
index 5a0e928..171b8aa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_daf0fe() {
+uint2 textureDimensions_daf0fe() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_daf0fe();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_daf0fe();
+  prevent_dce.Store2(0u, asuint(textureDimensions_daf0fe()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_daf0fe();
+  prevent_dce.Store2(0u, asuint(textureDimensions_daf0fe()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_daf0fe();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.fxc.hlsl
index 5a0e928..171b8aa 100644
--- a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_daf0fe() {
+uint2 textureDimensions_daf0fe() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_daf0fe();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_daf0fe();
+  prevent_dce.Store2(0u, asuint(textureDimensions_daf0fe()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_daf0fe();
+  prevent_dce.Store2(0u, asuint(textureDimensions_daf0fe()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_daf0fe();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.glsl
index 1e8a60d..12ce36e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp readonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_daf0fe() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_daf0fe();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_daf0fe() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_daf0fe() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_daf0fe();
+  prevent_dce.inner = textureDimensions_daf0fe();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_daf0fe() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_daf0fe() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_daf0fe();
+  prevent_dce.inner = textureDimensions_daf0fe();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16f) uniform highp readonly image2DArray arg_0;
+uvec2 textureDimensions_daf0fe() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_daf0fe();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.msl
index 75a9896..53d8a37 100644
--- a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_daf0fe(texture2d_array<float, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_daf0fe(texture2d_array<float, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_daf0fe(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_daf0fe(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_daf0fe(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_daf0fe(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_daf0fe(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_daf0fe(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.spvasm
index 5f9383b..1add129 100644
--- a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_daf0fe "textureDimensions_daf0fe"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_daf0fe = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_daf0fe = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_daf0fe
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_daf0fe
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_daf0fe
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_daf0fe
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_daf0fe
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_daf0fe
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.wgsl
index 50df2fd..3d53375 100644
--- a/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/daf0fe.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16float, read>;
 
-fn textureDimensions_daf0fe() {
+fn textureDimensions_daf0fe() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_daf0fe();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_daf0fe();
+  prevent_dce = textureDimensions_daf0fe();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_daf0fe();
+  prevent_dce = textureDimensions_daf0fe();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_daf0fe();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl
index f532000..d7fb3cc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32sint, read>) -> vec3<u32>
-fn textureDimensions_db7131() {
+fn textureDimensions_db7131() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_db7131();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_db7131();
+  prevent_dce = textureDimensions_db7131();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_db7131();
+  prevent_dce = textureDimensions_db7131();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_db7131();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.dxc.hlsl
index 78ec4e2..5958b23 100644
--- a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_db7131() {
+uint3 textureDimensions_db7131() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_db7131();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_db7131();
+  prevent_dce.Store3(0u, asuint(textureDimensions_db7131()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_db7131();
+  prevent_dce.Store3(0u, asuint(textureDimensions_db7131()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_db7131();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.fxc.hlsl
index 78ec4e2..5958b23 100644
--- a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_db7131() {
+uint3 textureDimensions_db7131() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_db7131();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_db7131();
+  prevent_dce.Store3(0u, asuint(textureDimensions_db7131()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_db7131();
+  prevent_dce.Store3(0u, asuint(textureDimensions_db7131()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_db7131();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.glsl
index a04d1f2..51a4f68 100644
--- a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32i) uniform highp readonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_db7131() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_db7131();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_db7131() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_db7131() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_db7131();
+  prevent_dce.inner = textureDimensions_db7131();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_db7131() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_db7131() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_db7131();
+  prevent_dce.inner = textureDimensions_db7131();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_db7131() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_db7131();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.msl
index de00680..538158c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_db7131(texture3d<int, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_db7131(texture3d<int, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_db7131(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_db7131(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_db7131(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_db7131(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_db7131(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_db7131(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.spvasm
index 1f15e73..8d8f5ee 100644
--- a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_db7131 "textureDimensions_db7131"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_db7131 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_db7131 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_db7131
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_db7131
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_db7131
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_db7131
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_db7131
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_db7131
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.wgsl
index ca5f987..0800e9b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/db7131.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32sint, read>;
 
-fn textureDimensions_db7131() {
+fn textureDimensions_db7131() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_db7131();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_db7131();
+  prevent_dce = textureDimensions_db7131();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_db7131();
+  prevent_dce = textureDimensions_db7131();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_db7131();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl
index 1f330a7..4a8977a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32uint, write>) -> vec2<u32>
-fn textureDimensions_dc83ce() {
+fn textureDimensions_dc83ce() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_dc83ce();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_dc83ce();
+  prevent_dce = textureDimensions_dc83ce();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_dc83ce();
+  prevent_dce = textureDimensions_dc83ce();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_dc83ce();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.dxc.hlsl
index adf5945..5adb251 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_dc83ce() {
+uint2 textureDimensions_dc83ce() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_dc83ce();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_dc83ce();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dc83ce()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_dc83ce();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dc83ce()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_dc83ce();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.fxc.hlsl
index adf5945..5adb251 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_dc83ce() {
+uint2 textureDimensions_dc83ce() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_dc83ce();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_dc83ce();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dc83ce()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_dc83ce();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dc83ce()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_dc83ce();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.glsl
index 19a83e4..5c0deb4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_dc83ce() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_dc83ce();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_dc83ce() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_dc83ce() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_dc83ce();
+  prevent_dce.inner = textureDimensions_dc83ce();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_dc83ce() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_dc83ce() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_dc83ce();
+  prevent_dce.inner = textureDimensions_dc83ce();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_dc83ce() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_dc83ce();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.msl
index b1b28d9..dfff5ef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_dc83ce(texture2d<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_dc83ce(texture2d<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_dc83ce(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_dc83ce(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_dc83ce(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_dc83ce(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_dc83ce(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_dc83ce(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.spvasm
index 0312cb1..207784e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_dc83ce "textureDimensions_dc83ce"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_dc83ce = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_dc83ce = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_dc83ce
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_dc83ce
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_dc83ce
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_dc83ce
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_dc83ce
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_dc83ce
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.wgsl
index 1de7869..5b0091c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dc83ce.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32uint, write>;
 
-fn textureDimensions_dc83ce() {
+fn textureDimensions_dc83ce() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_dc83ce();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_dc83ce();
+  prevent_dce = textureDimensions_dc83ce();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_dc83ce();
+  prevent_dce = textureDimensions_dc83ce();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_dc83ce();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl
index 83f163f..834e373 100644
--- a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32uint, read>) -> u32
-fn textureDimensions_de03c6() {
+fn textureDimensions_de03c6() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_de03c6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_de03c6();
+  prevent_dce = textureDimensions_de03c6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_de03c6();
+  prevent_dce = textureDimensions_de03c6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_de03c6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.dxc.hlsl
index 4dc7a62..811e528 100644
--- a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_de03c6() {
+uint textureDimensions_de03c6() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_de03c6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_de03c6();
+  prevent_dce.Store(0u, asuint(textureDimensions_de03c6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_de03c6();
+  prevent_dce.Store(0u, asuint(textureDimensions_de03c6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_de03c6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.fxc.hlsl
index 4dc7a62..811e528 100644
--- a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_de03c6() {
+uint textureDimensions_de03c6() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_de03c6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_de03c6();
+  prevent_dce.Store(0u, asuint(textureDimensions_de03c6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_de03c6();
+  prevent_dce.Store(0u, asuint(textureDimensions_de03c6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_de03c6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.glsl
index f46e8eb..8431c85 100644
--- a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp readonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_de03c6() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_de03c6();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_de03c6() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_de03c6() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_de03c6();
+  prevent_dce.inner = textureDimensions_de03c6();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_de03c6() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_de03c6() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_de03c6();
+  prevent_dce.inner = textureDimensions_de03c6();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32ui) uniform highp readonly uimage2D arg_0;
+uint textureDimensions_de03c6() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_de03c6();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.msl
index 4d09530..157358a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_de03c6(texture1d<uint, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_de03c6(texture1d<uint, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_de03c6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_de03c6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_de03c6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_de03c6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_de03c6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_de03c6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.spvasm
index b292353..c7be630 100644
--- a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_de03c6 "textureDimensions_de03c6"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 R32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_de03c6 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_de03c6 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_de03c6
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_de03c6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_de03c6
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_de03c6
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_de03c6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_de03c6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.wgsl
index e9b9c37..6882472 100644
--- a/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/de03c6.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32uint, read>;
 
-fn textureDimensions_de03c6() {
+fn textureDimensions_de03c6() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_de03c6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_de03c6();
+  prevent_dce = textureDimensions_de03c6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_de03c6();
+  prevent_dce = textureDimensions_de03c6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_de03c6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl
index 859e630..e2c655a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16float, read_write>) -> vec3<u32>
-fn textureDimensions_deb3c0() {
+fn textureDimensions_deb3c0() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_deb3c0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_deb3c0();
+  prevent_dce = textureDimensions_deb3c0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_deb3c0();
+  prevent_dce = textureDimensions_deb3c0();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_deb3c0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.dxc.hlsl
index f6fbf45..37709b0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_deb3c0() {
+uint3 textureDimensions_deb3c0() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_deb3c0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_deb3c0();
+  prevent_dce.Store3(0u, asuint(textureDimensions_deb3c0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_deb3c0();
+  prevent_dce.Store3(0u, asuint(textureDimensions_deb3c0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_deb3c0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.fxc.hlsl
index f6fbf45..37709b0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_deb3c0() {
+uint3 textureDimensions_deb3c0() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_deb3c0();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_deb3c0();
+  prevent_dce.Store3(0u, asuint(textureDimensions_deb3c0()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_deb3c0();
+  prevent_dce.Store3(0u, asuint(textureDimensions_deb3c0()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_deb3c0();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.glsl
index 89338e8..22d3c2f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_deb3c0() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_deb3c0();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_deb3c0() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_deb3c0() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_deb3c0();
+  prevent_dce.inner = textureDimensions_deb3c0();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_deb3c0() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_deb3c0() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_deb3c0();
+  prevent_dce.inner = textureDimensions_deb3c0();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_deb3c0() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_deb3c0();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.msl
index e4fe78d..a1787f7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_deb3c0(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_deb3c0(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_deb3c0(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_deb3c0(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_deb3c0(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_deb3c0(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_deb3c0(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_deb3c0(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.spvasm
index e46800c..776cd7e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_deb3c0 "textureDimensions_deb3c0"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_deb3c0 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_deb3c0 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_deb3c0
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_deb3c0
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_deb3c0
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_deb3c0
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_deb3c0
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_deb3c0
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.wgsl
index 1ed871c..a975fca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/deb3c0.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16float, read_write>;
 
-fn textureDimensions_deb3c0() {
+fn textureDimensions_deb3c0() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_deb3c0();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_deb3c0();
+  prevent_dce = textureDimensions_deb3c0();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_deb3c0();
+  prevent_dce = textureDimensions_deb3c0();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_deb3c0();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl
index 5e05d8e..0e6c451 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8snorm, write>) -> vec2<u32>
-fn textureDimensions_dee461() {
+fn textureDimensions_dee461() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_dee461();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_dee461();
+  prevent_dce = textureDimensions_dee461();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_dee461();
+  prevent_dce = textureDimensions_dee461();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_dee461();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.dxc.hlsl
index f2188bc..5c25817 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_dee461() {
+uint2 textureDimensions_dee461() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_dee461();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_dee461();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dee461()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_dee461();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dee461()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_dee461();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.fxc.hlsl
index f2188bc..5c25817 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_dee461() {
+uint2 textureDimensions_dee461() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_dee461();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_dee461();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dee461()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_dee461();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dee461()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_dee461();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.glsl
index 3b854c3..03f60fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_dee461() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_dee461();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_dee461() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_dee461() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_dee461();
+  prevent_dce.inner = textureDimensions_dee461();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_dee461() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_dee461() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_dee461();
+  prevent_dce.inner = textureDimensions_dee461();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_dee461() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_dee461();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.msl
index a454b79..4044b0c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_dee461(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_dee461(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_dee461(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_dee461(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_dee461(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_dee461(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_dee461(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_dee461(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.spvasm
index 455ffbb..61e1ce8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_dee461 "textureDimensions_dee461"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_dee461 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_dee461 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_dee461
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_dee461
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_dee461
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_dee461
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_dee461
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_dee461
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.wgsl
index 31785c9..abdc467 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dee461.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8snorm, write>;
 
-fn textureDimensions_dee461() {
+fn textureDimensions_dee461() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_dee461();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_dee461();
+  prevent_dce = textureDimensions_dee461();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_dee461();
+  prevent_dce = textureDimensions_dee461();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_dee461();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl
index c41fa0e..c3e83fe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<u32>
-fn textureDimensions_dfdc32() {
+fn textureDimensions_dfdc32() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_dfdc32();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_dfdc32();
+  prevent_dce = textureDimensions_dfdc32();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_dfdc32();
+  prevent_dce = textureDimensions_dfdc32();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_dfdc32();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.dxc.hlsl
index d63177f..55a904b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_dfdc32() {
+uint2 textureDimensions_dfdc32() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_dfdc32();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_dfdc32();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dfdc32()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_dfdc32();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dfdc32()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_dfdc32();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.fxc.hlsl
index d63177f..55a904b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_dfdc32() {
+uint2 textureDimensions_dfdc32() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_dfdc32();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_dfdc32();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dfdc32()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_dfdc32();
+  prevent_dce.Store2(0u, asuint(textureDimensions_dfdc32()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_dfdc32();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.glsl
index 94165a3..56fd81e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_dfdc32() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_dfdc32();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_dfdc32() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_dfdc32() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_dfdc32();
+  prevent_dce.inner = textureDimensions_dfdc32();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_dfdc32() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_dfdc32() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_dfdc32();
+  prevent_dce.inner = textureDimensions_dfdc32();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_dfdc32() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_dfdc32();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.msl
index 46e6dcd..28f8113 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_dfdc32(depth2d_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_dfdc32(depth2d_array<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depth2d_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_dfdc32(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depth2d_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_dfdc32(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depth2d_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_dfdc32(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depth2d_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_dfdc32(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depth2d_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depth2d_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depth2d_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_dfdc32(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depth2d_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_dfdc32(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.spvasm
index 0fe4d8a..e76f118 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,81 +21,108 @@
                OpName %textureDimensions_dfdc32 "textureDimensions_dfdc32"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_dfdc32 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_dfdc32 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_dfdc32
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_dfdc32
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_dfdc32
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_dfdc32
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_dfdc32
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_dfdc32
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.wgsl
index 8764cdd..6475a60 100644
--- a/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/dfdc32.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-fn textureDimensions_dfdc32() {
+fn textureDimensions_dfdc32() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_dfdc32();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_dfdc32();
+  prevent_dce = textureDimensions_dfdc32();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_dfdc32();
+  prevent_dce = textureDimensions_dfdc32();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_dfdc32();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl
index 94fb6dc..f80c9cd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8snorm, write>) -> u32
-fn textureDimensions_e122fe() {
+fn textureDimensions_e122fe() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e122fe();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e122fe();
+  prevent_dce = textureDimensions_e122fe();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e122fe();
+  prevent_dce = textureDimensions_e122fe();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e122fe();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.dxc.hlsl
index 28f17a2..d4191a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e122fe() {
+uint textureDimensions_e122fe() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e122fe();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e122fe();
+  prevent_dce.Store(0u, asuint(textureDimensions_e122fe()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e122fe();
+  prevent_dce.Store(0u, asuint(textureDimensions_e122fe()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e122fe();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.fxc.hlsl
index 28f17a2..d4191a2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e122fe() {
+uint textureDimensions_e122fe() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e122fe();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e122fe();
+  prevent_dce.Store(0u, asuint(textureDimensions_e122fe()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e122fe();
+  prevent_dce.Store(0u, asuint(textureDimensions_e122fe()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e122fe();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.glsl
index d26b1a0..1cb6a790 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_e122fe() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e122fe();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uint textureDimensions_e122fe() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_e122fe() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e122fe();
+  prevent_dce.inner = textureDimensions_e122fe();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uint textureDimensions_e122fe() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_e122fe() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e122fe();
+  prevent_dce.inner = textureDimensions_e122fe();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image2D arg_0;
+uint textureDimensions_e122fe() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e122fe();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.msl
index 05dd1ad..a6869f9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e122fe(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_e122fe(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e122fe(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e122fe(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_e122fe(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e122fe(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e122fe(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e122fe(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.spvasm
index b04e33a..440015c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_e122fe "textureDimensions_e122fe"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e122fe = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_e122fe = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_e122fe
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_e122fe
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_e122fe
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_e122fe
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_e122fe
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_e122fe
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.wgsl
index bc6ffa1..23f199c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e122fe.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8snorm, write>;
 
-fn textureDimensions_e122fe() {
+fn textureDimensions_e122fe() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e122fe();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e122fe();
+  prevent_dce = textureDimensions_e122fe();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e122fe();
+  prevent_dce = textureDimensions_e122fe();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e122fe();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl
index 2177e29..5cbff1c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d<u32>;
 
 // fn textureDimensions(texture: texture_2d<u32>, level: u32) -> vec2<u32>
-fn textureDimensions_e18a8b() {
+fn textureDimensions_e18a8b() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e18a8b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e18a8b();
+  prevent_dce = textureDimensions_e18a8b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e18a8b();
+  prevent_dce = textureDimensions_e18a8b();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e18a8b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.dxc.hlsl
index 922f08a..cafa854 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e18a8b() {
+uint2 textureDimensions_e18a8b() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e18a8b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e18a8b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e18a8b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e18a8b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e18a8b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e18a8b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.fxc.hlsl
index 922f08a..cafa854 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e18a8b() {
+uint2 textureDimensions_e18a8b() {
   uint arg_1 = 1u;
   uint3 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e18a8b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e18a8b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e18a8b()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e18a8b();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e18a8b()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e18a8b();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.glsl
index 68e3cab..2f410a1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp usampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_e18a8b() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e18a8b();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_e18a8b() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e18a8b() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e18a8b();
+  prevent_dce.inner = textureDimensions_e18a8b();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_e18a8b() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e18a8b() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e18a8b();
+  prevent_dce.inner = textureDimensions_e18a8b();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usampler2D arg_0_1;
+uvec2 textureDimensions_e18a8b() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e18a8b();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.msl
index 100e21b..d315080 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e18a8b(texture2d<uint, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_e18a8b(texture2d<uint, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e18a8b(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e18a8b(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_e18a8b(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e18a8b(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e18a8b(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e18a8b(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.spvasm
index 3b9fc73..e712e21 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 63
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,78 +21,104 @@
                OpName %textureDimensions_e18a8b "textureDimensions_e18a8b"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %30 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_e18a8b = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %30
+%textureDimensions_e18a8b = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %uint %arg_1
-         %25 = OpImageQuerySizeLod %v2uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %34 = OpLoad %v2uint %res
-               OpStore %33 %34
+         %28 = OpLoad %16 %arg_0
+         %29 = OpLoad %uint %arg_1
+         %27 = OpImageQuerySizeLod %v2uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %v2uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_e18a8b
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_e18a8b
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %v2uint %textureDimensions_e18a8b
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %54 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %55 = OpFunctionCall %v2uint %textureDimensions_e18a8b
+               OpStore %54 %55
+         %56 = OpLoad %VertexOutput %out
+               OpReturnValue %56
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %58 = OpLabel
+         %59 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %60 = OpCompositeExtract %v4float %59 0
+               OpStore %pos_1 %60
+         %61 = OpCompositeExtract %v2uint %59 1
+               OpStore %prevent_dce_1 %61
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_e18a8b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_e18a8b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.wgsl
index 471562b..7aa23ec 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e18a8b.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d<u32>;
 
-fn textureDimensions_e18a8b() {
+fn textureDimensions_e18a8b() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e18a8b();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e18a8b();
+  prevent_dce = textureDimensions_e18a8b();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e18a8b();
+  prevent_dce = textureDimensions_e18a8b();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e18a8b();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl
index f2dd449..d2bef25 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
 
 // fn textureDimensions(texture: texture_multisampled_2d<u32>) -> vec2<u32>
-fn textureDimensions_e4bfd2() {
+fn textureDimensions_e4bfd2() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e4bfd2();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce = textureDimensions_e4bfd2();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce = textureDimensions_e4bfd2();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e4bfd2();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.dxc.hlsl
index 8fb42ec..3483f11 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e4bfd2() {
+uint2 textureDimensions_e4bfd2() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e4bfd2();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4bfd2()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4bfd2()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e4bfd2();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.fxc.hlsl
index 8fb42ec..3483f11 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DMS<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e4bfd2() {
+uint2 textureDimensions_e4bfd2() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e4bfd2();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4bfd2()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4bfd2()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e4bfd2();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.glsl
index 59574ef..3627cd0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp usampler2DMS arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_e4bfd2() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e4bfd2();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler2DMS arg_0_1;
+uvec2 textureDimensions_e4bfd2() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e4bfd2() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce.inner = textureDimensions_e4bfd2();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp usampler2DMS arg_0_1;
+uvec2 textureDimensions_e4bfd2() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e4bfd2() {
-  uvec2 res = uvec2(textureSize(arg_0_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce.inner = textureDimensions_e4bfd2();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp usampler2DMS arg_0_1;
+uvec2 textureDimensions_e4bfd2() {
+  uvec2 res = uvec2(textureSize(arg_0_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e4bfd2();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.msl
index 5221d3f..aa9fef6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e4bfd2(texture2d_ms<uint, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_e4bfd2(texture2d_ms<uint, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_ms<uint, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e4bfd2(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_ms<uint, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e4bfd2(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_ms<uint, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_e4bfd2(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_ms<uint, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e4bfd2(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_ms<uint, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_ms<uint, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_ms<uint, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e4bfd2(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_ms<uint, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e4bfd2(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.spvasm
index 0ea8c85..ffc5e8e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_e4bfd2 "textureDimensions_e4bfd2"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 1 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 1 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e4bfd2 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_e4bfd2 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_e4bfd2
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_e4bfd2
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_e4bfd2
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_e4bfd2
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_e4bfd2
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_e4bfd2
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.wgsl
index 8e7e5ef..0b3368c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4bfd2.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_multisampled_2d<u32>;
 
-fn textureDimensions_e4bfd2() {
+fn textureDimensions_e4bfd2() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e4bfd2();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce = textureDimensions_e4bfd2();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e4bfd2();
+  prevent_dce = textureDimensions_e4bfd2();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e4bfd2();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl
index 71422c4..754c902 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureDimensions(texture: texture_2d_array<i32>, level: u32) -> vec2<u32>
-fn textureDimensions_e4e310() {
+fn textureDimensions_e4e310() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e4e310();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e4e310();
+  prevent_dce = textureDimensions_e4e310();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e4e310();
+  prevent_dce = textureDimensions_e4e310();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e4e310();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.dxc.hlsl
index cd5f3c2..fee675a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e4e310() {
+uint2 textureDimensions_e4e310() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e4e310();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e4e310();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4e310()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e4e310();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4e310()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e4e310();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.fxc.hlsl
index cd5f3c2..fee675a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e4e310() {
+uint2 textureDimensions_e4e310() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e4e310();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e4e310();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4e310()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e4e310();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4e310()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e4e310();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.glsl
index 4061e4a..915a395 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_e4e310() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e4e310();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_e4e310() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e4e310() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e4e310();
+  prevent_dce.inner = textureDimensions_e4e310();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_e4e310() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e4e310() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e4e310();
+  prevent_dce.inner = textureDimensions_e4e310();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_e4e310() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e4e310();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.msl
index 5c2fb08..ec3b270 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e4e310(texture2d_array<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_e4e310(texture2d_array<int, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e4e310(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e4e310(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_e4e310(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e4e310(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e4e310(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e4e310(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.spvasm
index a7dd321..a0bf7a1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,81 +21,107 @@
                OpName %textureDimensions_e4e310 "textureDimensions_e4e310"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+         %27 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_e4e310 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_e4e310 = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %uint %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %uint %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_e4e310
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_e4e310
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_e4e310
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %57 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %58 = OpFunctionCall %v2uint %textureDimensions_e4e310
+               OpStore %57 %58
+         %59 = OpLoad %VertexOutput %out
+               OpReturnValue %59
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %61 = OpLabel
+         %62 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %63 = OpCompositeExtract %v4float %62 0
+               OpStore %pos_1 %63
+         %64 = OpCompositeExtract %v2uint %62 1
+               OpStore %prevent_dce_1 %64
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_e4e310
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_e4e310
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.wgsl
index 1faadef..eb3cac6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4e310.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
-fn textureDimensions_e4e310() {
+fn textureDimensions_e4e310() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e4e310();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e4e310();
+  prevent_dce = textureDimensions_e4e310();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e4e310();
+  prevent_dce = textureDimensions_e4e310();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e4e310();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl
index 2f4889f..1cd81da 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32float, read_write>) -> vec2<u32>
-fn textureDimensions_e4f021() {
+fn textureDimensions_e4f021() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e4f021();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e4f021();
+  prevent_dce = textureDimensions_e4f021();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e4f021();
+  prevent_dce = textureDimensions_e4f021();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e4f021();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.dxc.hlsl
index 6dc68f2..048dbae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e4f021() {
+uint2 textureDimensions_e4f021() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e4f021();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e4f021();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4f021()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e4f021();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4f021()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e4f021();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.fxc.hlsl
index 6dc68f2..048dbae 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e4f021() {
+uint2 textureDimensions_e4f021() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e4f021();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e4f021();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4f021()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e4f021();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e4f021()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e4f021();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.glsl
index b244c9f..c917911 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_e4f021() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e4f021();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_e4f021() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e4f021() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e4f021();
+  prevent_dce.inner = textureDimensions_e4f021();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_e4f021() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e4f021() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e4f021();
+  prevent_dce.inner = textureDimensions_e4f021();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_e4f021() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e4f021();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.msl
index 8373a91..97b049e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e4f021(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_e4f021(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e4f021(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e4f021(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_e4f021(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e4f021(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e4f021(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e4f021(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.spvasm
index bd9b164..9c4bbac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_e4f021 "textureDimensions_e4f021"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e4f021 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_e4f021 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_e4f021
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_e4f021
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_e4f021
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_e4f021
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_e4f021
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_e4f021
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.wgsl
index fed68ef..2a34a71 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e4f021.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32float, read_write>;
 
-fn textureDimensions_e4f021() {
+fn textureDimensions_e4f021() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e4f021();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e4f021();
+  prevent_dce = textureDimensions_e4f021();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e4f021();
+  prevent_dce = textureDimensions_e4f021();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e4f021();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl
index db12377..73f66e6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8uint, read_write>) -> vec2<u32>
-fn textureDimensions_e50eb8() {
+fn textureDimensions_e50eb8() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e50eb8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e50eb8();
+  prevent_dce = textureDimensions_e50eb8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e50eb8();
+  prevent_dce = textureDimensions_e50eb8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e50eb8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.dxc.hlsl
index e3ce914..dadc5bc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e50eb8() {
+uint2 textureDimensions_e50eb8() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e50eb8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e50eb8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e50eb8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e50eb8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e50eb8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e50eb8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.fxc.hlsl
index e3ce914..dadc5bc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e50eb8() {
+uint2 textureDimensions_e50eb8() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e50eb8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e50eb8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e50eb8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e50eb8();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e50eb8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e50eb8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.glsl
index 32c8c56..9f9c985 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_e50eb8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e50eb8();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_e50eb8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e50eb8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e50eb8();
+  prevent_dce.inner = textureDimensions_e50eb8();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_e50eb8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e50eb8() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e50eb8();
+  prevent_dce.inner = textureDimensions_e50eb8();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_e50eb8() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e50eb8();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.msl
index 6a2dd18..e555cb3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e50eb8(texture2d<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_e50eb8(texture2d<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e50eb8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e50eb8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_e50eb8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e50eb8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e50eb8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e50eb8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.spvasm
index 11cdf89..d25daf2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_e50eb8 "textureDimensions_e50eb8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba8ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba8ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e50eb8 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_e50eb8 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_e50eb8
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_e50eb8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_e50eb8
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_e50eb8
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_e50eb8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_e50eb8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.wgsl
index 5a81081..f188107 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e50eb8.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8uint, read_write>;
 
-fn textureDimensions_e50eb8() {
+fn textureDimensions_e50eb8() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e50eb8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e50eb8();
+  prevent_dce = textureDimensions_e50eb8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e50eb8();
+  prevent_dce = textureDimensions_e50eb8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e50eb8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl
index ca68205..0aa900f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_3d<u32>;
 
 // fn textureDimensions(texture: texture_3d<u32>, level: i32) -> vec3<u32>
-fn textureDimensions_e5a203() {
+fn textureDimensions_e5a203() -> vec3<u32>{
   var arg_1 = 1i;
   var res: vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e5a203();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e5a203();
+  prevent_dce = textureDimensions_e5a203();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e5a203();
+  prevent_dce = textureDimensions_e5a203();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e5a203();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.dxc.hlsl
index 52cac29..17ffde9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e5a203() {
+uint3 textureDimensions_e5a203() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e5a203();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e5a203();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e5a203()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e5a203();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e5a203()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e5a203();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.fxc.hlsl
index 52cac29..17ffde9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture3D<uint4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e5a203() {
+uint3 textureDimensions_e5a203() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint3 res = tint_tmp.xyz;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e5a203();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e5a203();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e5a203()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e5a203();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e5a203()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e5a203();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.glsl
index 5479fab3..2840ab3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.glsl
@@ -1,48 +1,26 @@
 #version 310 es
-
-uniform highp usampler3D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_e5a203() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e5a203();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_e5a203() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_e5a203() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e5a203();
+  prevent_dce.inner = textureDimensions_e5a203();
 }
 
 void main() {
@@ -52,19 +30,24 @@
 #version 310 es
 
 uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_e5a203() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_e5a203() {
-  int arg_1 = 1;
-  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e5a203();
+  prevent_dce.inner = textureDimensions_e5a203();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -72,3 +55,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+uniform highp usampler3D arg_0_1;
+uvec3 textureDimensions_e5a203() {
+  int arg_1 = 1;
+  uvec3 res = uvec3(textureSize(arg_0_1, arg_1));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e5a203();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.msl
index 79a8e3e..3b2be48 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e5a203(texture3d<uint, access::sample> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_e5a203(texture3d<uint, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint3 res = uint3(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1), tint_symbol_1.get_depth(arg_1));
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<uint, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_e5a203(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<uint, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_e5a203(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<uint, access::sample> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_e5a203(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<uint, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e5a203(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<uint, access::sample> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<uint, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<uint, access::sample> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e5a203(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<uint, access::sample> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e5a203(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.spvasm
index 2f24dd9..2c5ff6c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 50
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,79 +21,106 @@
                OpName %textureDimensions_e5a203 "textureDimensions_e5a203"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 3D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 3D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %31 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %36 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %46 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %52 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e5a203 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v3uint Function %31
+%textureDimensions_e5a203 = OpFunction %v3uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v3uint Function %10
                OpStore %arg_1 %int_1
-         %27 = OpLoad %11 %arg_0
-         %28 = OpLoad %int %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %27 %28
-               OpStore %res %26
-         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %35 = OpLoad %v3uint %res
-               OpStore %34 %35
+         %29 = OpLoad %16 %arg_0
+         %30 = OpLoad %int %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %29 %30
+               OpStore %res %28
+         %33 = OpLoad %v3uint %res
+               OpReturnValue %33
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %34
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v3uint %textureDimensions_e5a203
+               OpStore %40 %41
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %36
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_e5a203
-               OpReturnValue %5
+%compute_main = OpFunction %void None %34
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %45 = OpFunctionCall %v3uint %textureDimensions_e5a203
+               OpStore %44 %45
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %42
+%vertex_main_inner = OpFunction %VertexOutput None %46
+         %49 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %52
+         %54 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %54 %5
+         %56 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %57 = OpFunctionCall %v3uint %textureDimensions_e5a203
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %34
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v3uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_e5a203
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %48 = OpLabel
-         %49 = OpFunctionCall %void %textureDimensions_e5a203
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.wgsl
index c22c2c2..7219299 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e5a203.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_3d<u32>;
 
-fn textureDimensions_e5a203() {
+fn textureDimensions_e5a203() -> vec3<u32> {
   var arg_1 = 1i;
   var res : vec3<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e5a203();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e5a203();
+  prevent_dce = textureDimensions_e5a203();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e5a203();
+  prevent_dce = textureDimensions_e5a203();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e5a203();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl
index 2cc75ae..06b7825 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32sint, write>) -> vec3<u32>
-fn textureDimensions_e738f4() {
+fn textureDimensions_e738f4() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e738f4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e738f4();
+  prevent_dce = textureDimensions_e738f4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e738f4();
+  prevent_dce = textureDimensions_e738f4();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e738f4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.dxc.hlsl
index 311be74..f4a4b7f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e738f4() {
+uint3 textureDimensions_e738f4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e738f4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e738f4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e738f4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e738f4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e738f4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e738f4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.fxc.hlsl
index 311be74..f4a4b7f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e738f4() {
+uint3 textureDimensions_e738f4() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e738f4();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e738f4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e738f4()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e738f4();
+  prevent_dce.Store3(0u, asuint(textureDimensions_e738f4()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e738f4();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.msl
index 0bd7f39..af16279 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e738f4(texture3d<int, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_e738f4(texture3d<int, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_e738f4(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_e738f4(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_e738f4(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e738f4(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e738f4(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e738f4(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.spvasm
index 2c62d26..9593909 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,74 +21,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_e738f4 "textureDimensions_e738f4"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e738f4 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_e738f4 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_e738f4
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_e738f4
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_e738f4
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_e738f4
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_e738f4
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_e738f4
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.wgsl
index e3fc8d3..8960edd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e738f4.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rg32sint, write>;
 
-fn textureDimensions_e738f4() {
+fn textureDimensions_e738f4() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e738f4();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e738f4();
+  prevent_dce = textureDimensions_e738f4();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e738f4();
+  prevent_dce = textureDimensions_e738f4();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e738f4();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl
index 2f2a389..01b4666 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32uint, read_write>) -> vec2<u32>
-fn textureDimensions_e824b6() {
+fn textureDimensions_e824b6() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e824b6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e824b6();
+  prevent_dce = textureDimensions_e824b6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e824b6();
+  prevent_dce = textureDimensions_e824b6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e824b6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.dxc.hlsl
index ca17252..a18e2c5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e824b6() {
+uint2 textureDimensions_e824b6() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e824b6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e824b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e824b6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e824b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e824b6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e824b6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.fxc.hlsl
index ca17252..a18e2c5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e824b6() {
+uint2 textureDimensions_e824b6() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e824b6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e824b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e824b6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e824b6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e824b6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e824b6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.msl
index 68cc693..24216ab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e824b6(texture2d_array<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_e824b6(texture2d_array<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e824b6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e824b6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_e824b6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e824b6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e824b6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e824b6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.spvasm
index 8c07ac8..caa3f72 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,74 +21,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_e824b6 "textureDimensions_e824b6"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 1 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 1 0 2 Rg32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e824b6 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_e824b6 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_e824b6
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_e824b6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_e824b6
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_e824b6
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_e824b6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_e824b6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.wgsl
index 68b9fed..f316392 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e824b6.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32uint, read_write>;
 
-fn textureDimensions_e824b6() {
+fn textureDimensions_e824b6() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e824b6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e824b6();
+  prevent_dce = textureDimensions_e824b6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e824b6();
+  prevent_dce = textureDimensions_e824b6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e824b6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl
index defd84b..0d95258 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16uint, write>) -> vec2<u32>
-fn textureDimensions_e99308() {
+fn textureDimensions_e99308() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e99308();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e99308();
+  prevent_dce = textureDimensions_e99308();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e99308();
+  prevent_dce = textureDimensions_e99308();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e99308();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.dxc.hlsl
index cb1baa7..46c645d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e99308() {
+uint2 textureDimensions_e99308() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e99308();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e99308();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e99308()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e99308();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e99308()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e99308();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.fxc.hlsl
index cb1baa7..46c645d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_e99308() {
+uint2 textureDimensions_e99308() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_e99308();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_e99308();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e99308()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_e99308();
+  prevent_dce.Store2(0u, asuint(textureDimensions_e99308()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_e99308();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.glsl
index 80f1eae..cbf049f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_e99308() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e99308();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_e99308() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e99308() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_e99308();
+  prevent_dce.inner = textureDimensions_e99308();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_e99308() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_e99308() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_e99308();
+  prevent_dce.inner = textureDimensions_e99308();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16ui) uniform highp writeonly uimage2D arg_0;
+uvec2 textureDimensions_e99308() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_e99308();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.msl
index 9a21c05..4ec1c85 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_e99308(texture2d<uint, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_e99308(texture2d<uint, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_e99308(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_e99308(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_e99308(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_e99308(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_e99308(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_e99308(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.spvasm
index 2406512..5c54c18 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_e99308 "textureDimensions_e99308"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 Rgba16ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 Rgba16ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_e99308 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_e99308 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_e99308
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_e99308
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_e99308
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_e99308
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_e99308
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_e99308
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.wgsl
index 14d0af3..e8dc121 100644
--- a/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/e99308.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16uint, write>;
 
-fn textureDimensions_e99308() {
+fn textureDimensions_e99308() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e99308();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_e99308();
+  prevent_dce = textureDimensions_e99308();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_e99308();
+  prevent_dce = textureDimensions_e99308();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_e99308();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl
index 9581875..d0be869 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32float, write>) -> u32
-fn textureDimensions_ea066c() {
+fn textureDimensions_ea066c() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ea066c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ea066c();
+  prevent_dce = textureDimensions_ea066c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ea066c();
+  prevent_dce = textureDimensions_ea066c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ea066c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.dxc.hlsl
index baad958..4eeff36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ea066c() {
+uint textureDimensions_ea066c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ea066c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ea066c();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea066c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ea066c();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea066c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ea066c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.fxc.hlsl
index baad958..4eeff36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ea066c() {
+uint textureDimensions_ea066c() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ea066c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ea066c();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea066c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ea066c();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea066c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ea066c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.glsl
index 9443ce9..4a8543c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_ea066c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_ea066c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_ea066c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_ea066c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_ea066c();
+  prevent_dce.inner = textureDimensions_ea066c();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_ea066c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_ea066c() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_ea066c();
+  prevent_dce.inner = textureDimensions_ea066c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(r32f) uniform highp writeonly image2D arg_0;
+uint textureDimensions_ea066c() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_ea066c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.msl
index e763dc2..bb68694 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ea066c(texture1d<float, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_ea066c(texture1d<float, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_ea066c(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_ea066c(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_ea066c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ea066c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ea066c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ea066c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.spvasm
index de79c1d..156eb7d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ea066c "textureDimensions_ea066c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 R32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 R32f
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ea066c = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_ea066c = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_ea066c
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_ea066c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_ea066c
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_ea066c
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_ea066c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_ea066c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.wgsl
index e0a8258..da95e5d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea066c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r32float, write>;
 
-fn textureDimensions_ea066c() {
+fn textureDimensions_ea066c() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ea066c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ea066c();
+  prevent_dce = textureDimensions_ea066c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ea066c();
+  prevent_dce = textureDimensions_ea066c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ea066c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl
index 2614e52..fe136ab 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32uint, write>) -> u32
-fn textureDimensions_ea25bc() {
+fn textureDimensions_ea25bc() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ea25bc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ea25bc();
+  prevent_dce = textureDimensions_ea25bc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ea25bc();
+  prevent_dce = textureDimensions_ea25bc();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ea25bc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.dxc.hlsl
index b6dc189..7e9ac6c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ea25bc() {
+uint textureDimensions_ea25bc() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ea25bc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ea25bc();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea25bc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ea25bc();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea25bc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ea25bc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.fxc.hlsl
index b6dc189..7e9ac6c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ea25bc() {
+uint textureDimensions_ea25bc() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ea25bc();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ea25bc();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea25bc()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ea25bc();
+  prevent_dce.Store(0u, asuint(textureDimensions_ea25bc()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ea25bc();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.msl
index 3a33ce8..14d6bbc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ea25bc(texture1d<uint, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_ea25bc(texture1d<uint, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_ea25bc(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_ea25bc(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_ea25bc(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ea25bc(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ea25bc(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ea25bc(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.spvasm
index 79c856c..38c2c0b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,72 +22,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ea25bc "textureDimensions_ea25bc"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rg32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rg32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ea25bc = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_ea25bc = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_ea25bc
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_ea25bc
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_ea25bc
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_ea25bc
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_ea25bc
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_ea25bc
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.wgsl
index 37a6a55..ed9a2e3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ea25bc.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32uint, write>;
 
-fn textureDimensions_ea25bc() {
+fn textureDimensions_ea25bc() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ea25bc();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ea25bc();
+  prevent_dce = textureDimensions_ea25bc();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ea25bc();
+  prevent_dce = textureDimensions_ea25bc();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ea25bc();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl
index 22a3ee8..2a8288b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureDimensions(texture: texture_depth_2d_array, level: u32) -> vec2<u32>
-fn textureDimensions_eafe19() {
+fn textureDimensions_eafe19() -> vec2<u32>{
   var arg_1 = 1u;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eafe19();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eafe19();
+  prevent_dce = textureDimensions_eafe19();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eafe19();
+  prevent_dce = textureDimensions_eafe19();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eafe19();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.dxc.hlsl
index 779b782..316351d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eafe19() {
+uint2 textureDimensions_eafe19() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eafe19();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eafe19();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eafe19()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eafe19();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eafe19()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eafe19();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.fxc.hlsl
index 779b782..316351d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eafe19() {
+uint2 textureDimensions_eafe19() {
   uint arg_1 = 1u;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eafe19();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eafe19();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eafe19()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eafe19();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eafe19()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eafe19();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.glsl
index c324f1f..68ee2a3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_eafe19() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_eafe19();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_eafe19() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eafe19() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_eafe19();
+  prevent_dce.inner = textureDimensions_eafe19();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_eafe19() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eafe19() {
-  uint arg_1 = 1u;
-  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_eafe19();
+  prevent_dce.inner = textureDimensions_eafe19();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp sampler2DArray arg_0_1;
+uvec2 textureDimensions_eafe19() {
+  uint arg_1 = 1u;
+  uvec2 res = uvec2(textureSize(arg_0_1, int(arg_1)).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_eafe19();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.msl
index f4f6fac..f837572 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_eafe19(depth2d_array<float, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_eafe19(depth2d_array<float, access::sample> tint_symbol_1) {
   uint arg_1 = 1u;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], depth2d_array<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_eafe19(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], depth2d_array<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_eafe19(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(depth2d_array<float, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_eafe19(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(depth2d_array<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_eafe19(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(depth2d_array<float, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(depth2d_array<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(depth2d_array<float, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_eafe19(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(depth2d_array<float, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_eafe19(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.spvasm
index 6cc8309..dde34ed 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 51
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,80 +21,106 @@
                OpName %textureDimensions_eafe19 "textureDimensions_eafe19"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %uint_1 = OpConstant %uint 1
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+         %26 = OpConstantNull %uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %32 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %37 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %47 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %53 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
     %float_1 = OpConstant %float 1
-%textureDimensions_eafe19 = OpFunction %void None %17
-         %20 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_uint Function %24
-        %res = OpVariable %_ptr_Function_v2uint Function %32
+%textureDimensions_eafe19 = OpFunction %v2uint None %20
+         %22 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_uint Function %26
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %uint_1
-         %28 = OpLoad %11 %arg_0
-         %29 = OpLoad %uint %arg_1
-         %26 = OpImageQuerySizeLod %v3uint %28 %29
-         %25 = OpVectorShuffle %v2uint %26 %26 0 1
-               OpStore %res %25
-         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %36 = OpLoad %v2uint %res
-               OpStore %35 %36
+         %30 = OpLoad %16 %arg_0
+         %31 = OpLoad %uint %arg_1
+         %28 = OpImageQuerySizeLod %v3uint %30 %31
+         %27 = OpVectorShuffle %v2uint %28 %28 0 1
+               OpStore %res %27
+         %34 = OpLoad %v2uint %res
+               OpReturnValue %34
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %35
+         %38 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_eafe19
+               OpStore %41 %42
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %37
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_eafe19
-               OpReturnValue %5
+%compute_main = OpFunction %void None %35
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %46 = OpFunctionCall %v2uint %textureDimensions_eafe19
+               OpStore %45 %46
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %43
+%vertex_main_inner = OpFunction %VertexOutput None %47
+         %50 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %53
+         %55 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %55 %5
+         %56 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %57 = OpFunctionCall %v2uint %textureDimensions_eafe19
+               OpStore %56 %57
+         %58 = OpLoad %VertexOutput %out
+               OpReturnValue %58
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %35
+         %60 = OpLabel
+         %61 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %62 = OpCompositeExtract %v4float %61 0
+               OpStore %pos_1 %62
+         %63 = OpCompositeExtract %v2uint %61 1
+               OpStore %prevent_dce_1 %63
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %46 = OpLabel
-         %47 = OpFunctionCall %void %textureDimensions_eafe19
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %49 = OpLabel
-         %50 = OpFunctionCall %void %textureDimensions_eafe19
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.wgsl
index a5854e6..85f5187 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eafe19.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-fn textureDimensions_eafe19() {
+fn textureDimensions_eafe19() -> vec2<u32> {
   var arg_1 = 1u;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eafe19();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eafe19();
+  prevent_dce = textureDimensions_eafe19();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eafe19();
+  prevent_dce = textureDimensions_eafe19();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eafe19();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl
index e0e65da..32cb2f4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16float, write>) -> vec2<u32>
-fn textureDimensions_eb03b1() {
+fn textureDimensions_eb03b1() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb03b1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb03b1();
+  prevent_dce = textureDimensions_eb03b1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb03b1();
+  prevent_dce = textureDimensions_eb03b1();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb03b1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.dxc.hlsl
index fd9edb6..5b68525 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb03b1() {
+uint2 textureDimensions_eb03b1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb03b1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb03b1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb03b1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb03b1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb03b1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb03b1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.fxc.hlsl
index fd9edb6..5b68525 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb03b1() {
+uint2 textureDimensions_eb03b1() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb03b1();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb03b1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb03b1()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb03b1();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb03b1()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb03b1();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.glsl
index de50123..16c9f68 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_eb03b1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_eb03b1();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_eb03b1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eb03b1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_eb03b1();
+  prevent_dce.inner = textureDimensions_eb03b1();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_eb03b1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eb03b1() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_eb03b1();
+  prevent_dce.inner = textureDimensions_eb03b1();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image2DArray arg_0;
+uvec2 textureDimensions_eb03b1() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_eb03b1();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.msl
index 886467f..2079dc6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_eb03b1(texture2d_array<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_eb03b1(texture2d_array<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_eb03b1(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_eb03b1(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_eb03b1(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_eb03b1(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_eb03b1(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_eb03b1(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.spvasm
index 4bfa443..d38a788 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_eb03b1 "textureDimensions_eb03b1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 1 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 1 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_eb03b1 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %24 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %24
-         %21 = OpVectorShuffle %v2uint %22 %22 0 1
-               OpStore %res %21
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_eb03b1 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %26 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %26
+         %23 = OpVectorShuffle %v2uint %24 %24 0 1
+               OpStore %res %23
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_eb03b1
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_eb03b1
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_eb03b1
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_eb03b1
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_eb03b1
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_eb03b1
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.wgsl
index 732d9bc..8bb7abe 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb03b1.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16float, write>;
 
-fn textureDimensions_eb03b1() {
+fn textureDimensions_eb03b1() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb03b1();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb03b1();
+  prevent_dce = textureDimensions_eb03b1();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb03b1();
+  prevent_dce = textureDimensions_eb03b1();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb03b1();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl
index 442e10c..c002f88 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8unorm, read_write>) -> vec2<u32>
-fn textureDimensions_eb10d6() {
+fn textureDimensions_eb10d6() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb10d6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb10d6();
+  prevent_dce = textureDimensions_eb10d6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb10d6();
+  prevent_dce = textureDimensions_eb10d6();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb10d6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.dxc.hlsl
index 37b35b7..24ad66d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb10d6() {
+uint2 textureDimensions_eb10d6() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb10d6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb10d6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb10d6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb10d6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb10d6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb10d6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.fxc.hlsl
index 37b35b7..24ad66d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb10d6() {
+uint2 textureDimensions_eb10d6() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb10d6();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb10d6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb10d6()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb10d6();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb10d6()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb10d6();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.glsl
index 0a19db6..f76502e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_eb10d6() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_eb10d6();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_eb10d6() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eb10d6() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_eb10d6();
+  prevent_dce.inner = textureDimensions_eb10d6();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_eb10d6() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eb10d6() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_eb10d6();
+  prevent_dce.inner = textureDimensions_eb10d6();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_eb10d6() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_eb10d6();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.msl
index 93afdca..cddca18 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_eb10d6(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_eb10d6(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_eb10d6(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_eb10d6(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_eb10d6(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_eb10d6(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_eb10d6(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_eb10d6(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.spvasm
index 34a5380..5223a36 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_eb10d6 "textureDimensions_eb10d6"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_eb10d6 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_eb10d6 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_eb10d6
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_eb10d6
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_eb10d6
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_eb10d6
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_eb10d6
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_eb10d6
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.wgsl
index 1f0f893..a251da3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb10d6.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8unorm, read_write>;
 
-fn textureDimensions_eb10d6() {
+fn textureDimensions_eb10d6() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb10d6();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb10d6();
+  prevent_dce = textureDimensions_eb10d6();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb10d6();
+  prevent_dce = textureDimensions_eb10d6();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb10d6();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl
index 95ec2cb..eec8e7d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32uint, read_write>) -> u32
-fn textureDimensions_eb1249() {
+fn textureDimensions_eb1249() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb1249();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb1249();
+  prevent_dce = textureDimensions_eb1249();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb1249();
+  prevent_dce = textureDimensions_eb1249();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb1249();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.dxc.hlsl
index 71b7678..3734b2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb1249() {
+uint textureDimensions_eb1249() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb1249();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb1249();
+  prevent_dce.Store(0u, asuint(textureDimensions_eb1249()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb1249();
+  prevent_dce.Store(0u, asuint(textureDimensions_eb1249()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb1249();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.fxc.hlsl
index 71b7678..3734b2a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb1249() {
+uint textureDimensions_eb1249() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb1249();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb1249();
+  prevent_dce.Store(0u, asuint(textureDimensions_eb1249()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb1249();
+  prevent_dce.Store(0u, asuint(textureDimensions_eb1249()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb1249();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.glsl
index 09c384b..c852d5e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_eb1249() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_eb1249();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_eb1249() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_eb1249() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_eb1249();
+  prevent_dce.inner = textureDimensions_eb1249();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_eb1249() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_eb1249() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_eb1249();
+  prevent_dce.inner = textureDimensions_eb1249();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba32ui) uniform highp writeonly uimage2D arg_0;
+uint textureDimensions_eb1249() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_eb1249();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.msl
index e1ea926..ca47e26 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_eb1249(texture1d<uint, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_eb1249(texture1d<uint, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_eb1249(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_eb1249(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_eb1249(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_eb1249(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_eb1249(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_eb1249(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.spvasm
index 6026b3f..ad61032 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_eb1249 "textureDimensions_eb1249"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 1D 0 0 0 2 Rgba32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %uint 1D 0 0 0 2 Rgba32ui
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_eb1249 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_eb1249 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_eb1249
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_eb1249
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_eb1249
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_eb1249
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_eb1249
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_eb1249
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.wgsl
index 787b651..4247ed2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb1249.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32uint, read_write>;
 
-fn textureDimensions_eb1249() {
+fn textureDimensions_eb1249() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb1249();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb1249();
+  prevent_dce = textureDimensions_eb1249();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb1249();
+  prevent_dce = textureDimensions_eb1249();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb1249();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl
index c824a0e..2398413 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8sint, read_write>) -> vec2<u32>
-fn textureDimensions_eb9f4d() {
+fn textureDimensions_eb9f4d() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb9f4d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce = textureDimensions_eb9f4d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce = textureDimensions_eb9f4d();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb9f4d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.dxc.hlsl
index f94b0c4..53bf1e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb9f4d() {
+uint2 textureDimensions_eb9f4d() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb9f4d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb9f4d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb9f4d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb9f4d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.fxc.hlsl
index f94b0c4..53bf1e9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2DArray<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_eb9f4d() {
+uint2 textureDimensions_eb9f4d() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_eb9f4d();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb9f4d()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce.Store2(0u, asuint(textureDimensions_eb9f4d()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_eb9f4d();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.glsl
index 5351abe5..81bb09d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_eb9f4d() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_eb9f4d();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_eb9f4d() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eb9f4d() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce.inner = textureDimensions_eb9f4d();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_eb9f4d() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_eb9f4d() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce.inner = textureDimensions_eb9f4d();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8i) uniform highp writeonly iimage2DArray arg_0;
+uvec2 textureDimensions_eb9f4d() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_eb9f4d();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.msl
index dc5eb99..da7cdc1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_eb9f4d(texture2d_array<int, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_eb9f4d(texture2d_array<int, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_eb9f4d(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_eb9f4d(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_eb9f4d(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_eb9f4d(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_eb9f4d(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_eb9f4d(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.spvasm
index 48d49c7..8156166 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,75 +20,102 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_eb9f4d "textureDimensions_eb9f4d"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba8i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba8i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_eb9f4d = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_eb9f4d = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_eb9f4d
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_eb9f4d
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_eb9f4d
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_eb9f4d
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_eb9f4d
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_eb9f4d
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.wgsl
index 6a1b9fc..feb6a98 100644
--- a/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/eb9f4d.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8sint, read_write>;
 
-fn textureDimensions_eb9f4d() {
+fn textureDimensions_eb9f4d() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_eb9f4d();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce = textureDimensions_eb9f4d();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_eb9f4d();
+  prevent_dce = textureDimensions_eb9f4d();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_eb9f4d();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl
index cf4fd88..d06574b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32uint, read_write>) -> vec2<u32>
-fn textureDimensions_ed1030() {
+fn textureDimensions_ed1030() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ed1030();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ed1030();
+  prevent_dce = textureDimensions_ed1030();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ed1030();
+  prevent_dce = textureDimensions_ed1030();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ed1030();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.dxc.hlsl
index 4900e7e..ca87f4c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ed1030() {
+uint2 textureDimensions_ed1030() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ed1030();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ed1030();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ed1030()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ed1030();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ed1030()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ed1030();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.fxc.hlsl
index 4900e7e..ca87f4c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<uint4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ed1030() {
+uint2 textureDimensions_ed1030() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ed1030();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ed1030();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ed1030()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ed1030();
+  prevent_dce.Store2(0u, asuint(textureDimensions_ed1030()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ed1030();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.glsl
index d3723d1..39e64af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(r32ui) uniform highp uimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_ed1030() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_ed1030();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32ui) uniform highp uimage2D arg_0;
+uvec2 textureDimensions_ed1030() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_ed1030() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_ed1030();
+  prevent_dce.inner = textureDimensions_ed1030();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(r32ui) uniform highp uimage2D arg_0;
+uvec2 textureDimensions_ed1030() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_ed1030() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_ed1030();
+  prevent_dce.inner = textureDimensions_ed1030();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(r32ui) uniform highp uimage2D arg_0;
+uvec2 textureDimensions_ed1030() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_ed1030();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.msl
index 6afb545..619678a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ed1030(texture2d<uint, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_ed1030(texture2d<uint, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_ed1030(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_ed1030(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_ed1030(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<uint, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ed1030(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<uint, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ed1030(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<uint, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ed1030(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.spvasm
index fdbfec6..ef9707d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ed1030 "textureDimensions_ed1030"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
-         %11 = OpTypeImage %uint 2D 0 0 0 2 R32ui
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %uint 2D 0 0 0 2 R32ui
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ed1030 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_ed1030 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_ed1030
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_ed1030
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_ed1030
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_ed1030
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_ed1030
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_ed1030
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.wgsl
index 3587f3b..9a57ad5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ed1030.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<r32uint, read_write>;
 
-fn textureDimensions_ed1030() {
+fn textureDimensions_ed1030() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ed1030();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ed1030();
+  prevent_dce = textureDimensions_ed1030();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ed1030();
+  prevent_dce = textureDimensions_ed1030();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ed1030();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl
index 0e9720b..6ea2588 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32sint, write>) -> vec3<u32>
-fn textureDimensions_ef2e58() {
+fn textureDimensions_ef2e58() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ef2e58();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ef2e58();
+  prevent_dce = textureDimensions_ef2e58();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ef2e58();
+  prevent_dce = textureDimensions_ef2e58();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ef2e58();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.dxc.hlsl
index 012a126..1241c23 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ef2e58() {
+uint3 textureDimensions_ef2e58() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ef2e58();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ef2e58();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ef2e58()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ef2e58();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ef2e58()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ef2e58();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.fxc.hlsl
index 012a126..1241c23 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_ef2e58() {
+uint3 textureDimensions_ef2e58() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_ef2e58();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_ef2e58();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ef2e58()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_ef2e58();
+  prevent_dce.Store3(0u, asuint(textureDimensions_ef2e58()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_ef2e58();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.glsl
index 8b48cf4..bcdf801 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(r32i) uniform highp writeonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_ef2e58() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_ef2e58();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(r32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_ef2e58() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_ef2e58() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_ef2e58();
+  prevent_dce.inner = textureDimensions_ef2e58();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(r32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_ef2e58() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_ef2e58() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_ef2e58();
+  prevent_dce.inner = textureDimensions_ef2e58();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(r32i) uniform highp writeonly iimage3D arg_0;
+uvec3 textureDimensions_ef2e58() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_ef2e58();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.msl
index 09677c6..52cb001 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_ef2e58(texture3d<int, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_ef2e58(texture3d<int, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_ef2e58(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_ef2e58(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_ef2e58(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_ef2e58(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_ef2e58(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_ef2e58(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.spvasm
index e69946b..316a268 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_ef2e58 "textureDimensions_ef2e58"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 R32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 R32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_ef2e58 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_ef2e58 = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_ef2e58
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_ef2e58
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_ef2e58
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_ef2e58
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_ef2e58
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_ef2e58
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.wgsl
index a7b24c8..ddf01c4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ef2e58.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<r32sint, write>;
 
-fn textureDimensions_ef2e58() {
+fn textureDimensions_ef2e58() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ef2e58();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_ef2e58();
+  prevent_dce = textureDimensions_ef2e58();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_ef2e58();
+  prevent_dce = textureDimensions_ef2e58();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_ef2e58();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl
index a1f8711..b411aef 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_1d<f32>;
 
 // fn textureDimensions(texture: texture_1d<f32>, level: i32) -> u32
-fn textureDimensions_f17acd() {
+fn textureDimensions_f17acd() -> u32{
   var arg_1 = 1i;
   var res: u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f17acd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f17acd();
+  prevent_dce = textureDimensions_f17acd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f17acd();
+  prevent_dce = textureDimensions_f17acd();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f17acd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.dxc.hlsl
index 2caebba..4265ae5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f17acd() {
+uint textureDimensions_f17acd() {
   int arg_1 = 1;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f17acd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f17acd();
+  prevent_dce.Store(0u, asuint(textureDimensions_f17acd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f17acd();
+  prevent_dce.Store(0u, asuint(textureDimensions_f17acd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f17acd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.fxc.hlsl
index 2caebba..4265ae5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f17acd() {
+uint textureDimensions_f17acd() {
   int arg_1 = 1;
   uint2 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y);
   uint res = tint_tmp.x;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f17acd();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f17acd();
+  prevent_dce.Store(0u, asuint(textureDimensions_f17acd()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f17acd();
+  prevent_dce.Store(0u, asuint(textureDimensions_f17acd()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f17acd();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.glsl
index fe185d3..3c12608 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp sampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_f17acd() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f17acd();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp sampler2D arg_0_1;
+uint textureDimensions_f17acd() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_f17acd() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f17acd();
+  prevent_dce.inner = textureDimensions_f17acd();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp sampler2D arg_0_1;
+uint textureDimensions_f17acd() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_f17acd() {
-  int arg_1 = 1;
-  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f17acd();
+  prevent_dce.inner = textureDimensions_f17acd();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+uniform highp sampler2D arg_0_1;
+uint textureDimensions_f17acd() {
+  int arg_1 = 1;
+  uint res = uvec2(textureSize(arg_0_1, arg_1)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f17acd();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.msl
index 5e0a76a..538f74e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f17acd(texture1d<float, access::sample> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_f17acd(texture1d<float, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f17acd(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f17acd(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::sample> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_f17acd(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f17acd(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::sample> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::sample> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f17acd(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::sample> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f17acd(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.spvasm
index ac7c54d..778f081 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 49
+; Bound: 64
 ; Schema: 0
                OpCapability Shader
                OpCapability Sampled1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,78 +22,105 @@
                OpName %textureDimensions_f17acd "textureDimensions_f17acd"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 1 Unknown
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
         %int = OpTypeInt 32 1
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %24 = OpConstantNull %int
+         %26 = OpConstantNull %int
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %30 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %35 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %45 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %51 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f17acd = OpFunction %void None %16
-         %19 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %24
-        %res = OpVariable %_ptr_Function_uint Function %30
+%textureDimensions_f17acd = OpFunction %uint None %19
+         %21 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %26
+        %res = OpVariable %_ptr_Function_uint Function %9
                OpStore %arg_1 %int_1
-         %26 = OpLoad %11 %arg_0
-         %27 = OpLoad %int %arg_1
-         %25 = OpImageQuerySizeLod %uint %26 %27
-               OpStore %res %25
-         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %34 = OpLoad %uint %res
-               OpStore %33 %34
+         %28 = OpLoad %15 %arg_0
+         %29 = OpLoad %int %arg_1
+         %27 = OpImageQuerySizeLod %uint %28 %29
+               OpStore %res %27
+         %32 = OpLoad %uint %res
+               OpReturnValue %32
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %33
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %uint %textureDimensions_f17acd
+               OpStore %39 %40
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %35
-         %37 = OpLabel
-         %38 = OpFunctionCall %void %textureDimensions_f17acd
-               OpReturnValue %5
+%compute_main = OpFunction %void None %33
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %44 = OpFunctionCall %uint %textureDimensions_f17acd
+               OpStore %43 %44
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %40 = OpLabel
-         %41 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %41
+%vertex_main_inner = OpFunction %VertexOutput None %45
+         %48 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %51
+         %53 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %53 %5
+         %55 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %56 = OpFunctionCall %uint %textureDimensions_f17acd
+               OpStore %55 %56
+         %57 = OpLoad %VertexOutput %out
+               OpReturnValue %57
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %33
+         %59 = OpLabel
+         %60 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %61 = OpCompositeExtract %v4float %60 0
+               OpStore %pos_1 %61
+         %62 = OpCompositeExtract %uint %60 1
+               OpStore %prevent_dce_1 %62
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_f17acd
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_f17acd
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.wgsl
index 7bfcc17..22e8acd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f17acd.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
-fn textureDimensions_f17acd() {
+fn textureDimensions_f17acd() -> u32 {
   var arg_1 = 1i;
   var res : u32 = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f17acd();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f17acd();
+  prevent_dce = textureDimensions_f17acd();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f17acd();
+  prevent_dce = textureDimensions_f17acd();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f17acd();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl
index 5cacb1c..66326fd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32sint, write>) -> u32
-fn textureDimensions_f264a3() {
+fn textureDimensions_f264a3() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f264a3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f264a3();
+  prevent_dce = textureDimensions_f264a3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f264a3();
+  prevent_dce = textureDimensions_f264a3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f264a3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.dxc.hlsl
index c9a1ccf..d1be7bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f264a3() {
+uint textureDimensions_f264a3() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f264a3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f264a3();
+  prevent_dce.Store(0u, asuint(textureDimensions_f264a3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f264a3();
+  prevent_dce.Store(0u, asuint(textureDimensions_f264a3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f264a3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.fxc.hlsl
index c9a1ccf..d1be7bb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<int4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f264a3() {
+uint textureDimensions_f264a3() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f264a3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f264a3();
+  prevent_dce.Store(0u, asuint(textureDimensions_f264a3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f264a3();
+  prevent_dce.Store(0u, asuint(textureDimensions_f264a3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f264a3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.msl
index 66395ba..a9a22cd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f264a3(texture1d<int, access::write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_f264a3(texture1d<int, access::write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<int, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f264a3(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<int, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f264a3(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_f264a3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<int, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f264a3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<int, access::write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f264a3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<int, access::write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f264a3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.spvasm
index d21be41..1feac33 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,73 +22,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f264a3 "textureDimensions_f264a3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 1D 0 0 0 2 Rg32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+        %int = OpTypeInt 32 1
+         %15 = OpTypeImage %int 1D 0 0 0 2 Rg32i
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %25 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f264a3 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %29 = OpLoad %uint %res
-               OpStore %28 %29
+%textureDimensions_f264a3 = OpFunction %uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %24 = OpLoad %15 %arg_0
+         %23 = OpImageQuerySize %uint %24
+               OpStore %res %23
+         %27 = OpLoad %uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %uint %textureDimensions_f264a3
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_f264a3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %uint %textureDimensions_f264a3
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %51 = OpFunctionCall %uint %textureDimensions_f264a3
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_f264a3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_f264a3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.wgsl
index efdfa1a..f8075cf 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f264a3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rg32sint, write>;
 
-fn textureDimensions_f264a3() {
+fn textureDimensions_f264a3() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f264a3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f264a3();
+  prevent_dce = textureDimensions_f264a3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f264a3();
+  prevent_dce = textureDimensions_f264a3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f264a3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl
index d42dd19..846a821 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16float, write>) -> vec3<u32>
-fn textureDimensions_f3a2ac() {
+fn textureDimensions_f3a2ac() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f3a2ac();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce = textureDimensions_f3a2ac();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce = textureDimensions_f3a2ac();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f3a2ac();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.dxc.hlsl
index 302bb1a..f5a5f92 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f3a2ac() {
+uint3 textureDimensions_f3a2ac() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f3a2ac();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f3a2ac()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f3a2ac()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f3a2ac();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.fxc.hlsl
index 302bb1a..f5a5f92 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f3a2ac() {
+uint3 textureDimensions_f3a2ac() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f3a2ac();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f3a2ac()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f3a2ac()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f3a2ac();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.glsl
index e85f238..b73f64e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba16f) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_f3a2ac() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f3a2ac();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba16f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f3a2ac() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f3a2ac() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce.inner = textureDimensions_f3a2ac();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba16f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f3a2ac() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f3a2ac() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce.inner = textureDimensions_f3a2ac();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba16f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f3a2ac() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f3a2ac();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.msl
index ddf78bf..666d861 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f3a2ac(texture3d<float, access::write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_f3a2ac(texture3d<float, access::write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_f3a2ac(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_f3a2ac(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_f3a2ac(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f3a2ac(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f3a2ac(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f3a2ac(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.spvasm
index 6fd2002..9f226b3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f3a2ac "textureDimensions_f3a2ac"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba16f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba16f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f3a2ac = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_f3a2ac = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_f3a2ac
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_f3a2ac
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_f3a2ac
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_f3a2ac
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_f3a2ac
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_f3a2ac
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.wgsl
index f0ff0e5..cef2c19e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f3a2ac.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16float, write>;
 
-fn textureDimensions_f3a2ac() {
+fn textureDimensions_f3a2ac() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f3a2ac();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce = textureDimensions_f3a2ac();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f3a2ac();
+  prevent_dce = textureDimensions_f3a2ac();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f3a2ac();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl
index 3256316..6f0a2b3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8unorm, read_write>) -> u32
-fn textureDimensions_f406ff() {
+fn textureDimensions_f406ff() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f406ff();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f406ff();
+  prevent_dce = textureDimensions_f406ff();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f406ff();
+  prevent_dce = textureDimensions_f406ff();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f406ff();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.dxc.hlsl
index 2e40d76..5b192f9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f406ff() {
+uint textureDimensions_f406ff() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f406ff();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f406ff();
+  prevent_dce.Store(0u, asuint(textureDimensions_f406ff()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f406ff();
+  prevent_dce.Store(0u, asuint(textureDimensions_f406ff()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f406ff();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.fxc.hlsl
index 2e40d76..5b192f9 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture1D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f406ff() {
+uint textureDimensions_f406ff() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f406ff();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f406ff();
+  prevent_dce.Store(0u, asuint(textureDimensions_f406ff()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f406ff();
+  prevent_dce.Store(0u, asuint(textureDimensions_f406ff()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f406ff();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.glsl
index 3c7f5f1..73ef73f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uint inner;
-} prevent_dce;
-
-void textureDimensions_f406ff() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f406ff();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_f406ff() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_f406ff() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f406ff();
+  prevent_dce.inner = textureDimensions_f406ff();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_f406ff() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uint inner;
 } prevent_dce;
 
-void textureDimensions_f406ff() {
-  uint res = uvec2(imageSize(arg_0)).x;
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f406ff();
+  prevent_dce.inner = textureDimensions_f406ff();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uint prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uint textureDimensions_f406ff() {
+  uint res = uvec2(imageSize(arg_0)).x;
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f406ff();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.msl
index 96a6b56..f1000bc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f406ff(texture1d<float, access::read_write> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_f406ff(texture1d<float, access::read_write> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f406ff(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f406ff(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read_write> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_f406ff(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f406ff(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f406ff(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f406ff(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.spvasm
index cedb5d8..3478e1a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,71 +21,98 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f406ff "textureDimensions_f406ff"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f406ff = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_f406ff = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_f406ff
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_f406ff
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_f406ff
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_f406ff
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_f406ff
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_f406ff
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.wgsl
index 28d6876..499d03d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f406ff.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8unorm, read_write>;
 
-fn textureDimensions_f406ff() {
+fn textureDimensions_f406ff() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f406ff();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f406ff();
+  prevent_dce = textureDimensions_f406ff();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f406ff();
+  prevent_dce = textureDimensions_f406ff();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f406ff();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl
index 36a8c18..0056919 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32sint, read>) -> vec3<u32>
-fn textureDimensions_f4321c() {
+fn textureDimensions_f4321c() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f4321c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f4321c();
+  prevent_dce = textureDimensions_f4321c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f4321c();
+  prevent_dce = textureDimensions_f4321c();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f4321c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.dxc.hlsl
index b6f6290..29bcef3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f4321c() {
+uint3 textureDimensions_f4321c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f4321c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f4321c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f4321c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f4321c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f4321c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f4321c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.fxc.hlsl
index b6f6290..29bcef3 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture3D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f4321c() {
+uint3 textureDimensions_f4321c() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f4321c();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f4321c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f4321c()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f4321c();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f4321c()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f4321c();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.glsl
index 75d2b03..b569bca 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32i) uniform highp readonly iimage3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_f4321c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f4321c();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_f4321c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f4321c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f4321c();
+  prevent_dce.inner = textureDimensions_f4321c();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_f4321c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f4321c() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f4321c();
+  prevent_dce.inner = textureDimensions_f4321c();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32i) uniform highp readonly iimage3D arg_0;
+uvec3 textureDimensions_f4321c() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f4321c();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.msl
index 4bb01b2..1c4c5b2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f4321c(texture3d<int, access::read> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_f4321c(texture3d<int, access::read> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_f4321c(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_f4321c(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<int, access::read> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_f4321c(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f4321c(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<int, access::read> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f4321c(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<int, access::read> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f4321c(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.spvasm
index d380b8d..885df1b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f4321c "textureDimensions_f4321c"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 3D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 3D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %26 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f4321c = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v3uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %30 = OpLoad %v3uint %res
-               OpStore %29 %30
+%textureDimensions_f4321c = OpFunction %v3uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v3uint %25
+               OpStore %res %24
+         %28 = OpLoad %v3uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v3uint %textureDimensions_f4321c
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_f4321c
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v3uint %textureDimensions_f4321c
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %52 = OpFunctionCall %v3uint %textureDimensions_f4321c
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v3uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_f4321c
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_f4321c
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.wgsl
index d142023..b8f0b9b 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4321c.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32sint, read>;
 
-fn textureDimensions_f4321c() {
+fn textureDimensions_f4321c() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f4321c();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f4321c();
+  prevent_dce = textureDimensions_f4321c();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f4321c();
+  prevent_dce = textureDimensions_f4321c();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f4321c();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl
index 2f7e86f..e06b477 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32sint, read>) -> vec2<u32>
-fn textureDimensions_f48886() {
+fn textureDimensions_f48886() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f48886();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f48886();
+  prevent_dce = textureDimensions_f48886();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f48886();
+  prevent_dce = textureDimensions_f48886();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f48886();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.dxc.hlsl
index 592dd64..b9f9b60 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f48886() {
+uint2 textureDimensions_f48886() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f48886();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f48886();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f48886()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f48886();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f48886()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f48886();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.fxc.hlsl
index 592dd64..b9f9b60 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f48886() {
+uint2 textureDimensions_f48886() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f48886();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f48886();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f48886()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f48886();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f48886()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f48886();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.glsl
index 862fd59..e19d416 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp readonly iimage2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_f48886() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f48886();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_f48886() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f48886() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f48886();
+  prevent_dce.inner = textureDimensions_f48886();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_f48886() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f48886() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f48886();
+  prevent_dce.inner = textureDimensions_f48886();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32i) uniform highp readonly iimage2D arg_0;
+uvec2 textureDimensions_f48886() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f48886();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.msl
index c83049a..6f03232 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f48886(texture2d<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_f48886(texture2d<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f48886(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f48886(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_f48886(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f48886(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f48886(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f48886(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.spvasm
index bf126b2..1cd24ce 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 45
+; Bound: 60
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f48886 "textureDimensions_f48886"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %26 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %31 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %41 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %47 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f48886 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %26
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySize %v2uint %23
-               OpStore %res %22
-         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %30 = OpLoad %v2uint %res
-               OpStore %29 %30
+%textureDimensions_f48886 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySize %v2uint %25
+               OpStore %res %24
+         %28 = OpLoad %v2uint %res
+               OpReturnValue %28
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %29
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %36 = OpFunctionCall %v2uint %textureDimensions_f48886
+               OpStore %35 %36
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %31
-         %33 = OpLabel
-         %34 = OpFunctionCall %void %textureDimensions_f48886
-               OpReturnValue %5
+%compute_main = OpFunction %void None %29
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %40 = OpFunctionCall %v2uint %textureDimensions_f48886
+               OpStore %39 %40
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %36 = OpLabel
-         %37 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %37
+%vertex_main_inner = OpFunction %VertexOutput None %41
+         %44 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %47
+         %49 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %49 %5
+         %51 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %52 = OpFunctionCall %v2uint %textureDimensions_f48886
+               OpStore %51 %52
+         %53 = OpLoad %VertexOutput %out
+               OpReturnValue %53
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %29
+         %55 = OpLabel
+         %56 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %57 = OpCompositeExtract %v4float %56 0
+               OpStore %pos_1 %57
+         %58 = OpCompositeExtract %v2uint %56 1
+               OpStore %prevent_dce_1 %58
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_f48886
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %void %textureDimensions_f48886
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.wgsl
index a42d17e..a7612b4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f48886.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32sint, read>;
 
-fn textureDimensions_f48886() {
+fn textureDimensions_f48886() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f48886();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f48886();
+  prevent_dce = textureDimensions_f48886();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f48886();
+  prevent_dce = textureDimensions_f48886();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f48886();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl
index 5a853a9..a2926f7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32float, write>) -> vec2<u32>
-fn textureDimensions_f4e469() {
+fn textureDimensions_f4e469() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f4e469();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f4e469();
+  prevent_dce = textureDimensions_f4e469();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f4e469();
+  prevent_dce = textureDimensions_f4e469();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f4e469();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.dxc.hlsl
index b82794c..ef2c13e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f4e469() {
+uint2 textureDimensions_f4e469() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f4e469();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f4e469();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f4e469()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f4e469();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f4e469()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f4e469();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.fxc.hlsl
index b82794c..ef2c13e 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f4e469() {
+uint2 textureDimensions_f4e469() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f4e469();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f4e469();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f4e469()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f4e469();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f4e469()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f4e469();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.glsl
index f959265..593a21c 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_f4e469() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f4e469();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_f4e469() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f4e469() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f4e469();
+  prevent_dce.inner = textureDimensions_f4e469();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_f4e469() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f4e469() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f4e469();
+  prevent_dce.inner = textureDimensions_f4e469();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_f4e469() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f4e469();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.msl
index 2e79cec..4ad77e1 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f4e469(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_f4e469(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f4e469(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f4e469(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_f4e469(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f4e469(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f4e469(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f4e469(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.spvasm
index e5009f6..362d6b6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f4e469 "textureDimensions_f4e469"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f4e469 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_f4e469 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_f4e469
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_f4e469
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_f4e469
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_f4e469
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_f4e469
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_f4e469
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.wgsl
index c1d15a0..1f9d68a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f4e469.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32float, write>;
 
-fn textureDimensions_f4e469() {
+fn textureDimensions_f4e469() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f4e469();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f4e469();
+  prevent_dce = textureDimensions_f4e469();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f4e469();
+  prevent_dce = textureDimensions_f4e469();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f4e469();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl
index 6cad56a..4f9e3dd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8snorm, read_write>) -> vec3<u32>
-fn textureDimensions_f55a94() {
+fn textureDimensions_f55a94() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f55a94();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f55a94();
+  prevent_dce = textureDimensions_f55a94();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f55a94();
+  prevent_dce = textureDimensions_f55a94();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f55a94();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.dxc.hlsl
index e52619e..b40b0c2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f55a94() {
+uint3 textureDimensions_f55a94() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f55a94();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f55a94();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f55a94()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f55a94();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f55a94()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f55a94();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.fxc.hlsl
index e52619e..b40b0c2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f55a94() {
+uint3 textureDimensions_f55a94() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f55a94();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f55a94();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f55a94()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f55a94();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f55a94()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f55a94();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.glsl
index 45cb45d..2996970 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_f55a94() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f55a94();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f55a94() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f55a94() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f55a94();
+  prevent_dce.inner = textureDimensions_f55a94();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f55a94() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f55a94() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f55a94();
+  prevent_dce.inner = textureDimensions_f55a94();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba8_snorm) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f55a94() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f55a94();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.msl
index 61c2620..891c6ac 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f55a94(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_f55a94(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_f55a94(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_f55a94(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_f55a94(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f55a94(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f55a94(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f55a94(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.spvasm
index 7c055f4..75c6a6f 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f55a94 "textureDimensions_f55a94"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba8Snorm
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba8Snorm
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f55a94 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_f55a94 = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_f55a94
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_f55a94
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_f55a94
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_f55a94
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_f55a94
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_f55a94
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.wgsl
index 6a7891d..f75ba84 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f55a94.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8snorm, read_write>;
 
-fn textureDimensions_f55a94() {
+fn textureDimensions_f55a94() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f55a94();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f55a94();
+  prevent_dce = textureDimensions_f55a94();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f55a94();
+  prevent_dce = textureDimensions_f55a94();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f55a94();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl
index d8714dd..70043fb 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_cube<i32>;
 
 // fn textureDimensions(texture: texture_cube<i32>) -> vec2<u32>
-fn textureDimensions_f626b3() {
+fn textureDimensions_f626b3() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f626b3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f626b3();
+  prevent_dce = textureDimensions_f626b3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f626b3();
+  prevent_dce = textureDimensions_f626b3();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f626b3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.dxc.hlsl
index 7f75553..3839781 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f626b3() {
+uint2 textureDimensions_f626b3() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f626b3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f626b3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f626b3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f626b3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f626b3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f626b3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.fxc.hlsl
index 7f75553..3839781 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 TextureCube<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f626b3() {
+uint2 textureDimensions_f626b3() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f626b3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f626b3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f626b3()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f626b3();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f626b3()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f626b3();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.glsl
index d5787af..b1cd522 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp isamplerCube arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_f626b3() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f626b3();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_f626b3() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f626b3() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f626b3();
+  prevent_dce.inner = textureDimensions_f626b3();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_f626b3() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f626b3() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f626b3();
+  prevent_dce.inner = textureDimensions_f626b3();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isamplerCube arg_0_1;
+uvec2 textureDimensions_f626b3() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f626b3();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.msl
index fd4a2d3..0698add 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f626b3(texturecube<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_f626b3(texturecube<int, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texturecube<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f626b3(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texturecube<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f626b3(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texturecube<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_f626b3(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texturecube<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f626b3(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texturecube<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texturecube<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texturecube<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f626b3(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texturecube<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f626b3(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.spvasm
index cc01fdd..543a932 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f626b3 "textureDimensions_f626b3"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int Cube 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int Cube 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f626b3 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v2uint %23 %int_0
-               OpStore %res %22
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_f626b3 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v2uint %25 %int_0
+               OpStore %res %24
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_f626b3
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_f626b3
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_f626b3
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_f626b3
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_f626b3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_f626b3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.wgsl
index b0a3fae..c27b05a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f626b3.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_cube<i32>;
 
-fn textureDimensions_f626b3() {
+fn textureDimensions_f626b3() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f626b3();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f626b3();
+  prevent_dce = textureDimensions_f626b3();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f626b3();
+  prevent_dce = textureDimensions_f626b3();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f626b3();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl
index f788227..2963e50 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, read>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32sint, read>) -> vec2<u32>
-fn textureDimensions_f7bac5() {
+fn textureDimensions_f7bac5() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f7bac5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f7bac5();
+  prevent_dce = textureDimensions_f7bac5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f7bac5();
+  prevent_dce = textureDimensions_f7bac5();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f7bac5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.dxc.hlsl
index 5beff36..c79f113 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f7bac5() {
+uint2 textureDimensions_f7bac5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f7bac5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f7bac5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f7bac5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f7bac5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f7bac5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f7bac5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.fxc.hlsl
index 5beff36..c79f113 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f7bac5() {
+uint2 textureDimensions_f7bac5() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f7bac5();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f7bac5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f7bac5()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f7bac5();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f7bac5()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f7bac5();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.glsl
index 4fefbb8..90a50f2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba32i) uniform highp readonly iimage2DArray arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_f7bac5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f7bac5();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_f7bac5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f7bac5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f7bac5();
+  prevent_dce.inner = textureDimensions_f7bac5();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba32i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_f7bac5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f7bac5() {
-  uvec2 res = uvec2(imageSize(arg_0).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f7bac5();
+  prevent_dce.inner = textureDimensions_f7bac5();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba32i) uniform highp readonly iimage2DArray arg_0;
+uvec2 textureDimensions_f7bac5() {
+  uvec2 res = uvec2(imageSize(arg_0).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f7bac5();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.msl
index 62f5af6..22c8c7a 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f7bac5(texture2d_array<int, access::read> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_f7bac5(texture2d_array<int, access::read> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f7bac5(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f7bac5(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::read> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_f7bac5(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f7bac5(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::read> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f7bac5(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::read> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f7bac5(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.spvasm
index 4897baf..3fd04d6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 47
+; Bound: 62
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,76 +20,103 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f7bac5 "textureDimensions_f7bac5"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 2 Rgba32i
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 2 Rgba32i
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %28 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %33 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %43 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %49 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f7bac5 = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %28
-         %25 = OpLoad %11 %arg_0
-         %23 = OpImageQuerySize %v3uint %25
-         %22 = OpVectorShuffle %v2uint %23 %23 0 1
-               OpStore %res %22
-         %31 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %32 = OpLoad %v2uint %res
-               OpStore %31 %32
+%textureDimensions_f7bac5 = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %27 = OpLoad %16 %arg_0
+         %25 = OpImageQuerySize %v3uint %27
+         %24 = OpVectorShuffle %v2uint %25 %25 0 1
+               OpStore %res %24
+         %30 = OpLoad %v2uint %res
+               OpReturnValue %30
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %31
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %v2uint %textureDimensions_f7bac5
+               OpStore %37 %38
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %33
-         %35 = OpLabel
-         %36 = OpFunctionCall %void %textureDimensions_f7bac5
-               OpReturnValue %5
+%compute_main = OpFunction %void None %31
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %42 = OpFunctionCall %v2uint %textureDimensions_f7bac5
+               OpStore %41 %42
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %38 = OpLabel
-         %39 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %39
+%vertex_main_inner = OpFunction %VertexOutput None %43
+         %46 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %49
+         %51 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %51 %5
+         %53 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %54 = OpFunctionCall %v2uint %textureDimensions_f7bac5
+               OpStore %53 %54
+         %55 = OpLoad %VertexOutput %out
+               OpReturnValue %55
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %31
+         %57 = OpLabel
+         %58 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %59 = OpCompositeExtract %v4float %58 0
+               OpStore %pos_1 %59
+         %60 = OpCompositeExtract %v2uint %58 1
+               OpStore %prevent_dce_1 %60
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_f7bac5
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %45 = OpLabel
-         %46 = OpFunctionCall %void %textureDimensions_f7bac5
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.wgsl
index 7fed277..3447353 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f7bac5.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32sint, read>;
 
-fn textureDimensions_f7bac5() {
+fn textureDimensions_f7bac5() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f7bac5();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f7bac5();
+  prevent_dce = textureDimensions_f7bac5();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f7bac5();
+  prevent_dce = textureDimensions_f7bac5();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f7bac5();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl
index fedd00b..9c548f7 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_2d<i32>;
 
 // fn textureDimensions(texture: texture_2d<i32>) -> vec2<u32>
-fn textureDimensions_f8522e() {
+fn textureDimensions_f8522e() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f8522e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f8522e();
+  prevent_dce = textureDimensions_f8522e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f8522e();
+  prevent_dce = textureDimensions_f8522e();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f8522e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.dxc.hlsl
index 12fab86..1f65e99 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f8522e() {
+uint2 textureDimensions_f8522e() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f8522e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f8522e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f8522e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f8522e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f8522e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f8522e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.fxc.hlsl
index 12fab86..1f65e99 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture2D<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f8522e() {
+uint2 textureDimensions_f8522e() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f8522e();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f8522e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f8522e()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f8522e();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f8522e()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f8522e();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.glsl
index a90f6a4..06b22af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-uniform highp isampler2D arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_f8522e() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f8522e();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_f8522e() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f8522e() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f8522e();
+  prevent_dce.inner = textureDimensions_f8522e();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_f8522e() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_f8522e() {
-  uvec2 res = uvec2(textureSize(arg_0_1, 0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f8522e();
+  prevent_dce.inner = textureDimensions_f8522e();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isampler2D arg_0_1;
+uvec2 textureDimensions_f8522e() {
+  uvec2 res = uvec2(textureSize(arg_0_1, 0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f8522e();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.msl
index 30cefbb..f2ec7d8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f8522e(texture2d<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_f8522e(texture2d<int, access::sample> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f8522e(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f8522e(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_f8522e(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f8522e(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f8522e(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f8522e(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.spvasm
index b7c21ee..8c8c3af 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 46
+; Bound: 61
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,74 +20,101 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f8522e "textureDimensions_f8522e"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 0 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
       %int_0 = OpConstant %int 0
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %27 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %32 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %42 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %48 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f8522e = OpFunction %void None %18
-         %21 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %27
-         %23 = OpLoad %11 %arg_0
-         %22 = OpImageQuerySizeLod %v2uint %23 %int_0
-               OpStore %res %22
-         %30 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %31 = OpLoad %v2uint %res
-               OpStore %30 %31
+%textureDimensions_f8522e = OpFunction %v2uint None %21
+         %23 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %25 = OpLoad %16 %arg_0
+         %24 = OpImageQuerySizeLod %v2uint %25 %int_0
+               OpStore %res %24
+         %29 = OpLoad %v2uint %res
+               OpReturnValue %29
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %30
+         %33 = OpLabel
+         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %37 = OpFunctionCall %v2uint %textureDimensions_f8522e
+               OpStore %36 %37
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %32
-         %34 = OpLabel
-         %35 = OpFunctionCall %void %textureDimensions_f8522e
-               OpReturnValue %5
+%compute_main = OpFunction %void None %30
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %41 = OpFunctionCall %v2uint %textureDimensions_f8522e
+               OpStore %40 %41
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %37 = OpLabel
-         %38 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %38
+%vertex_main_inner = OpFunction %VertexOutput None %42
+         %45 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %48
+         %50 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %50 %5
+         %52 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %53 = OpFunctionCall %v2uint %textureDimensions_f8522e
+               OpStore %52 %53
+         %54 = OpLoad %VertexOutput %out
+               OpReturnValue %54
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %30
+         %56 = OpLabel
+         %57 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %58 = OpCompositeExtract %v4float %57 0
+               OpStore %pos_1 %58
+         %59 = OpCompositeExtract %v2uint %57 1
+               OpStore %prevent_dce_1 %59
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_f8522e
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %44 = OpLabel
-         %45 = OpFunctionCall %void %textureDimensions_f8522e
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.wgsl
index bc0a02f..e74a234 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f8522e.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_2d<i32>;
 
-fn textureDimensions_f8522e() {
+fn textureDimensions_f8522e() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f8522e();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f8522e();
+  prevent_dce = textureDimensions_f8522e();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f8522e();
+  prevent_dce = textureDimensions_f8522e();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f8522e();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl
index a7412ba..5f67c02 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32float, read_write>) -> vec3<u32>
-fn textureDimensions_f93ece() {
+fn textureDimensions_f93ece() -> vec3<u32>{
   var res: vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f93ece();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f93ece();
+  prevent_dce = textureDimensions_f93ece();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f93ece();
+  prevent_dce = textureDimensions_f93ece();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec3<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f93ece();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.dxc.hlsl
index 6a07e36..e1431dd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f93ece() {
+uint3 textureDimensions_f93ece() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f93ece();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f93ece();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f93ece()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f93ece();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f93ece()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f93ece();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.fxc.hlsl
index 6a07e36..e1431dd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture3D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f93ece() {
+uint3 textureDimensions_f93ece() {
   uint3 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y, tint_tmp.z);
   uint3 res = tint_tmp;
-  prevent_dce.Store3(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f93ece();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f93ece();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f93ece()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f93ece();
+  prevent_dce.Store3(0u, asuint(textureDimensions_f93ece()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint3 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f93ece();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.glsl
index 9431740..60f10ec 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-layout(rgba32f) uniform highp writeonly image3D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec3 inner;
-  uint pad;
-} prevent_dce;
-
-void textureDimensions_f93ece() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_f93ece();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f93ece() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f93ece() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_f93ece();
+  prevent_dce.inner = textureDimensions_f93ece();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 layout(rgba32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f93ece() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec3 inner;
   uint pad;
 } prevent_dce;
 
-void textureDimensions_f93ece() {
-  uvec3 res = uvec3(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_f93ece();
+  prevent_dce.inner = textureDimensions_f93ece();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec3 prevent_dce_1;
+layout(rgba32f) uniform highp writeonly image3D arg_0;
+uvec3 textureDimensions_f93ece() {
+  uvec3 res = uvec3(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec3 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec3(0u, 0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_f93ece();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.msl
index 310fc12..36eeb65 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f93ece(texture3d<float, access::read_write> tint_symbol_1, device packed_uint3* const tint_symbol_2) {
+uint3 textureDimensions_f93ece(texture3d<float, access::read_write> tint_symbol_1) {
   uint3 res = uint3(tint_symbol_1.get_width(), tint_symbol_1.get_height(), tint_symbol_1.get_depth());
-  *(tint_symbol_2) = packed_uint3(res);
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device packed_uint3* tint_symbol_2 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = packed_uint3(textureDimensions_f93ece(tint_symbol_3));
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_4 [[buffer(0)]], texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = packed_uint3(textureDimensions_f93ece(tint_symbol_5));
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint3 prevent_dce;
 };
 
-float4 vertex_main_inner(texture3d<float, access::read_write> tint_symbol_3, device packed_uint3* const tint_symbol_4) {
-  textureDimensions_f93ece(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint3 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture3d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f93ece(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_5 [[texture(0)]], device packed_uint3* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture3d<float, access::read_write> tint_symbol_7 [[texture(0)]], device packed_uint3* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f93ece(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture3d<float, access::read_write> tint_symbol_9 [[texture(0)]], device packed_uint3* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f93ece(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.spvasm
index 0d892aa..ce54533 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,72 +20,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f93ece "textureDimensions_f93ece"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 3D 0 0 0 2 Rgba32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v3uint = OpTypeVector %uint 3
+%_ptr_Output_v3uint = OpTypePointer Output %v3uint
+         %10 = OpConstantNull %v3uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v3uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 3D 0 0 0 2 Rgba32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v3uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v3uint
 %_ptr_Function_v3uint = OpTypePointer Function %v3uint
-         %25 = OpConstantNull %v3uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v3uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f93ece = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v3uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v3uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
-         %29 = OpLoad %v3uint %res
-               OpStore %28 %29
+%textureDimensions_f93ece = OpFunction %v3uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v3uint %24
+               OpStore %res %23
+         %27 = OpLoad %v3uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v3uint %textureDimensions_f93ece
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_f93ece
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v3uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v3uint %textureDimensions_f93ece
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v3uint %out %uint_1
+         %51 = OpFunctionCall %v3uint %textureDimensions_f93ece
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v3uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_f93ece
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_f93ece
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.wgsl
index 117d18c..478c081 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f93ece.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32float, read_write>;
 
-fn textureDimensions_f93ece() {
+fn textureDimensions_f93ece() -> vec3<u32> {
   var res : vec3<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f93ece();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f93ece();
+  prevent_dce = textureDimensions_f93ece();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f93ece();
+  prevent_dce = textureDimensions_f93ece();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec3<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f93ece();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl
index ec3c612..4c4c621 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, read_write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32float, read_write>) -> vec2<u32>
-fn textureDimensions_f94e55() {
+fn textureDimensions_f94e55() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f94e55();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f94e55();
+  prevent_dce = textureDimensions_f94e55();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f94e55();
+  prevent_dce = textureDimensions_f94e55();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f94e55();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.dxc.hlsl
index 78f14ef..88d75f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f94e55() {
+uint2 textureDimensions_f94e55() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f94e55();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f94e55();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f94e55()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f94e55();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f94e55()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f94e55();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.fxc.hlsl
index 78f14ef..88d75f0 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_f94e55() {
+uint2 textureDimensions_f94e55() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_f94e55();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_f94e55();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f94e55()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_f94e55();
+  prevent_dce.Store2(0u, asuint(textureDimensions_f94e55()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_f94e55();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.msl
index 4a9aa27..ad8856d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_f94e55(texture2d<float, access::read_write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_f94e55(texture2d<float, access::read_write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_f94e55(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_f94e55(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::read_write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_f94e55(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::read_write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_f94e55(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::read_write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_f94e55(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::read_write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_f94e55(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.spvasm
index 13b77db..795d6e5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.spvasm
@@ -1,18 +1,19 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,72 +21,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_f94e55 "textureDimensions_f94e55"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rg32f
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rg32f
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_f94e55 = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_f94e55 = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_f94e55
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_f94e55
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_f94e55
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_f94e55
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_f94e55
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_f94e55
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.wgsl
index 5428a00..ff56a80 100644
--- a/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/f94e55.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<rg32float, read_write>;
 
-fn textureDimensions_f94e55() {
+fn textureDimensions_f94e55() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f94e55();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_f94e55();
+  prevent_dce = textureDimensions_f94e55();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_f94e55();
+  prevent_dce = textureDimensions_f94e55();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_f94e55();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl
index adc80e7..7d263d8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl
@@ -37,24 +37,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_2d<bgra8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<bgra8unorm, write>) -> vec2<u32>
-fn textureDimensions_fbb15a() {
+fn textureDimensions_fbb15a() -> vec2<u32>{
   var res: vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fbb15a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_fbb15a();
+  prevent_dce = textureDimensions_fbb15a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_fbb15a();
+  prevent_dce = textureDimensions_fbb15a();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_fbb15a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.dxc.hlsl
index 6374012..1abecd5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_fbb15a() {
+uint2 textureDimensions_fbb15a() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_fbb15a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_fbb15a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fbb15a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_fbb15a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fbb15a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_fbb15a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.fxc.hlsl
index 6374012..1abecd5 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 RWTexture2D<float4> arg_0 : register(u0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_fbb15a() {
+uint2 textureDimensions_fbb15a() {
   uint2 tint_tmp;
   arg_0.GetDimensions(tint_tmp.x, tint_tmp.y);
   uint2 res = tint_tmp;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_fbb15a();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_fbb15a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fbb15a()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_fbb15a();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fbb15a()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_fbb15a();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.glsl
index b802aec..7d167ec 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.glsl
@@ -1,44 +1,24 @@
 #version 310 es
-
-layout(rgba8) uniform highp writeonly image2D arg_0;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_fbb15a() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_fbb15a();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_fbb15a() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_fbb15a() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_fbb15a();
+  prevent_dce.inner = textureDimensions_fbb15a();
 }
 
 void main() {
@@ -48,17 +28,22 @@
 #version 310 es
 
 layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_fbb15a() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_fbb15a() {
-  uvec2 res = uvec2(imageSize(arg_0));
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_fbb15a();
+  prevent_dce.inner = textureDimensions_fbb15a();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,3 +51,33 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+layout(rgba8) uniform highp writeonly image2D arg_0;
+uvec2 textureDimensions_fbb15a() {
+  uvec2 res = uvec2(imageSize(arg_0));
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_fbb15a();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.msl
index 1767300..88a7d6d 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_fbb15a(texture2d<float, access::write> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_fbb15a(texture2d<float, access::write> tint_symbol_1) {
   uint2 res = uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d<float, access::write> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_fbb15a(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d<float, access::write> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_fbb15a(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d<float, access::write> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_fbb15a(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d<float, access::write> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_fbb15a(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d<float, access::write> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_fbb15a(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d<float, access::write> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_fbb15a(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.spvasm
index c642386..5083941 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 44
+; Bound: 59
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -19,73 +20,100 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_fbb15a "textureDimensions_fbb15a"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonReadable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+         %16 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %17 = OpTypeFunction %void
+         %20 = OpTypeFunction %v2uint
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %25 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %30 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %40 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %46 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_fbb15a = OpFunction %void None %17
-         %20 = OpLabel
-        %res = OpVariable %_ptr_Function_v2uint Function %25
-         %22 = OpLoad %11 %arg_0
-         %21 = OpImageQuerySize %v2uint %22
-               OpStore %res %21
-         %28 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %29 = OpLoad %v2uint %res
-               OpStore %28 %29
+%textureDimensions_fbb15a = OpFunction %v2uint None %20
+         %22 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function %10
+         %24 = OpLoad %16 %arg_0
+         %23 = OpImageQuerySize %v2uint %24
+               OpStore %res %23
+         %27 = OpLoad %v2uint %res
+               OpReturnValue %27
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %28
+         %31 = OpLabel
+         %34 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %35 = OpFunctionCall %v2uint %textureDimensions_fbb15a
+               OpStore %34 %35
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %30
-         %32 = OpLabel
-         %33 = OpFunctionCall %void %textureDimensions_fbb15a
-               OpReturnValue %5
+%compute_main = OpFunction %void None %28
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %39 = OpFunctionCall %v2uint %textureDimensions_fbb15a
+               OpStore %38 %39
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %17
-         %35 = OpLabel
-         %36 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %36
+%vertex_main_inner = OpFunction %VertexOutput None %40
+         %43 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %46
+         %48 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %48 %5
+         %50 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %51 = OpFunctionCall %v2uint %textureDimensions_fbb15a
+               OpStore %50 %51
+         %52 = OpLoad %VertexOutput %out
+               OpReturnValue %52
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %28
+         %54 = OpLabel
+         %55 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %56 = OpCompositeExtract %v4float %55 0
+               OpStore %pos_1 %56
+         %57 = OpCompositeExtract %v2uint %55 1
+               OpStore %prevent_dce_1 %57
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %17
-         %39 = OpLabel
-         %40 = OpFunctionCall %void %textureDimensions_fbb15a
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %17
-         %42 = OpLabel
-         %43 = OpFunctionCall %void %textureDimensions_fbb15a
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.wgsl
index 038ae07..f68c163 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fbb15a.wgsl.expected.wgsl
@@ -1,24 +1,33 @@
 @group(1) @binding(0) var arg_0 : texture_storage_2d<bgra8unorm, write>;
 
-fn textureDimensions_fbb15a() {
+fn textureDimensions_fbb15a() -> vec2<u32> {
   var res : vec2<u32> = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fbb15a();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_fbb15a();
+  prevent_dce = textureDimensions_fbb15a();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_fbb15a();
+  prevent_dce = textureDimensions_fbb15a();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_fbb15a();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl
index c94b03f..a2550f6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl
@@ -39,24 +39,31 @@
 @group(1) @binding(0) var arg_0: texture_storage_1d<r8unorm, read>;
 
 // fn textureDimensions(texture: texture_storage_1d<r8unorm, read>) -> u32
-fn textureDimensions_fdbae8() {
+fn textureDimensions_fdbae8() -> u32{
   var res: u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fdbae8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_fdbae8();
+  prevent_dce = textureDimensions_fdbae8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_fdbae8();
+  prevent_dce = textureDimensions_fdbae8();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : u32
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_fdbae8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.dxc.hlsl
index 2bdaafe..cc4fec2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.dxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_fdbae8() {
+uint textureDimensions_fdbae8() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_fdbae8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_fdbae8();
+  prevent_dce.Store(0u, asuint(textureDimensions_fdbae8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_fdbae8();
+  prevent_dce.Store(0u, asuint(textureDimensions_fdbae8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_fdbae8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.fxc.hlsl
index 2bdaafe..cc4fec2 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.fxc.hlsl
@@ -1,36 +1,45 @@
 Texture1D<float4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_fdbae8() {
+uint textureDimensions_fdbae8() {
   uint tint_tmp;
   arg_0.GetDimensions(tint_tmp);
   uint res = tint_tmp;
-  prevent_dce.Store(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_fdbae8();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_fdbae8();
+  prevent_dce.Store(0u, asuint(textureDimensions_fdbae8()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_fdbae8();
+  prevent_dce.Store(0u, asuint(textureDimensions_fdbae8()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_fdbae8();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.msl
index 5bbf3e2..afbe075 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.msl
@@ -1,34 +1,43 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_fdbae8(texture1d<float, access::read> tint_symbol_1, device uint* const tint_symbol_2) {
+uint textureDimensions_fdbae8(texture1d<float, access::read> tint_symbol_1) {
   uint res = tint_symbol_1.get_width(0);
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint* tint_symbol_2 [[buffer(0)]], texture1d<float, access::read> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_fdbae8(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_4 [[buffer(0)]], texture1d<float, access::read> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_fdbae8(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint prevent_dce;
 };
 
-float4 vertex_main_inner(texture1d<float, access::read> tint_symbol_3, device uint* const tint_symbol_4) {
-  textureDimensions_fdbae8(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture1d<float, access::read> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_fdbae8(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_5 [[texture(0)]], device uint* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture1d<float, access::read> tint_symbol_7 [[texture(0)]], device uint* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_fdbae8(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture1d<float, access::read> tint_symbol_9 [[texture(0)]], device uint* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_fdbae8(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.spvasm
index ab89525..5c28360 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.spvasm
@@ -1,19 +1,20 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 43
+; Bound: 58
 ; Schema: 0
                OpCapability Shader
                OpCapability Image1D
                OpCapability StorageImageExtendedFormats
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -21,72 +22,99 @@
                OpName %prevent_dce "prevent_dce"
                OpName %textureDimensions_fdbae8 "textureDimensions_fdbae8"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 NonWritable
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-         %11 = OpTypeImage %float 1D 0 0 0 2 R8
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %9 = OpConstantNull %uint
+%prevent_dce_1 = OpVariable %_ptr_Output_uint Output %9
+%_ptr_Output_float = OpTypePointer Output %float
+         %12 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %12
+         %15 = OpTypeImage %float 1D 0 0 0 2 R8
+%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15
+      %arg_0 = OpVariable %_ptr_UniformConstant_15 UniformConstant
 %prevent_dce_block = OpTypeStruct %uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %16 = OpTypeFunction %void
+         %19 = OpTypeFunction %uint
 %_ptr_Function_uint = OpTypePointer Function %uint
-         %24 = OpConstantNull %uint
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
-         %29 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %uint
+         %39 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %45 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_fdbae8 = OpFunction %void None %16
-         %19 = OpLabel
-        %res = OpVariable %_ptr_Function_uint Function %24
-         %21 = OpLoad %11 %arg_0
-         %20 = OpImageQuerySize %uint %21
-               OpStore %res %20
-         %27 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
-         %28 = OpLoad %uint %res
-               OpStore %27 %28
+%textureDimensions_fdbae8 = OpFunction %uint None %19
+         %21 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function %9
+         %23 = OpLoad %15 %arg_0
+         %22 = OpImageQuerySize %uint %23
+               OpStore %res %22
+         %26 = OpLoad %uint %res
+               OpReturnValue %26
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %27
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %34 = OpFunctionCall %uint %textureDimensions_fdbae8
+               OpStore %33 %34
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %29
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %textureDimensions_fdbae8
-               OpReturnValue %5
+%compute_main = OpFunction %void None %27
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_StorageBuffer_uint %prevent_dce %uint_0
+         %38 = OpFunctionCall %uint %textureDimensions_fdbae8
+               OpStore %37 %38
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %16
-         %34 = OpLabel
-         %35 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %35
+%vertex_main_inner = OpFunction %VertexOutput None %39
+         %42 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %45
+         %47 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %47 %5
+         %49 = OpAccessChain %_ptr_Function_uint %out %uint_1
+         %50 = OpFunctionCall %uint %textureDimensions_fdbae8
+               OpStore %49 %50
+         %51 = OpLoad %VertexOutput %out
+               OpReturnValue %51
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %27
+         %53 = OpLabel
+         %54 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %55 = OpCompositeExtract %v4float %54 0
+               OpStore %pos_1 %55
+         %56 = OpCompositeExtract %uint %54 1
+               OpStore %prevent_dce_1 %56
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %16
-         %38 = OpLabel
-         %39 = OpFunctionCall %void %textureDimensions_fdbae8
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %16
-         %41 = OpLabel
-         %42 = OpFunctionCall %void %textureDimensions_fdbae8
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.wgsl
index 81d4d5b..08e2f05 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdbae8.wgsl.expected.wgsl
@@ -2,25 +2,34 @@
 
 @group(1) @binding(0) var arg_0 : texture_storage_1d<r8unorm, read>;
 
-fn textureDimensions_fdbae8() {
+fn textureDimensions_fdbae8() -> u32 {
   var res : u32 = textureDimensions(arg_0);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fdbae8();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_fdbae8();
+  prevent_dce = textureDimensions_fdbae8();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_fdbae8();
+  prevent_dce = textureDimensions_fdbae8();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : u32,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_fdbae8();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl
index 7021764..854fdbd 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl
@@ -37,25 +37,32 @@
 @group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureDimensions(texture: texture_2d_array<i32>, level: i32) -> vec2<u32>
-fn textureDimensions_fdf6e9() {
+fn textureDimensions_fdf6e9() -> vec2<u32>{
   var arg_1 = 1i;
   var res: vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fdf6e9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce = textureDimensions_fdf6e9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce = textureDimensions_fdf6e9();
+}
+
+struct VertexOutput {
+    @builtin(position) pos: vec4<f32>,
+    @location(0) @interpolate(flat) prevent_dce : vec2<u32>
+};
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_fdf6e9();
+  return out;
 }
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.dxc.hlsl
index e777edb..68aa5a8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.dxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_fdf6e9() {
+uint2 textureDimensions_fdf6e9() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_fdf6e9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fdf6e9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fdf6e9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_fdf6e9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.fxc.hlsl
index e777edb..68aa5a8 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.fxc.hlsl
@@ -1,37 +1,46 @@
 Texture2DArray<int4> arg_0 : register(t0, space1);
-RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-void textureDimensions_fdf6e9() {
+uint2 textureDimensions_fdf6e9() {
   int arg_1 = 1;
   uint4 tint_tmp;
   arg_0.GetDimensions(arg_1, tint_tmp.x, tint_tmp.y, tint_tmp.z, tint_tmp.w);
   uint2 res = tint_tmp.xy;
-  prevent_dce.Store2(0u, asuint(res));
+  return res;
 }
 
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  textureDimensions_fdf6e9();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
+RWByteAddressBuffer prevent_dce : register(u0);
 
 void fragment_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fdf6e9()));
   return;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce.Store2(0u, asuint(textureDimensions_fdf6e9()));
   return;
 }
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
+};
+struct tint_symbol_1 {
+  nointerpolation uint2 prevent_dce : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = (VertexOutput)0;
+  tint_symbol.pos = (0.0f).xxxx;
+  tint_symbol.prevent_dce = textureDimensions_fdf6e9();
+  return tint_symbol;
+}
+
+tint_symbol_1 vertex_main() {
+  VertexOutput inner_result = vertex_main_inner();
+  tint_symbol_1 wrapper_result = (tint_symbol_1)0;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
+  return wrapper_result;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.glsl
index 4443e9a..fcadf32 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.glsl
@@ -1,46 +1,25 @@
 #version 310 es
-
-uniform highp isampler2DArray arg_0_1;
-layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
-  uvec2 inner;
-} prevent_dce;
-
-void textureDimensions_fdf6e9() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
-
-vec4 vertex_main() {
-  textureDimensions_fdf6e9();
-  return vec4(0.0f);
-}
-
-void main() {
-  gl_PointSize = 1.0;
-  vec4 inner_result = vertex_main();
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-  return;
-}
-#version 310 es
 precision highp float;
 precision highp int;
 
 uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_fdf6e9() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_fdf6e9() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void fragment_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce.inner = textureDimensions_fdf6e9();
 }
 
 void main() {
@@ -50,18 +29,23 @@
 #version 310 es
 
 uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_fdf6e9() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
 layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
   uvec2 inner;
 } prevent_dce;
 
-void textureDimensions_fdf6e9() {
-  int arg_1 = 1;
-  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
-  prevent_dce.inner = res;
-}
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
 
 void compute_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce.inner = textureDimensions_fdf6e9();
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -69,3 +53,34 @@
   compute_main();
   return;
 }
+#version 310 es
+
+layout(location = 0) flat out uvec2 prevent_dce_1;
+uniform highp isampler2DArray arg_0_1;
+uvec2 textureDimensions_fdf6e9() {
+  int arg_1 = 1;
+  uvec2 res = uvec2(textureSize(arg_0_1, arg_1).xy);
+  return res;
+}
+
+struct VertexOutput {
+  vec4 pos;
+  uvec2 prevent_dce;
+};
+
+VertexOutput vertex_main() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), uvec2(0u, 0u));
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = textureDimensions_fdf6e9();
+  return tint_symbol;
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  VertexOutput inner_result = vertex_main();
+  gl_Position = inner_result.pos;
+  prevent_dce_1 = inner_result.prevent_dce;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.msl b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.msl
index bea8965..7504ce6 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.msl
@@ -1,35 +1,44 @@
 #include <metal_stdlib>
 
 using namespace metal;
-void textureDimensions_fdf6e9(texture2d_array<int, access::sample> tint_symbol_1, device uint2* const tint_symbol_2) {
+uint2 textureDimensions_fdf6e9(texture2d_array<int, access::sample> tint_symbol_1) {
   int arg_1 = 1;
   uint2 res = uint2(tint_symbol_1.get_width(arg_1), tint_symbol_1.get_height(arg_1));
-  *(tint_symbol_2) = res;
+  return res;
 }
 
-struct tint_symbol {
-  float4 value [[position]];
+fragment void fragment_main(device uint2* tint_symbol_2 [[buffer(0)]], texture2d_array<int, access::sample> tint_symbol_3 [[texture(0)]]) {
+  *(tint_symbol_2) = textureDimensions_fdf6e9(tint_symbol_3);
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_4 [[buffer(0)]], texture2d_array<int, access::sample> tint_symbol_5 [[texture(0)]]) {
+  *(tint_symbol_4) = textureDimensions_fdf6e9(tint_symbol_5);
+  return;
+}
+
+struct VertexOutput {
+  float4 pos;
+  uint2 prevent_dce;
 };
 
-float4 vertex_main_inner(texture2d_array<int, access::sample> tint_symbol_3, device uint2* const tint_symbol_4) {
-  textureDimensions_fdf6e9(tint_symbol_3, tint_symbol_4);
-  return float4(0.0f);
+struct tint_symbol {
+  uint2 prevent_dce [[user(locn0)]] [[flat]];
+  float4 pos [[position]];
+};
+
+VertexOutput vertex_main_inner(texture2d_array<int, access::sample> tint_symbol_6) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureDimensions_fdf6e9(tint_symbol_6);
+  return out;
 }
 
-vertex tint_symbol vertex_main(texture2d_array<int, access::sample> tint_symbol_5 [[texture(0)]], device uint2* tint_symbol_6 [[buffer(0)]]) {
-  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
+vertex tint_symbol vertex_main(texture2d_array<int, access::sample> tint_symbol_7 [[texture(0)]]) {
+  VertexOutput const inner_result = vertex_main_inner(tint_symbol_7);
   tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
+  wrapper_result.pos = inner_result.pos;
+  wrapper_result.prevent_dce = inner_result.prevent_dce;
   return wrapper_result;
 }
 
-fragment void fragment_main(texture2d_array<int, access::sample> tint_symbol_7 [[texture(0)]], device uint2* tint_symbol_8 [[buffer(0)]]) {
-  textureDimensions_fdf6e9(tint_symbol_7, tint_symbol_8);
-  return;
-}
-
-kernel void compute_main(texture2d_array<int, access::sample> tint_symbol_9 [[texture(0)]], device uint2* tint_symbol_10 [[buffer(0)]]) {
-  textureDimensions_fdf6e9(tint_symbol_9, tint_symbol_10);
-  return;
-}
-
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.spvasm
index 9135df8..0c854e4 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.spvasm
@@ -1,17 +1,18 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 52
+; Bound: 67
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
                OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
                OpEntryPoint GLCompute %compute_main "compute_main"
+               OpEntryPoint Vertex %vertex_main "vertex_main" %pos_1 %prevent_dce_1 %vertex_point_size
                OpExecutionMode %fragment_main OriginUpperLeft
                OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
+               OpName %pos_1 "pos_1"
+               OpName %prevent_dce_1 "prevent_dce_1"
                OpName %vertex_point_size "vertex_point_size"
                OpName %arg_0 "arg_0"
                OpName %prevent_dce_block "prevent_dce_block"
@@ -20,81 +21,108 @@
                OpName %textureDimensions_fdf6e9 "textureDimensions_fdf6e9"
                OpName %arg_1 "arg_1"
                OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
                OpName %fragment_main "fragment_main"
                OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
+               OpName %VertexOutput "VertexOutput"
+               OpMemberName %VertexOutput 0 "pos"
+               OpMemberName %VertexOutput 1 "prevent_dce"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %out "out"
+               OpName %vertex_main "vertex_main"
+               OpDecorate %pos_1 BuiltIn Position
+               OpDecorate %prevent_dce_1 Location 0
+               OpDecorate %prevent_dce_1 Flat
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %arg_0 DescriptorSet 1
                OpDecorate %arg_0 Binding 0
                OpDecorate %prevent_dce_block Block
                OpMemberDecorate %prevent_dce_block 0 Offset 0
-               OpDecorate %prevent_dce DescriptorSet 2
+               OpDecorate %prevent_dce DescriptorSet 0
                OpDecorate %prevent_dce Binding 0
+               OpMemberDecorate %VertexOutput 0 Offset 0
+               OpMemberDecorate %VertexOutput 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
           %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-        %int = OpTypeInt 32 1
-         %11 = OpTypeImage %int 2D 0 1 0 1 Unknown
-%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
-      %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
+      %pos_1 = OpVariable %_ptr_Output_v4float Output %5
        %uint = OpTypeInt 32 0
      %v2uint = OpTypeVector %uint 2
+%_ptr_Output_v2uint = OpTypePointer Output %v2uint
+         %10 = OpConstantNull %v2uint
+%prevent_dce_1 = OpVariable %_ptr_Output_v2uint Output %10
+%_ptr_Output_float = OpTypePointer Output %float
+         %13 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %13
+        %int = OpTypeInt 32 1
+         %16 = OpTypeImage %int 2D 0 1 0 1 Unknown
+%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16
+      %arg_0 = OpVariable %_ptr_UniformConstant_16 UniformConstant
 %prevent_dce_block = OpTypeStruct %v2uint
 %_ptr_StorageBuffer_prevent_dce_block = OpTypePointer StorageBuffer %prevent_dce_block
 %prevent_dce = OpVariable %_ptr_StorageBuffer_prevent_dce_block StorageBuffer
-       %void = OpTypeVoid
-         %18 = OpTypeFunction %void
+         %21 = OpTypeFunction %v2uint
       %int_1 = OpConstant %int 1
 %_ptr_Function_int = OpTypePointer Function %int
-         %25 = OpConstantNull %int
+         %27 = OpConstantNull %int
      %v3uint = OpTypeVector %uint 3
 %_ptr_Function_v2uint = OpTypePointer Function %v2uint
-         %33 = OpConstantNull %v2uint
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
-         %38 = OpTypeFunction %v4float
+%VertexOutput = OpTypeStruct %v4float %v2uint
+         %48 = OpTypeFunction %VertexOutput
+%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
+         %54 = OpConstantNull %VertexOutput
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
     %float_1 = OpConstant %float 1
-%textureDimensions_fdf6e9 = OpFunction %void None %18
-         %21 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_int Function %25
-        %res = OpVariable %_ptr_Function_v2uint Function %33
+%textureDimensions_fdf6e9 = OpFunction %v2uint None %21
+         %23 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_int Function %27
+        %res = OpVariable %_ptr_Function_v2uint Function %10
                OpStore %arg_1 %int_1
-         %29 = OpLoad %11 %arg_0
-         %30 = OpLoad %int %arg_1
-         %27 = OpImageQuerySizeLod %v3uint %29 %30
-         %26 = OpVectorShuffle %v2uint %27 %27 0 1
-               OpStore %res %26
-         %36 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
-         %37 = OpLoad %v2uint %res
-               OpStore %36 %37
+         %31 = OpLoad %16 %arg_0
+         %32 = OpLoad %int %arg_1
+         %29 = OpImageQuerySizeLod %v3uint %31 %32
+         %28 = OpVectorShuffle %v2uint %29 %29 0 1
+               OpStore %res %28
+         %35 = OpLoad %v2uint %res
+               OpReturnValue %35
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %36
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %43 = OpFunctionCall %v2uint %textureDimensions_fdf6e9
+               OpStore %42 %43
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %38
-         %40 = OpLabel
-         %41 = OpFunctionCall %void %textureDimensions_fdf6e9
-               OpReturnValue %5
+%compute_main = OpFunction %void None %36
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_StorageBuffer_v2uint %prevent_dce %uint_0
+         %47 = OpFunctionCall %v2uint %textureDimensions_fdf6e9
+               OpStore %46 %47
+               OpReturn
                OpFunctionEnd
-%vertex_main = OpFunction %void None %18
-         %43 = OpLabel
-         %44 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %44
+%vertex_main_inner = OpFunction %VertexOutput None %48
+         %51 = OpLabel
+        %out = OpVariable %_ptr_Function_VertexOutput Function %54
+         %56 = OpAccessChain %_ptr_Function_v4float %out %uint_0
+               OpStore %56 %5
+         %58 = OpAccessChain %_ptr_Function_v2uint %out %uint_1
+         %59 = OpFunctionCall %v2uint %textureDimensions_fdf6e9
+               OpStore %58 %59
+         %60 = OpLoad %VertexOutput %out
+               OpReturnValue %60
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %36
+         %62 = OpLabel
+         %63 = OpFunctionCall %VertexOutput %vertex_main_inner
+         %64 = OpCompositeExtract %v4float %63 0
+               OpStore %pos_1 %64
+         %65 = OpCompositeExtract %v2uint %63 1
+               OpStore %prevent_dce_1 %65
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %18
-         %47 = OpLabel
-         %48 = OpFunctionCall %void %textureDimensions_fdf6e9
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %18
-         %50 = OpLabel
-         %51 = OpFunctionCall %void %textureDimensions_fdf6e9
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.wgsl
index 6a277db..31ab61fc 100644
--- a/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.wgsl
+++ b/test/tint/builtins/gen/var/textureDimensions/fdf6e9.wgsl.expected.wgsl
@@ -1,25 +1,34 @@
 @group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
-fn textureDimensions_fdf6e9() {
+fn textureDimensions_fdf6e9() -> vec2<u32> {
   var arg_1 = 1i;
   var res : vec2<u32> = textureDimensions(arg_0, arg_1);
-  prevent_dce = res;
+  return res;
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-@vertex
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fdf6e9();
-  return vec4<f32>();
-}
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
 
 @fragment
 fn fragment_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce = textureDimensions_fdf6e9();
 }
 
 @compute @workgroup_size(1)
 fn compute_main() {
-  textureDimensions_fdf6e9();
+  prevent_dce = textureDimensions_fdf6e9();
+}
+
+struct VertexOutput {
+  @builtin(position)
+  pos : vec4<f32>,
+  @location(0) @interpolate(flat)
+  prevent_dce : vec2<u32>,
+}
+
+@vertex
+fn vertex_main() -> VertexOutput {
+  var out : VertexOutput;
+  out.pos = vec4<f32>();
+  out.prevent_dce = textureDimensions_fdf6e9();
+  return out;
 }