[glsl][ir] Add `arrayLength` support

This CL adds a GLSL `length` member functions to arrays in order to
support `arrayLength`.

Bug: 42251044
Change-Id: I3a34a300fef6666e129994b77f0d69da211c2d91
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/207755
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/glsl/builtin_fn.cc b/src/tint/lang/glsl/builtin_fn.cc
index 04d8d66..0702b91 100644
--- a/src/tint/lang/glsl/builtin_fn.cc
+++ b/src/tint/lang/glsl/builtin_fn.cc
@@ -42,6 +42,8 @@
     switch (i) {
         case BuiltinFn::kNone:
             return "<none>";
+        case BuiltinFn::kLength:
+            return "length";
         case BuiltinFn::kBarrier:
             return "barrier";
         case BuiltinFn::kMemoryBarrierBuffer:
diff --git a/src/tint/lang/glsl/builtin_fn.h b/src/tint/lang/glsl/builtin_fn.h
index 23f88c1..c39a686 100644
--- a/src/tint/lang/glsl/builtin_fn.h
+++ b/src/tint/lang/glsl/builtin_fn.h
@@ -47,6 +47,7 @@
 
 /// Enumerator of all builtin functions
 enum class BuiltinFn : uint8_t {
+    kLength,
     kBarrier,
     kMemoryBarrierBuffer,
     kMemoryBarrierImage,
diff --git a/src/tint/lang/glsl/glsl.def b/src/tint/lang/glsl/glsl.def
index 4787147..7af7322 100644
--- a/src/tint/lang/glsl/glsl.def
+++ b/src/tint/lang/glsl/glsl.def
@@ -55,6 +55,8 @@
 type vec4<T>
 @display("vec{N}<{T}>")     type vec<N: num, T>
 
+type array<T>
+
 type texture_1d<T>
 type texture_2d<T>
 type texture_2d_array<T>
@@ -91,6 +93,9 @@
   address_space.storage |
   address_space.workgroup
 
+match storage
+  : address_space.storage
+
 match f32_texel_format
   : texel_format.r8unorm
   | texel_format.bgra8unorm
@@ -119,6 +124,8 @@
 // Builtin Functions                                                          //
 ////////////////////////////////////////////////////////////////////////////////
 
+@member_function @must_use implicit(T, A: access) fn length(ptr<storage, array<T>, A>) -> i32
+
 @stage("compute") fn barrier()
 @stage("compute") fn memoryBarrierBuffer()
 @stage("compute") fn memoryBarrierImage()
diff --git a/src/tint/lang/glsl/intrinsic/data.cc b/src/tint/lang/glsl/intrinsic/data.cc
index 22e7303..71d0988 100644
--- a/src/tint/lang/glsl/intrinsic/data.cc
+++ b/src/tint/lang/glsl/intrinsic/data.cc
@@ -268,6 +268,26 @@
 };
 
 
+/// TypeMatcher for 'type array'
+constexpr TypeMatcher kArrayMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+  const Type* T = nullptr;
+    if (!MatchArray(state, ty, T)) {
+      return nullptr;
+    }
+    T = state.Type(T);
+    if (T == nullptr) {
+      return nullptr;
+    }
+    return BuildArray(state, ty, T);
+  },
+/* print */ []([[maybe_unused]] MatchState* state, StyledText& out) {StyledText T;
+  state->PrintType(T);
+    out << style::Type("array", "<", T, ">");
+  }
+};
+
+
 /// TypeMatcher for 'type texture_1d'
 constexpr TypeMatcher kTexture1DMatcher {
 /* match */ [](MatchState& state, const Type* ty) -> const Type* {
@@ -680,6 +700,19 @@
   }
 };
 
+/// EnumMatcher for 'match storage'
+constexpr NumberMatcher kStorageMatcher {
+/* match */ [](MatchState&, Number number) -> Number {
+    if (number.IsAny() || number.Value() == static_cast<uint32_t>(core::AddressSpace::kStorage)) {
+      return Number(static_cast<uint32_t>(core::AddressSpace::kStorage));
+    }
+    return Number::invalid;
+  },
+/* print */ [](MatchState*, StyledText& out) {
+  out<< style::Enum("storage");
+  }
+};
+
 /// EnumMatcher for 'match f32_texel_format'
 constexpr NumberMatcher kF32TexelFormatMatcher {
 /* match */ [](MatchState&, Number number) -> Number {
@@ -756,24 +789,25 @@
   /* [9] */ kVec3Matcher,
   /* [10] */ kVec4Matcher,
   /* [11] */ kVecMatcher,
-  /* [12] */ kTexture1DMatcher,
-  /* [13] */ kTexture2DMatcher,
-  /* [14] */ kTexture2DArrayMatcher,
-  /* [15] */ kTexture3DMatcher,
-  /* [16] */ kTextureCubeMatcher,
-  /* [17] */ kTextureCubeArrayMatcher,
-  /* [18] */ kTextureMultisampled2DMatcher,
-  /* [19] */ kTextureDepth2DMatcher,
-  /* [20] */ kTextureDepth2DArrayMatcher,
-  /* [21] */ kTextureDepthCubeMatcher,
-  /* [22] */ kTextureDepthCubeArrayMatcher,
-  /* [23] */ kTextureDepthMultisampled2DMatcher,
-  /* [24] */ kTextureStorage1DMatcher,
-  /* [25] */ kTextureStorage2DMatcher,
-  /* [26] */ kTextureStorage2DArrayMatcher,
-  /* [27] */ kTextureStorage3DMatcher,
-  /* [28] */ kIu32Matcher,
-  /* [29] */ kFiu32Matcher,
+  /* [12] */ kArrayMatcher,
+  /* [13] */ kTexture1DMatcher,
+  /* [14] */ kTexture2DMatcher,
+  /* [15] */ kTexture2DArrayMatcher,
+  /* [16] */ kTexture3DMatcher,
+  /* [17] */ kTextureCubeMatcher,
+  /* [18] */ kTextureCubeArrayMatcher,
+  /* [19] */ kTextureMultisampled2DMatcher,
+  /* [20] */ kTextureDepth2DMatcher,
+  /* [21] */ kTextureDepth2DArrayMatcher,
+  /* [22] */ kTextureDepthCubeMatcher,
+  /* [23] */ kTextureDepthCubeArrayMatcher,
+  /* [24] */ kTextureDepthMultisampled2DMatcher,
+  /* [25] */ kTextureStorage1DMatcher,
+  /* [26] */ kTextureStorage2DMatcher,
+  /* [27] */ kTextureStorage2DArrayMatcher,
+  /* [28] */ kTextureStorage3DMatcher,
+  /* [29] */ kIu32Matcher,
+  /* [30] */ kFiu32Matcher,
 };
 
 /// The template numbers, and number matchers
@@ -784,122 +818,126 @@
   /* [3] */ kReadableMatcher,
   /* [4] */ kWritableMatcher,
   /* [5] */ kWorkgroupOrStorageMatcher,
-  /* [6] */ kF32TexelFormatMatcher,
-  /* [7] */ kU32TexelFormatMatcher,
-  /* [8] */ kI32TexelFormatMatcher,
+  /* [6] */ kStorageMatcher,
+  /* [7] */ kF32TexelFormatMatcher,
+  /* [8] */ kU32TexelFormatMatcher,
+  /* [9] */ kI32TexelFormatMatcher,
 };
 
 constexpr MatcherIndex kMatcherIndices[] = {
   /* [0] */ MatcherIndex(7),
-  /* [1] */ MatcherIndex(5),
-  /* [2] */ MatcherIndex(6),
+  /* [1] */ MatcherIndex(6),
+  /* [2] */ MatcherIndex(12),
   /* [3] */ MatcherIndex(0),
-  /* [4] */ MatcherIndex(2),
+  /* [4] */ MatcherIndex(1),
   /* [5] */ MatcherIndex(7),
-  /* [6] */ MatcherIndex(1),
+  /* [6] */ MatcherIndex(5),
   /* [7] */ MatcherIndex(6),
   /* [8] */ MatcherIndex(0),
   /* [9] */ MatcherIndex(2),
-  /* [10] */ MatcherIndex(11),
-  /* [11] */ MatcherIndex(0),
-  /* [12] */ MatcherIndex(4),
-  /* [13] */ MatcherIndex(11),
-  /* [14] */ MatcherIndex(0),
-  /* [15] */ MatcherIndex(3),
-  /* [16] */ MatcherIndex(11),
-  /* [17] */ MatcherIndex(0),
-  /* [18] */ MatcherIndex(5),
-  /* [19] */ MatcherIndex(11),
-  /* [20] */ MatcherIndex(1),
-  /* [21] */ MatcherIndex(4),
-  /* [22] */ MatcherIndex(11),
-  /* [23] */ MatcherIndex(1),
-  /* [24] */ MatcherIndex(0),
-  /* [25] */ MatcherIndex(24),
-  /* [26] */ MatcherIndex(0),
-  /* [27] */ MatcherIndex(1),
-  /* [28] */ MatcherIndex(25),
+  /* [10] */ MatcherIndex(7),
+  /* [11] */ MatcherIndex(1),
+  /* [12] */ MatcherIndex(6),
+  /* [13] */ MatcherIndex(0),
+  /* [14] */ MatcherIndex(2),
+  /* [15] */ MatcherIndex(11),
+  /* [16] */ MatcherIndex(0),
+  /* [17] */ MatcherIndex(4),
+  /* [18] */ MatcherIndex(11),
+  /* [19] */ MatcherIndex(0),
+  /* [20] */ MatcherIndex(3),
+  /* [21] */ MatcherIndex(11),
+  /* [22] */ MatcherIndex(0),
+  /* [23] */ MatcherIndex(5),
+  /* [24] */ MatcherIndex(11),
+  /* [25] */ MatcherIndex(1),
+  /* [26] */ MatcherIndex(4),
+  /* [27] */ MatcherIndex(11),
+  /* [28] */ MatcherIndex(1),
   /* [29] */ MatcherIndex(0),
-  /* [30] */ MatcherIndex(1),
-  /* [31] */ MatcherIndex(26),
-  /* [32] */ MatcherIndex(0),
-  /* [33] */ MatcherIndex(1),
-  /* [34] */ MatcherIndex(27),
-  /* [35] */ MatcherIndex(0),
-  /* [36] */ MatcherIndex(1),
-  /* [37] */ MatcherIndex(24),
-  /* [38] */ MatcherIndex(6),
-  /* [39] */ MatcherIndex(4),
-  /* [40] */ MatcherIndex(24),
-  /* [41] */ MatcherIndex(8),
-  /* [42] */ MatcherIndex(4),
-  /* [43] */ MatcherIndex(24),
-  /* [44] */ MatcherIndex(7),
-  /* [45] */ MatcherIndex(4),
-  /* [46] */ MatcherIndex(25),
-  /* [47] */ MatcherIndex(6),
-  /* [48] */ MatcherIndex(4),
-  /* [49] */ MatcherIndex(25),
-  /* [50] */ MatcherIndex(8),
-  /* [51] */ MatcherIndex(4),
-  /* [52] */ MatcherIndex(25),
-  /* [53] */ MatcherIndex(7),
-  /* [54] */ MatcherIndex(4),
-  /* [55] */ MatcherIndex(27),
-  /* [56] */ MatcherIndex(6),
-  /* [57] */ MatcherIndex(4),
-  /* [58] */ MatcherIndex(27),
-  /* [59] */ MatcherIndex(8),
-  /* [60] */ MatcherIndex(4),
-  /* [61] */ MatcherIndex(27),
-  /* [62] */ MatcherIndex(7),
-  /* [63] */ MatcherIndex(4),
-  /* [64] */ MatcherIndex(26),
-  /* [65] */ MatcherIndex(6),
-  /* [66] */ MatcherIndex(4),
-  /* [67] */ MatcherIndex(26),
-  /* [68] */ MatcherIndex(8),
-  /* [69] */ MatcherIndex(4),
-  /* [70] */ MatcherIndex(26),
-  /* [71] */ MatcherIndex(7),
-  /* [72] */ MatcherIndex(4),
-  /* [73] */ MatcherIndex(8),
-  /* [74] */ MatcherIndex(2),
-  /* [75] */ MatcherIndex(12),
-  /* [76] */ MatcherIndex(0),
-  /* [77] */ MatcherIndex(13),
-  /* [78] */ MatcherIndex(0),
-  /* [79] */ MatcherIndex(9),
-  /* [80] */ MatcherIndex(4),
-  /* [81] */ MatcherIndex(14),
-  /* [82] */ MatcherIndex(0),
-  /* [83] */ MatcherIndex(15),
-  /* [84] */ MatcherIndex(0),
-  /* [85] */ MatcherIndex(16),
-  /* [86] */ MatcherIndex(0),
-  /* [87] */ MatcherIndex(17),
-  /* [88] */ MatcherIndex(0),
-  /* [89] */ MatcherIndex(18),
-  /* [90] */ MatcherIndex(0),
-  /* [91] */ MatcherIndex(10),
-  /* [92] */ MatcherIndex(0),
-  /* [93] */ MatcherIndex(10),
-  /* [94] */ MatcherIndex(3),
-  /* [95] */ MatcherIndex(10),
-  /* [96] */ MatcherIndex(4),
-  /* [97] */ MatcherIndex(10),
-  /* [98] */ MatcherIndex(5),
-  /* [99] */ MatcherIndex(8),
-  /* [100] */ MatcherIndex(0),
-  /* [101] */ MatcherIndex(9),
-  /* [102] */ MatcherIndex(0),
-  /* [103] */ MatcherIndex(28),
-  /* [104] */ MatcherIndex(29),
-  /* [105] */ MatcherIndex(19),
-  /* [106] */ MatcherIndex(20),
-  /* [107] */ MatcherIndex(21),
-  /* [108] */ MatcherIndex(22),
-  /* [109] */ MatcherIndex(23),
+  /* [30] */ MatcherIndex(25),
+  /* [31] */ MatcherIndex(0),
+  /* [32] */ MatcherIndex(1),
+  /* [33] */ MatcherIndex(26),
+  /* [34] */ MatcherIndex(0),
+  /* [35] */ MatcherIndex(1),
+  /* [36] */ MatcherIndex(27),
+  /* [37] */ MatcherIndex(0),
+  /* [38] */ MatcherIndex(1),
+  /* [39] */ MatcherIndex(28),
+  /* [40] */ MatcherIndex(0),
+  /* [41] */ MatcherIndex(1),
+  /* [42] */ MatcherIndex(25),
+  /* [43] */ MatcherIndex(7),
+  /* [44] */ MatcherIndex(4),
+  /* [45] */ MatcherIndex(25),
+  /* [46] */ MatcherIndex(9),
+  /* [47] */ MatcherIndex(4),
+  /* [48] */ MatcherIndex(25),
+  /* [49] */ MatcherIndex(8),
+  /* [50] */ MatcherIndex(4),
+  /* [51] */ MatcherIndex(26),
+  /* [52] */ MatcherIndex(7),
+  /* [53] */ MatcherIndex(4),
+  /* [54] */ MatcherIndex(26),
+  /* [55] */ MatcherIndex(9),
+  /* [56] */ MatcherIndex(4),
+  /* [57] */ MatcherIndex(26),
+  /* [58] */ MatcherIndex(8),
+  /* [59] */ MatcherIndex(4),
+  /* [60] */ MatcherIndex(28),
+  /* [61] */ MatcherIndex(7),
+  /* [62] */ MatcherIndex(4),
+  /* [63] */ MatcherIndex(28),
+  /* [64] */ MatcherIndex(9),
+  /* [65] */ MatcherIndex(4),
+  /* [66] */ MatcherIndex(28),
+  /* [67] */ MatcherIndex(8),
+  /* [68] */ MatcherIndex(4),
+  /* [69] */ MatcherIndex(27),
+  /* [70] */ MatcherIndex(7),
+  /* [71] */ MatcherIndex(4),
+  /* [72] */ MatcherIndex(27),
+  /* [73] */ MatcherIndex(9),
+  /* [74] */ MatcherIndex(4),
+  /* [75] */ MatcherIndex(27),
+  /* [76] */ MatcherIndex(8),
+  /* [77] */ MatcherIndex(4),
+  /* [78] */ MatcherIndex(8),
+  /* [79] */ MatcherIndex(2),
+  /* [80] */ MatcherIndex(13),
+  /* [81] */ MatcherIndex(0),
+  /* [82] */ MatcherIndex(14),
+  /* [83] */ MatcherIndex(0),
+  /* [84] */ MatcherIndex(15),
+  /* [85] */ MatcherIndex(0),
+  /* [86] */ MatcherIndex(16),
+  /* [87] */ MatcherIndex(0),
+  /* [88] */ MatcherIndex(17),
+  /* [89] */ MatcherIndex(0),
+  /* [90] */ MatcherIndex(18),
+  /* [91] */ MatcherIndex(0),
+  /* [92] */ MatcherIndex(19),
+  /* [93] */ MatcherIndex(0),
+  /* [94] */ MatcherIndex(10),
+  /* [95] */ MatcherIndex(0),
+  /* [96] */ MatcherIndex(10),
+  /* [97] */ MatcherIndex(3),
+  /* [98] */ MatcherIndex(10),
+  /* [99] */ MatcherIndex(4),
+  /* [100] */ MatcherIndex(10),
+  /* [101] */ MatcherIndex(5),
+  /* [102] */ MatcherIndex(8),
+  /* [103] */ MatcherIndex(0),
+  /* [104] */ MatcherIndex(9),
+  /* [105] */ MatcherIndex(0),
+  /* [106] */ MatcherIndex(29),
+  /* [107] */ MatcherIndex(30),
+  /* [108] */ MatcherIndex(20),
+  /* [109] */ MatcherIndex(21),
+  /* [110] */ MatcherIndex(22),
+  /* [111] */ MatcherIndex(23),
+  /* [112] */ MatcherIndex(24),
 };
 
 static_assert(MatcherIndicesIndex::CanIndex(kMatcherIndices),
@@ -919,37 +957,37 @@
   {
     /* [2] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [3] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [4] */
     /* usage */ core::ParameterUsage::kBase,
-    /* matcher_indices */ MatcherIndicesIndex(22),
+    /* matcher_indices */ MatcherIndicesIndex(27),
   },
   {
     /* [5] */
     /* usage */ core::ParameterUsage::kInsert,
-    /* matcher_indices */ MatcherIndicesIndex(22),
+    /* matcher_indices */ MatcherIndicesIndex(27),
   },
   {
     /* [6] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [7] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [8] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(0),
+    /* matcher_indices */ MatcherIndicesIndex(5),
   },
   {
     /* [9] */
@@ -964,107 +1002,107 @@
   {
     /* [11] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [12] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [13] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(22),
+    /* matcher_indices */ MatcherIndicesIndex(27),
   },
   {
     /* [14] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [15] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [16] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(75),
+    /* matcher_indices */ MatcherIndicesIndex(80),
   },
   {
     /* [17] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [18] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [19] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(77),
+    /* matcher_indices */ MatcherIndicesIndex(82),
   },
   {
     /* [20] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(41),
+    /* matcher_indices */ MatcherIndicesIndex(49),
   },
   {
     /* [21] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [22] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(81),
+    /* matcher_indices */ MatcherIndicesIndex(84),
   },
   {
     /* [23] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(79),
+    /* matcher_indices */ MatcherIndicesIndex(46),
   },
   {
     /* [24] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [25] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(89),
+    /* matcher_indices */ MatcherIndicesIndex(92),
   },
   {
     /* [26] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(41),
+    /* matcher_indices */ MatcherIndicesIndex(49),
   },
   {
     /* [27] */
     /* usage */ core::ParameterUsage::kSampleIndex,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [28] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(83),
+    /* matcher_indices */ MatcherIndicesIndex(86),
   },
   {
     /* [29] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(79),
+    /* matcher_indices */ MatcherIndicesIndex(46),
   },
   {
     /* [30] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [31] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(37),
+    /* matcher_indices */ MatcherIndicesIndex(42),
   },
   {
     /* [32] */
@@ -1074,12 +1112,12 @@
   {
     /* [33] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(93),
+    /* matcher_indices */ MatcherIndicesIndex(96),
   },
   {
     /* [34] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(40),
+    /* matcher_indices */ MatcherIndicesIndex(45),
   },
   {
     /* [35] */
@@ -1089,12 +1127,12 @@
   {
     /* [36] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(95),
+    /* matcher_indices */ MatcherIndicesIndex(98),
   },
   {
     /* [37] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(43),
+    /* matcher_indices */ MatcherIndicesIndex(48),
   },
   {
     /* [38] */
@@ -1104,147 +1142,147 @@
   {
     /* [39] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(97),
+    /* matcher_indices */ MatcherIndicesIndex(100),
   },
   {
     /* [40] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(46),
+    /* matcher_indices */ MatcherIndicesIndex(51),
   },
   {
     /* [41] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(99),
+    /* matcher_indices */ MatcherIndicesIndex(102),
   },
   {
     /* [42] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(93),
+    /* matcher_indices */ MatcherIndicesIndex(96),
   },
   {
     /* [43] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(49),
+    /* matcher_indices */ MatcherIndicesIndex(54),
   },
   {
     /* [44] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(99),
+    /* matcher_indices */ MatcherIndicesIndex(102),
   },
   {
     /* [45] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(95),
+    /* matcher_indices */ MatcherIndicesIndex(98),
   },
   {
     /* [46] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(52),
+    /* matcher_indices */ MatcherIndicesIndex(57),
   },
   {
     /* [47] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(99),
+    /* matcher_indices */ MatcherIndicesIndex(102),
   },
   {
     /* [48] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(97),
+    /* matcher_indices */ MatcherIndicesIndex(100),
   },
   {
     /* [49] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(55),
+    /* matcher_indices */ MatcherIndicesIndex(60),
   },
   {
     /* [50] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(101),
+    /* matcher_indices */ MatcherIndicesIndex(104),
   },
   {
     /* [51] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(93),
+    /* matcher_indices */ MatcherIndicesIndex(96),
   },
   {
     /* [52] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(58),
+    /* matcher_indices */ MatcherIndicesIndex(63),
   },
   {
     /* [53] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(101),
+    /* matcher_indices */ MatcherIndicesIndex(104),
   },
   {
     /* [54] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(95),
+    /* matcher_indices */ MatcherIndicesIndex(98),
   },
   {
     /* [55] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(61),
+    /* matcher_indices */ MatcherIndicesIndex(66),
   },
   {
     /* [56] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(101),
+    /* matcher_indices */ MatcherIndicesIndex(104),
   },
   {
     /* [57] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(97),
+    /* matcher_indices */ MatcherIndicesIndex(100),
   },
   {
     /* [58] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(64),
+    /* matcher_indices */ MatcherIndicesIndex(69),
   },
   {
     /* [59] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(101),
+    /* matcher_indices */ MatcherIndicesIndex(104),
   },
   {
     /* [60] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(93),
+    /* matcher_indices */ MatcherIndicesIndex(96),
   },
   {
     /* [61] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(67),
+    /* matcher_indices */ MatcherIndicesIndex(72),
   },
   {
     /* [62] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(101),
+    /* matcher_indices */ MatcherIndicesIndex(104),
   },
   {
     /* [63] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(95),
+    /* matcher_indices */ MatcherIndicesIndex(98),
   },
   {
     /* [64] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(70),
+    /* matcher_indices */ MatcherIndicesIndex(75),
   },
   {
     /* [65] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(101),
+    /* matcher_indices */ MatcherIndicesIndex(104),
   },
   {
     /* [66] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(97),
+    /* matcher_indices */ MatcherIndicesIndex(100),
   },
   {
     /* [67] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(5),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [68] */
@@ -1254,182 +1292,187 @@
   {
     /* [69] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(75),
+    /* matcher_indices */ MatcherIndicesIndex(80),
   },
   {
     /* [70] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [71] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(77),
+    /* matcher_indices */ MatcherIndicesIndex(82),
   },
   {
     /* [72] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [73] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(81),
+    /* matcher_indices */ MatcherIndicesIndex(84),
   },
   {
     /* [74] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [75] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(83),
+    /* matcher_indices */ MatcherIndicesIndex(86),
   },
   {
     /* [76] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [77] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(85),
+    /* matcher_indices */ MatcherIndicesIndex(88),
   },
   {
     /* [78] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [79] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(87),
+    /* matcher_indices */ MatcherIndicesIndex(90),
   },
   {
     /* [80] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [81] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(105),
+    /* matcher_indices */ MatcherIndicesIndex(108),
   },
   {
     /* [82] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [83] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(106),
+    /* matcher_indices */ MatcherIndicesIndex(109),
   },
   {
     /* [84] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [85] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(107),
+    /* matcher_indices */ MatcherIndicesIndex(110),
   },
   {
     /* [86] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [87] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(108),
+    /* matcher_indices */ MatcherIndicesIndex(111),
   },
   {
     /* [88] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [89] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(25),
+    /* matcher_indices */ MatcherIndicesIndex(30),
   },
   {
     /* [90] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [91] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(28),
+    /* matcher_indices */ MatcherIndicesIndex(33),
   },
   {
     /* [92] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(41),
+    /* matcher_indices */ MatcherIndicesIndex(49),
   },
   {
     /* [93] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(31),
+    /* matcher_indices */ MatcherIndicesIndex(36),
   },
   {
     /* [94] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(79),
+    /* matcher_indices */ MatcherIndicesIndex(46),
   },
   {
     /* [95] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(34),
+    /* matcher_indices */ MatcherIndicesIndex(39),
   },
   {
     /* [96] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(79),
+    /* matcher_indices */ MatcherIndicesIndex(46),
   },
   {
     /* [97] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(15),
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(0),
   },
   {
     /* [98] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(13),
+    /* matcher_indices */ MatcherIndicesIndex(20),
   },
   {
     /* [99] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(18),
   },
   {
     /* [100] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(10),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [101] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(1),
+    /* matcher_indices */ MatcherIndicesIndex(15),
   },
   {
     /* [102] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(16),
+    /* matcher_indices */ MatcherIndicesIndex(6),
   },
   {
     /* [103] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(21),
   },
   {
     /* [104] */
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(78),
+  },
+  {
+    /* [105] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(109),
+    /* matcher_indices */ MatcherIndicesIndex(112),
   },
 };
 
@@ -1440,85 +1483,97 @@
   {
     /* [0] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(103),
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [1] */
-    /* name */ "S",
-    /* matcher_indices */ MatcherIndicesIndex(1),
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [2] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(103),
+    /* matcher_indices */ MatcherIndicesIndex(106),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [3] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* name */ "S",
+    /* matcher_indices */ MatcherIndicesIndex(6),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [4] */
-    /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(106),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [5] */
-    /* name */ "A",
+    /* name */ "N",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [6] */
     /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(2),
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [7] */
     /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(15),
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [8] */
     /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(41),
+    /* matcher_indices */ MatcherIndicesIndex(0),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [9] */
     /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(15),
+    /* matcher_indices */ MatcherIndicesIndex(20),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [10] */
     /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(0),
+    /* matcher_indices */ MatcherIndicesIndex(46),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [11] */
     /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(15),
+    /* matcher_indices */ MatcherIndicesIndex(20),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [12] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(104),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(49),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [13] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(20),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [14] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(107),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [15] */
     /* name */ "C",
-    /* matcher_indices */ MatcherIndicesIndex(103),
+    /* matcher_indices */ MatcherIndicesIndex(106),
     /* kind */ TemplateInfo::Kind::kType,
   },
 };
@@ -1533,9 +1588,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(69),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* return_matcher_indices */ MatcherIndicesIndex(17),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1544,9 +1599,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(71),
-    /* return_matcher_indices */ MatcherIndicesIndex(41),
+    /* return_matcher_indices */ MatcherIndicesIndex(49),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1555,9 +1610,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(73),
-    /* return_matcher_indices */ MatcherIndicesIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(46),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1566,9 +1621,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(75),
-    /* return_matcher_indices */ MatcherIndicesIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(46),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1577,9 +1632,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(77),
-    /* return_matcher_indices */ MatcherIndicesIndex(41),
+    /* return_matcher_indices */ MatcherIndicesIndex(49),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1588,9 +1643,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(79),
-    /* return_matcher_indices */ MatcherIndicesIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(46),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1601,7 +1656,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(81),
-    /* return_matcher_indices */ MatcherIndicesIndex(41),
+    /* return_matcher_indices */ MatcherIndicesIndex(49),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1612,7 +1667,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(83),
-    /* return_matcher_indices */ MatcherIndicesIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(46),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1623,7 +1678,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(85),
-    /* return_matcher_indices */ MatcherIndicesIndex(41),
+    /* return_matcher_indices */ MatcherIndicesIndex(49),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1634,7 +1689,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(87),
-    /* return_matcher_indices */ MatcherIndicesIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(46),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1643,9 +1698,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(25),
-    /* return_matcher_indices */ MatcherIndicesIndex(41),
+    /* return_matcher_indices */ MatcherIndicesIndex(49),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1655,8 +1710,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(104),
-    /* return_matcher_indices */ MatcherIndicesIndex(41),
+    /* parameters */ ParameterIndex(105),
+    /* return_matcher_indices */ MatcherIndicesIndex(49),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1665,9 +1720,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(6),
+    /* templates */ TemplateIndex(8),
     /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(93),
+    /* return_matcher_indices */ MatcherIndicesIndex(96),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1676,9 +1731,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(6),
+    /* templates */ TemplateIndex(8),
     /* parameters */ ParameterIndex(91),
-    /* return_matcher_indices */ MatcherIndicesIndex(93),
+    /* return_matcher_indices */ MatcherIndicesIndex(96),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1687,9 +1742,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(6),
+    /* templates */ TemplateIndex(8),
     /* parameters */ ParameterIndex(93),
-    /* return_matcher_indices */ MatcherIndicesIndex(93),
+    /* return_matcher_indices */ MatcherIndicesIndex(96),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1698,9 +1753,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(6),
+    /* templates */ TemplateIndex(8),
     /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(93),
+    /* return_matcher_indices */ MatcherIndicesIndex(96),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1709,9 +1764,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(8),
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(95),
+    /* return_matcher_indices */ MatcherIndicesIndex(98),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1720,9 +1775,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(8),
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(91),
-    /* return_matcher_indices */ MatcherIndicesIndex(95),
+    /* return_matcher_indices */ MatcherIndicesIndex(98),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1731,9 +1786,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(8),
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(93),
-    /* return_matcher_indices */ MatcherIndicesIndex(95),
+    /* return_matcher_indices */ MatcherIndicesIndex(98),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1742,9 +1797,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(8),
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(95),
+    /* return_matcher_indices */ MatcherIndicesIndex(98),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1753,9 +1808,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(10),
+    /* templates */ TemplateIndex(12),
     /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(97),
+    /* return_matcher_indices */ MatcherIndicesIndex(100),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1764,9 +1819,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(10),
+    /* templates */ TemplateIndex(12),
     /* parameters */ ParameterIndex(91),
-    /* return_matcher_indices */ MatcherIndicesIndex(97),
+    /* return_matcher_indices */ MatcherIndicesIndex(100),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1775,9 +1830,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(10),
+    /* templates */ TemplateIndex(12),
     /* parameters */ ParameterIndex(93),
-    /* return_matcher_indices */ MatcherIndicesIndex(97),
+    /* return_matcher_indices */ MatcherIndicesIndex(100),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1786,9 +1841,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(10),
+    /* templates */ TemplateIndex(12),
     /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(97),
+    /* return_matcher_indices */ MatcherIndicesIndex(100),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1797,7 +1852,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(31),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1808,7 +1863,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(34),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1819,7 +1874,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(37),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1830,7 +1885,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(40),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1841,7 +1896,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(43),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1852,7 +1907,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(46),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1863,7 +1918,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(49),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1874,7 +1929,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(52),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1885,7 +1940,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(55),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1896,7 +1951,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(58),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1907,7 +1962,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(61),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1918,7 +1973,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(13),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(64),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1929,9 +1984,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(16),
-    /* return_matcher_indices */ MatcherIndicesIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(94),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1940,9 +1995,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(19),
-    /* return_matcher_indices */ MatcherIndicesIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(94),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1951,9 +2006,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(22),
-    /* return_matcher_indices */ MatcherIndicesIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(94),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1962,9 +2017,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(25),
-    /* return_matcher_indices */ MatcherIndicesIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(94),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1973,9 +2028,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(28),
-    /* return_matcher_indices */ MatcherIndicesIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(94),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1984,9 +2039,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* return_matcher_indices */ MatcherIndicesIndex(17),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1995,9 +2050,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(91),
-    /* return_matcher_indices */ MatcherIndicesIndex(41),
+    /* return_matcher_indices */ MatcherIndicesIndex(49),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2006,9 +2061,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(93),
-    /* return_matcher_indices */ MatcherIndicesIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(46),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2017,9 +2072,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(46),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2029,8 +2084,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(97),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* parameters */ ParameterIndex(98),
+    /* return_matcher_indices */ MatcherIndicesIndex(17),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2039,9 +2094,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(98),
-    /* return_matcher_indices */ MatcherIndicesIndex(10),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(99),
+    /* return_matcher_indices */ MatcherIndicesIndex(15),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2051,8 +2106,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(97),
-    /* return_matcher_indices */ MatcherIndicesIndex(1),
+    /* parameters */ ParameterIndex(98),
+    /* return_matcher_indices */ MatcherIndicesIndex(6),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2061,9 +2116,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(98),
-    /* return_matcher_indices */ MatcherIndicesIndex(16),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(99),
+    /* return_matcher_indices */ MatcherIndicesIndex(21),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2073,8 +2128,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(99),
-    /* return_matcher_indices */ MatcherIndicesIndex(15),
+    /* parameters */ ParameterIndex(100),
+    /* return_matcher_indices */ MatcherIndicesIndex(20),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2083,9 +2138,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(100),
-    /* return_matcher_indices */ MatcherIndicesIndex(13),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(101),
+    /* return_matcher_indices */ MatcherIndicesIndex(18),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2095,8 +2150,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(101),
-    /* return_matcher_indices */ MatcherIndicesIndex(15),
+    /* parameters */ ParameterIndex(102),
+    /* return_matcher_indices */ MatcherIndicesIndex(20),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2105,9 +2160,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(102),
-    /* return_matcher_indices */ MatcherIndicesIndex(13),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(103),
+    /* return_matcher_indices */ MatcherIndicesIndex(18),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2116,9 +2171,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(2),
     /* parameters */ ParameterIndex(10),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* return_matcher_indices */ MatcherIndicesIndex(17),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2127,9 +2182,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(13),
-    /* return_matcher_indices */ MatcherIndicesIndex(19),
+    /* return_matcher_indices */ MatcherIndicesIndex(24),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2138,7 +2193,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(2),
     /* parameters */ ParameterIndex(10),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -2149,9 +2204,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(13),
-    /* return_matcher_indices */ MatcherIndicesIndex(22),
+    /* return_matcher_indices */ MatcherIndicesIndex(27),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2160,7 +2215,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(2),
     /* parameters */ ParameterIndex(0),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -2171,13 +2226,24 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(4),
-    /* return_matcher_indices */ MatcherIndicesIndex(22),
+    /* return_matcher_indices */ MatcherIndicesIndex(27),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [59] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(0),
+    /* parameters */ ParameterIndex(97),
+    /* return_matcher_indices */ MatcherIndicesIndex(17),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [60] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 0,
     /* num_explicit_templates */ 0,
@@ -2188,47 +2254,47 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [60] */
+    /* [61] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(2),
     /* parameters */ ParameterIndex(8),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [61] */
+    /* [62] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(2),
     /* parameters */ ParameterIndex(67),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [62] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(103),
-    /* return_matcher_indices */ MatcherIndicesIndex(1),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
     /* [63] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(101),
-    /* return_matcher_indices */ MatcherIndicesIndex(73),
+    /* parameters */ ParameterIndex(104),
+    /* return_matcher_indices */ MatcherIndicesIndex(6),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [64] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(102),
+    /* return_matcher_indices */ MatcherIndicesIndex(78),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
 };
@@ -2239,97 +2305,103 @@
 constexpr IntrinsicInfo kBuiltins[] = {
   {
     /* [0] */
-    /* fn barrier() */
+    /* fn length[T, A : access](ptr<storage, array<T>, A>) -> i32 */
     /* num overloads */ 1,
     /* overloads */ OverloadIndex(59),
   },
   {
     /* [1] */
-    /* fn memoryBarrierBuffer() */
+    /* fn barrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(59),
+    /* overloads */ OverloadIndex(60),
   },
   {
     /* [2] */
-    /* fn memoryBarrierImage() */
+    /* fn memoryBarrierBuffer() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(59),
+    /* overloads */ OverloadIndex(60),
   },
   {
     /* [3] */
-    /* fn atomicCompSwap[T : iu32](ptr<workgroup_or_storage, atomic<T>, read_write>, compare_value: T, value: T) -> T */
+    /* fn memoryBarrierImage() */
     /* num overloads */ 1,
     /* overloads */ OverloadIndex(60),
   },
   {
     /* [4] */
-    /* fn atomicSub[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
+    /* fn atomicCompSwap[T : iu32](ptr<workgroup_or_storage, atomic<T>, read_write>, compare_value: T, value: T) -> T */
     /* num overloads */ 1,
     /* overloads */ OverloadIndex(61),
   },
   {
     /* [5] */
+    /* fn atomicSub[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
+    /* num overloads */ 1,
+    /* overloads */ OverloadIndex(62),
+  },
+  {
+    /* [6] */
     /* fn floatBitsToInt(value: f32) -> i32 */
     /* fn floatBitsToInt[N : num](value: vec<N, f32>) -> vec<N, i32> */
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(45),
   },
   {
-    /* [6] */
+    /* [7] */
     /* fn floatBitsToUint(value: f32) -> u32 */
     /* fn floatBitsToUint[N : num](value: vec<N, f32>) -> vec<N, u32> */
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(47),
   },
   {
-    /* [7] */
+    /* [8] */
     /* fn intBitsToFloat(value: i32) -> f32 */
     /* fn intBitsToFloat[N : num](value: vec<N, i32>) -> vec<N, f32> */
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(49),
   },
   {
-    /* [8] */
+    /* [9] */
     /* fn uintBitsToFloat(value: u32) -> f32 */
     /* fn uintBitsToFloat[N : num](value: vec<N, u32>) -> vec<N, f32> */
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(51),
   },
   {
-    /* [9] */
+    /* [10] */
     /* fn bitCount[T : iu32](value: T) -> i32 */
     /* fn bitCount[T : iu32, N : num](value: vec<N, T>) -> vec<N, i32> */
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(53),
   },
   {
-    /* [10] */
+    /* [11] */
     /* fn bitfieldExtract[T : iu32](value: T, offset: i32, bits: i32) -> T */
     /* fn bitfieldExtract[T : iu32, N : num](value: vec<N, T>, offset: i32, bits: i32) -> vec<N, T> */
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(55),
   },
   {
-    /* [11] */
+    /* [12] */
     /* fn bitfieldInsert[T : iu32](base: T, insert: T, offset: i32, bits: i32) -> T */
     /* fn bitfieldInsert[T : iu32, N : num](base: vec<N, T>, insert: vec<N, T>, offset: i32, bits: i32) -> vec<N, T> */
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(57),
   },
   {
-    /* [12] */
-    /* fn packFloat2x16(value: vec2<f16>) -> u32 */
-    /* num overloads */ 1,
-    /* overloads */ OverloadIndex(62),
-  },
-  {
     /* [13] */
-    /* fn unpackFloat2x16(value: u32) -> vec2<f16> */
+    /* fn packFloat2x16(value: vec2<f16>) -> u32 */
     /* num overloads */ 1,
     /* overloads */ OverloadIndex(63),
   },
   {
     /* [14] */
+    /* fn unpackFloat2x16(value: u32) -> vec2<f16> */
+    /* num overloads */ 1,
+    /* overloads */ OverloadIndex(64),
+  },
+  {
+    /* [15] */
     /* fn textureSize[T : fiu32](texture: texture_1d<T>, level: i32) -> i32 */
     /* fn textureSize[T : fiu32](texture: texture_2d<T>, level: i32) -> vec2<i32> */
     /* fn textureSize[T : fiu32](texture: texture_2d_array<T>, level: i32) -> vec3<i32> */
@@ -2346,7 +2418,7 @@
     /* overloads */ OverloadIndex(0),
   },
   {
-    /* [15] */
+    /* [16] */
     /* fn imageSize[F : texel_format, A : access](texture: texture_storage_1d<F, A>) -> i32 */
     /* fn imageSize[F : texel_format, A : access](texture: texture_storage_2d<F, A>) -> vec2<i32> */
     /* fn imageSize[F : texel_format, A : access](texture: texture_storage_2d_array<F, A>) -> vec3<i32> */
@@ -2355,7 +2427,7 @@
     /* overloads */ OverloadIndex(41),
   },
   {
-    /* [16] */
+    /* [17] */
     /* fn texelFetch[T : fiu32](texture: texture_1d<T>, location: i32, level: i32) -> vec4<T> */
     /* fn texelFetch[T : fiu32](texture: texture_2d<T>, location: vec2<i32>, level: i32) -> vec4<T> */
     /* fn texelFetch[T : fiu32](texture: texture_2d_array<T>, location: vec3<i32>, level: i32) -> vec4<T> */
@@ -2365,7 +2437,7 @@
     /* overloads */ OverloadIndex(36),
   },
   {
-    /* [17] */
+    /* [18] */
     /* fn imageLoad[F : f32_texel_format, A : readable](texture: texture_storage_1d<F, A>, coords: i32) -> vec4<f32> */
     /* fn imageLoad[F : f32_texel_format, A : readable](texture: texture_storage_2d<F, A>, coords: vec2<i32>) -> vec4<f32> */
     /* fn imageLoad[F : f32_texel_format, A : readable](texture: texture_storage_2d_array<F, A>, coords: vec3<i32>) -> vec4<f32> */
@@ -2382,7 +2454,7 @@
     /* overloads */ OverloadIndex(12),
   },
   {
-    /* [18] */
+    /* [19] */
     /* fn imageStore[C : iu32](texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>) */
     /* fn imageStore[C : iu32](texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>) */
     /* fn imageStore[C : iu32](texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>) */
diff --git a/src/tint/lang/glsl/ir/BUILD.bazel b/src/tint/lang/glsl/ir/BUILD.bazel
index 4f04c35..22db5c1 100644
--- a/src/tint/lang/glsl/ir/BUILD.bazel
+++ b/src/tint/lang/glsl/ir/BUILD.bazel
@@ -40,10 +40,12 @@
   name = "ir",
   srcs = [
     "builtin_call.cc",
+    "member_builtin_call.cc",
     "ternary.cc",
   ],
   hdrs = [
     "builtin_call.h",
+    "member_builtin_call.h",
     "ternary.h",
   ],
   deps = [
@@ -78,6 +80,7 @@
   alwayslink = True,
   srcs = [
     "builtin_call_test.cc",
+    "member_builtin_call_test.cc",
     "ternary_test.cc",
   ],
   deps = [
diff --git a/src/tint/lang/glsl/ir/BUILD.cmake b/src/tint/lang/glsl/ir/BUILD.cmake
index acaa18f..7a70465 100644
--- a/src/tint/lang/glsl/ir/BUILD.cmake
+++ b/src/tint/lang/glsl/ir/BUILD.cmake
@@ -41,6 +41,8 @@
 tint_add_target(tint_lang_glsl_ir lib
   lang/glsl/ir/builtin_call.cc
   lang/glsl/ir/builtin_call.h
+  lang/glsl/ir/member_builtin_call.cc
+  lang/glsl/ir/member_builtin_call.h
   lang/glsl/ir/ternary.cc
   lang/glsl/ir/ternary.h
 )
@@ -79,6 +81,7 @@
 ################################################################################
 tint_add_target(tint_lang_glsl_ir_test test
   lang/glsl/ir/builtin_call_test.cc
+  lang/glsl/ir/member_builtin_call_test.cc
   lang/glsl/ir/ternary_test.cc
 )
 
diff --git a/src/tint/lang/glsl/ir/BUILD.gn b/src/tint/lang/glsl/ir/BUILD.gn
index 54868e1..b8e7399 100644
--- a/src/tint/lang/glsl/ir/BUILD.gn
+++ b/src/tint/lang/glsl/ir/BUILD.gn
@@ -47,6 +47,8 @@
   sources = [
     "builtin_call.cc",
     "builtin_call.h",
+    "member_builtin_call.cc",
+    "member_builtin_call.h",
     "ternary.cc",
     "ternary.h",
   ]
@@ -79,6 +81,7 @@
   tint_unittests_source_set("unittests") {
     sources = [
       "builtin_call_test.cc",
+      "member_builtin_call_test.cc",
       "ternary_test.cc",
     ]
     deps = [
diff --git a/src/tint/lang/glsl/ir/member_builtin_call.cc b/src/tint/lang/glsl/ir/member_builtin_call.cc
new file mode 100644
index 0000000..129ada0
--- /dev/null
+++ b/src/tint/lang/glsl/ir/member_builtin_call.cc
@@ -0,0 +1,64 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "src/tint/lang/glsl/ir/member_builtin_call.h"
+
+#include <utility>
+
+#include "src/tint/lang/core/ir/clone_context.h"
+#include "src/tint/lang/core/ir/instruction_result.h"
+#include "src/tint/lang/core/ir/module.h"
+#include "src/tint/lang/core/ir/value.h"
+#include "src/tint/lang/glsl/builtin_fn.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/ice/ice.h"
+#include "src/tint/utils/rtti/castable.h"
+
+TINT_INSTANTIATE_TYPEINFO(tint::glsl::ir::MemberBuiltinCall);
+
+namespace tint::glsl::ir {
+
+MemberBuiltinCall::MemberBuiltinCall(Id id,
+                                     core::ir::InstructionResult* result,
+                                     BuiltinFn func,
+                                     core::ir::Value* object,
+                                     VectorRef<core::ir::Value*> arguments)
+    : Base(id, result, object, arguments), func_(func) {
+    TINT_ASSERT(func != BuiltinFn::kNone);
+}
+
+MemberBuiltinCall::~MemberBuiltinCall() = default;
+
+MemberBuiltinCall* MemberBuiltinCall::Clone(core::ir::CloneContext& ctx) {
+    auto* new_result = ctx.Clone(Result(0));
+    auto* new_object = ctx.Clone(Object());
+    auto new_args = ctx.Clone<MemberBuiltinCall::kDefaultNumOperands>(Args());
+    return ctx.ir.CreateInstruction<MemberBuiltinCall>(new_result, func_, new_object,
+                                                       std::move(new_args));
+}
+
+}  // namespace tint::glsl::ir
diff --git a/src/tint/lang/glsl/ir/member_builtin_call.h b/src/tint/lang/glsl/ir/member_builtin_call.h
new file mode 100644
index 0000000..2de89ab
--- /dev/null
+++ b/src/tint/lang/glsl/ir/member_builtin_call.h
@@ -0,0 +1,81 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef SRC_TINT_LANG_GLSL_IR_MEMBER_BUILTIN_CALL_H_
+#define SRC_TINT_LANG_GLSL_IR_MEMBER_BUILTIN_CALL_H_
+
+#include <string>
+
+#include "src/tint/lang/core/intrinsic/table_data.h"
+#include "src/tint/lang/core/ir/member_builtin_call.h"
+#include "src/tint/lang/glsl/builtin_fn.h"
+#include "src/tint/lang/glsl/intrinsic/dialect.h"
+#include "src/tint/utils/rtti/castable.h"
+
+namespace tint::glsl::ir {
+
+/// An GLSL member builtin call instruction in the IR.
+class MemberBuiltinCall final : public Castable<MemberBuiltinCall, core::ir::MemberBuiltinCall> {
+  public:
+    /// Constructor
+    /// @param id the instruction id
+    /// @param result the result value
+    /// @param func the builtin function
+    /// @param object the object
+    /// @param args the call arguments
+    MemberBuiltinCall(Id id,
+                      core::ir::InstructionResult* result,
+                      BuiltinFn func,
+                      core::ir::Value* object,
+                      VectorRef<core::ir::Value*> args = tint::Empty);
+
+    ~MemberBuiltinCall() override;
+
+    /// @copydoc core::ir::Instruction::Clone()
+    MemberBuiltinCall* Clone(core::ir::CloneContext& ctx) override;
+
+    /// @returns the builtin function
+    BuiltinFn Func() const { return func_; }
+
+    /// @returns the identifier for the function
+    size_t FuncId() const override { return static_cast<size_t>(func_); }
+
+    /// @returns the friendly name for the instruction
+    std::string FriendlyName() const override { return str(func_); }
+
+    /// @returns the table data to validate this builtin
+    const core::intrinsic::TableData& TableData() const override {
+        return glsl::intrinsic::Dialect::kData;
+    }
+
+  private:
+    BuiltinFn func_;
+};
+
+}  // namespace tint::glsl::ir
+
+#endif  // SRC_TINT_LANG_GLSL_IR_MEMBER_BUILTIN_CALL_H_
diff --git a/src/tint/lang/glsl/ir/member_builtin_call_test.cc b/src/tint/lang/glsl/ir/member_builtin_call_test.cc
new file mode 100644
index 0000000..84329e1
--- /dev/null
+++ b/src/tint/lang/glsl/ir/member_builtin_call_test.cc
@@ -0,0 +1,122 @@
+// Copyright 2023 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "src/tint/lang/glsl/ir/member_builtin_call.h"
+
+#include "gtest/gtest.h"
+
+#include "src/tint/lang/core/fluent_types.h"
+#include "src/tint/lang/core/ir/ir_helper_test.h"
+#include "src/tint/lang/core/ir/validator.h"
+#include "src/tint/lang/glsl/builtin_fn.h"
+#include "src/tint/utils/result/result.h"
+
+using namespace tint::core::fluent_types;     // NOLINT
+using namespace tint::core::number_suffixes;  // NOLINT
+
+namespace tint::glsl::ir {
+namespace {
+
+using IR_GlslMemberBuiltinCallTest = core::ir::IRTestHelper;
+
+TEST_F(IR_GlslMemberBuiltinCallTest, Clone) {
+    auto* sb = ty.Struct(mod.symbols.New("SB"), {
+                                                    {mod.symbols.New("a"), ty.array<u32>()},
+                                                });
+    auto* var = b.Var("v", storage, sb, core::Access::kReadWrite);
+    var->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(var);
+
+    auto* access = b.Access(ty.ptr<storage, array<u32>, read_write>(), var, 0_u);
+    auto* builtin = b.MemberCall<MemberBuiltinCall>(mod.Types().i32(), BuiltinFn::kLength, access);
+
+    auto* new_b = clone_ctx.Clone(builtin);
+
+    EXPECT_NE(builtin, new_b);
+    EXPECT_NE(builtin->Result(0), new_b->Result(0));
+    EXPECT_EQ(mod.Types().i32(), new_b->Result(0)->Type());
+
+    EXPECT_EQ(BuiltinFn::kLength, new_b->Func());
+    EXPECT_TRUE(new_b->Object()->Type()->UnwrapPtr()->Is<core::type::Array>());
+
+    auto args = new_b->Args();
+    ASSERT_EQ(0u, args.Length());
+}
+
+TEST_F(IR_GlslMemberBuiltinCallTest, DoesNotMatchIncorrectType) {
+    auto* sb = ty.Struct(mod.symbols.New("SB"), {
+                                                    {mod.symbols.New("a"), ty.u32()},
+                                                });
+    auto* var = b.Var("v", storage, sb, core::Access::kReadWrite);
+    var->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(var);
+
+    auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        auto* access = b.Access(ty.ptr<storage, u32, read_write>(), var, 0_u);
+        b.Let("x", b.MemberCall<MemberBuiltinCall>(mod.Types().i32(), BuiltinFn::kLength, access));
+
+        b.Return(func);
+    });
+
+    auto res = core::ir::Validate(mod);
+    ASSERT_NE(res, Success);
+    EXPECT_EQ(res.Failure().reason.Str(),
+              R"(:12:17 error: length: no matching call to 'length(ptr<storage, u32, read_write>)'
+
+1 candidate function:
+ • 'length(ptr<storage, array<T>, A>  ✗ ) -> i32'
+
+    %4:i32 = %3.length
+                ^^^^^^
+
+:10:3 note: in block
+  $B2: {
+  ^^^
+
+note: # Disassembly
+SB = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+$B1: {  # root
+  %v:ptr<storage, SB, read_write> = var @binding_point(0, 0)
+}
+
+%foo = @fragment func():void {
+  $B2: {
+    %3:ptr<storage, u32, read_write> = access %v, 0u
+    %4:i32 = %3.length
+    %x:i32 = let %4
+    ret
+  }
+}
+)");
+}
+
+}  // namespace
+}  // namespace tint::glsl::ir
diff --git a/src/tint/lang/glsl/writer/builtin_test.cc b/src/tint/lang/glsl/writer/builtin_test.cc
index 45c90f3..c637844 100644
--- a/src/tint/lang/glsl/writer/builtin_test.cc
+++ b/src/tint/lang/glsl/writer/builtin_test.cc
@@ -1422,5 +1422,35 @@
 )");
 }
 
+TEST_F(GlslWriterTest, BuiltinArrayLength) {
+    auto* sb = ty.Struct(mod.symbols.New("SB"), {
+                                                    {mod.symbols.New("b"), ty.array<u32>()},
+                                                });
+
+    auto* var = b.Var("v", storage, sb, core::Access::kReadWrite);
+    var->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(var);
+
+    auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        auto* ary = b.Access(ty.ptr<storage, array<u32>, read_write>(), var, 0_u);
+        b.Let("x", b.Call(ty.u32(), core::BuiltinFn::kArrayLength, ary));
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_.glsl;
+    EXPECT_EQ(output_.glsl, GlslHeader() + R"(precision highp float;
+precision highp int;
+
+layout(binding = 0, std430)
+buffer SB_1_ssbo {
+  uint b[];
+} v;
+void main() {
+  uint x = uint(v.b.length());
+}
+)");
+}
+
 }  // namespace
 }  // namespace tint::glsl::writer
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc
index deb1f61..582fc35 100644
--- a/src/tint/lang/glsl/writer/printer/printer.cc
+++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -81,6 +81,7 @@
 #include "src/tint/lang/core/type/vector.h"
 #include "src/tint/lang/core/type/void.h"
 #include "src/tint/lang/glsl/ir/builtin_call.h"
+#include "src/tint/lang/glsl/ir/member_builtin_call.h"
 #include "src/tint/lang/glsl/ir/ternary.h"
 #include "src/tint/lang/glsl/writer/common/printer_support.h"
 #include "src/tint/lang/glsl/writer/common/version.h"
@@ -1103,7 +1104,10 @@
                     [&](const core::ir::Var* var) { out << NameOf(var->Result(0)); },
 
                     [&](const glsl::ir::BuiltinCall* c) { EmitGlslBuiltinCall(out, c); },  //
-                    [&](const glsl::ir::Ternary* t) { EmitTernary(out, t); },              //
+                    [&](const glsl::ir::MemberBuiltinCall* mbc) {
+                        EmitGlslMemberBuiltinCall(out, mbc);
+                    },
+                    [&](const glsl::ir::Ternary* t) { EmitTernary(out, t); },  //
 
                     TINT_ICE_ON_NO_MATCH);
             },
@@ -1112,6 +1116,21 @@
             TINT_ICE_ON_NO_MATCH);
     }
 
+    void EmitGlslMemberBuiltinCall(StringStream& out, const glsl::ir::MemberBuiltinCall* c) {
+        EmitValue(out, c->Object());
+        out << "." << c->Func() << "(";
+
+        bool needs_comma = false;
+        for (const auto* arg : c->Args()) {
+            if (needs_comma) {
+                out << ", ";
+            }
+            EmitValue(out, arg);
+            needs_comma = true;
+        }
+        out << ")";
+    }
+
     void EmitGlslBuiltinCall(StringStream& out, const glsl::ir::BuiltinCall* c) {
         // The atomic subtract is an add in GLSL. If the value is a u32, it just negates the u32 and
         // GLSL handles it. We don't have u32 negation in the IR, so fake it in the printer.
diff --git a/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc b/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc
index 4859832..841168e 100644
--- a/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc
@@ -42,6 +42,7 @@
 #include "src/tint/lang/core/type/storage_texture.h"
 #include "src/tint/lang/glsl/builtin_fn.h"
 #include "src/tint/lang/glsl/ir/builtin_call.h"
+#include "src/tint/lang/glsl/ir/member_builtin_call.h"
 #include "src/tint/lang/glsl/ir/ternary.h"
 
 namespace tint::glsl::writer::raise {
@@ -67,6 +68,7 @@
         for (auto* inst : ir.Instructions()) {
             if (auto* call = inst->As<core::ir::CoreBuiltinCall>()) {
                 switch (call->Func()) {
+                    case core::BuiltinFn::kArrayLength:
                     case core::BuiltinFn::kAtomicCompareExchangeWeak:
                     case core::BuiltinFn::kAtomicSub:
                     case core::BuiltinFn::kAtomicLoad:
@@ -94,6 +96,9 @@
         // Replace the builtin calls that we found
         for (auto* call : call_worklist) {
             switch (call->Func()) {
+                case core::BuiltinFn::kArrayLength:
+                    ArrayLength(call);
+                    break;
                 case core::BuiltinFn::kAtomicCompareExchangeWeak:
                     AtomicCompareExchangeWeak(call);
                     break;
@@ -141,6 +146,15 @@
         }
     }
 
+    void ArrayLength(core::ir::Call* call) {
+        b.InsertBefore(call, [&] {
+            auto* len = b.MemberCall<glsl::ir::MemberBuiltinCall>(ty.i32(), BuiltinFn::kLength,
+                                                                  call->Args()[0]);
+            b.ConvertWithResult(call->DetachResult(), len->Result(0));
+        });
+        call->Destroy();
+    }
+
     void ExtractBits(core::ir::Call* call) {
         b.InsertBefore(call, [&] {
             auto args = call->Args();
diff --git a/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc
index d785a78..b91402c 100644
--- a/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc
@@ -1394,5 +1394,65 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(GlslWriter_BuiltinPolyfillTest, ArrayLength) {
+    auto* sb = ty.Struct(mod.symbols.New("SB"), {
+                                                    {mod.symbols.New("b"), ty.array<u32>()},
+                                                });
+
+    auto* var = b.Var("v", storage, sb, core::Access::kReadWrite);
+    var->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(var);
+
+    auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        auto* ary = b.Access(ty.ptr<storage, array<u32>, read_write>(), var, 0_u);
+        b.Let("x", b.Call(ty.u32(), core::BuiltinFn::kArrayLength, ary));
+        b.Return(func);
+    });
+
+    auto* src = R"(
+SB = struct @align(4) {
+  b:array<u32> @offset(0)
+}
+
+$B1: {  # root
+  %v:ptr<storage, SB, read_write> = var @binding_point(0, 0)
+}
+
+%foo = @fragment func():void {
+  $B2: {
+    %3:ptr<storage, array<u32>, read_write> = access %v, 0u
+    %4:u32 = arrayLength %3
+    %x:u32 = let %4
+    ret
+  }
+}
+)";
+    ASSERT_EQ(src, str());
+
+    auto* expect = R"(
+SB = struct @align(4) {
+  b:array<u32> @offset(0)
+}
+
+$B1: {  # root
+  %v:ptr<storage, SB, read_write> = var @binding_point(0, 0)
+}
+
+%foo = @fragment func():void {
+  $B2: {
+    %3:ptr<storage, array<u32>, read_write> = access %v, 0u
+    %4:i32 = %3.length
+    %5:u32 = convert %4
+    %x:u32 = let %5
+    ret
+  }
+}
+)";
+
+    Run(BuiltinPolyfill);
+    EXPECT_EQ(expect, str());
+}
+
 }  // namespace
 }  // namespace tint::glsl::writer::raise
diff --git a/test/tint/bug/chromium/1290107.wgsl.expected.ir.glsl b/test/tint/bug/chromium/1290107.wgsl.expected.ir.glsl
index ffd961c..e938743 100644
--- a/test/tint/bug/chromium/1290107.wgsl.expected.ir.glsl
+++ b/test/tint/bug/chromium/1290107.wgsl.expected.ir.glsl
@@ -1,11 +1,15 @@
-SKIP: FAILED
+#version 310 es
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
 
-tint executable returned error: signal: trace/BPT trap
+struct S {
+  float f;
+};
+
+layout(binding = 0, std430)
+buffer tint_symbol_2_1_ssbo {
+  S tint_symbol_1[];
+} v;
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  uint len = uint(v.tint_symbol_1.length());
+}
diff --git a/test/tint/bug/tint/1725.wgsl.expected.ir.glsl b/test/tint/bug/tint/1725.wgsl.expected.ir.glsl
index ffd961c..dfabfdf 100644
--- a/test/tint/bug/tint/1725.wgsl.expected.ir.glsl
+++ b/test/tint/bug/tint/1725.wgsl.expected.ir.glsl
@@ -1,11 +1,16 @@
-SKIP: FAILED
+#version 310 es
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
-
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_8_1_ssbo {
+  uint tint_symbol_7[];
+} v;
+void tint_symbol_1_inner(uint tint_symbol_2) {
+  int tint_symbol_3 = 0;
+  int tint_symbol_4 = 0;
+  int tint_symbol_5 = 0;
+  uint tint_symbol_6 = v.tint_symbol_7[min(tint_symbol_2, (uint(v.tint_symbol_7.length()) - 1u))];
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  tint_symbol_1_inner(gl_LocalInvocationIndex);
+}
diff --git a/test/tint/bug/tint/2177.wgsl.expected.ir.glsl b/test/tint/bug/tint/2177.wgsl.expected.ir.glsl
index ffd961c..0d8a144 100644
--- a/test/tint/bug/tint/2177.wgsl.expected.ir.glsl
+++ b/test/tint/bug/tint/2177.wgsl.expected.ir.glsl
@@ -1,11 +1,19 @@
-SKIP: FAILED
+#version 310 es
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
-
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_2_1_ssbo {
+  uint tint_symbol_1[];
+} v;
+uint f2() {
+  return uint(v.tint_symbol_1.length());
+}
+uint f1() {
+  return f2();
+}
+uint f0() {
+  return f1();
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol_1[0] = f0();
+}
diff --git a/test/tint/builtins/arrayLength/simple.wgsl.expected.ir.glsl b/test/tint/builtins/arrayLength/simple.wgsl.expected.ir.glsl
index ffd961c..7d70253 100644
--- a/test/tint/builtins/arrayLength/simple.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/arrayLength/simple.wgsl.expected.ir.glsl
@@ -1,11 +1,10 @@
-SKIP: FAILED
+#version 310 es
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
-
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer S_1_ssbo {
+  int a[];
+} G;
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  uint l1 = uint(G.a.length());
+}
diff --git a/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.ir.glsl b/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.ir.glsl
index ffd961c..598d6eb 100644
--- a/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.ir.glsl
@@ -1,11 +1,10 @@
-SKIP: FAILED
+#version 310 es
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
-
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_2_1_ssbo {
+  int tint_symbol_1[];
+} v;
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  uint l1 = uint(v.tint_symbol_1.length());
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.ir.glsl
index ffd961c..6271dc7 100644
--- a/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.ir.glsl
@@ -1,11 +1,68 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  int arg_0[];
+} sb_ro;
+uint arrayLength_1588cd() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_1588cd();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  int arg_0[];
+} sb_ro;
+uint arrayLength_1588cd() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_1588cd();
+}
+#version 310 es
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  int arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_1588cd() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_1588cd();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.ir.glsl
index ffd961c..9684fc2 100644
--- a/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.ir.glsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  int arg_0[];
+} sb_rw;
+uint arrayLength_61b1c7() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_61b1c7();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  int arg_0[];
+} sb_rw;
+uint arrayLength_61b1c7() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_61b1c7();
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.ir.glsl
index ffd961c..5bc9079 100644
--- a/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.ir.glsl
@@ -1,11 +1,71 @@
-SKIP: FAILED
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float16_t arg_0[];
+} sb_ro;
+uint arrayLength_8421b9() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_8421b9();
+}
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float16_t arg_0[];
+} sb_ro;
+uint arrayLength_8421b9() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_8421b9();
+}
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float16_t arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_8421b9() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_8421b9();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.ir.glsl
index ffd961c..dd82fe4 100644
--- a/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.ir.glsl
@@ -1,11 +1,68 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float arg_0[];
+} sb_ro;
+uint arrayLength_a0f5ca() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_a0f5ca();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float arg_0[];
+} sb_ro;
+uint arrayLength_a0f5ca() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_a0f5ca();
+}
+#version 310 es
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_a0f5ca() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_a0f5ca();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.ir.glsl
index ffd961c..004333c 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.ir.glsl
@@ -1,11 +1,39 @@
-SKIP: FAILED
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float16_t arg_0[];
+} sb_rw;
+uint arrayLength_cbd6b5() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_cbd6b5();
+}
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float16_t arg_0[];
+} sb_rw;
+uint arrayLength_cbd6b5() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_cbd6b5();
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.ir.glsl
index ffd961c..ebff2a4 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.ir.glsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float arg_0[];
+} sb_rw;
+uint arrayLength_cdd123() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_cdd123();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float arg_0[];
+} sb_rw;
+uint arrayLength_cdd123() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_cdd123();
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.ir.glsl
index ffd961c..aa2b0b8 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.ir.glsl
@@ -1,11 +1,68 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  uint arg_0[];
+} sb_ro;
+uint arrayLength_cfca0a() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_cfca0a();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  uint arg_0[];
+} sb_ro;
+uint arrayLength_cfca0a() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_cfca0a();
+}
+#version 310 es
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  uint arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_cfca0a() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_cfca0a();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.ir.glsl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.ir.glsl
index ffd961c..fcf2a58 100644
--- a/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.ir.glsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  uint arg_0[];
+} sb_rw;
+uint arrayLength_eb510f() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_eb510f();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  uint arg_0[];
+} sb_rw;
+uint arrayLength_eb510f() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_eb510f();
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.ir.glsl
index ffd961c..6271dc7 100644
--- a/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.ir.glsl
@@ -1,11 +1,68 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  int arg_0[];
+} sb_ro;
+uint arrayLength_1588cd() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_1588cd();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  int arg_0[];
+} sb_ro;
+uint arrayLength_1588cd() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_1588cd();
+}
+#version 310 es
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  int arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_1588cd() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_1588cd();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.ir.glsl
index ffd961c..9684fc2 100644
--- a/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.ir.glsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  int arg_0[];
+} sb_rw;
+uint arrayLength_61b1c7() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_61b1c7();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  int arg_0[];
+} sb_rw;
+uint arrayLength_61b1c7() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_61b1c7();
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.ir.glsl
index ffd961c..5bc9079 100644
--- a/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.ir.glsl
@@ -1,11 +1,71 @@
-SKIP: FAILED
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float16_t arg_0[];
+} sb_ro;
+uint arrayLength_8421b9() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_8421b9();
+}
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float16_t arg_0[];
+} sb_ro;
+uint arrayLength_8421b9() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_8421b9();
+}
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float16_t arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_8421b9() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_8421b9();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.ir.glsl
index ffd961c..dd82fe4 100644
--- a/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.ir.glsl
@@ -1,11 +1,68 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float arg_0[];
+} sb_ro;
+uint arrayLength_a0f5ca() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_a0f5ca();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float arg_0[];
+} sb_ro;
+uint arrayLength_a0f5ca() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_a0f5ca();
+}
+#version 310 es
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  float arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_a0f5ca() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_a0f5ca();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.ir.glsl
index ffd961c..004333c 100644
--- a/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.ir.glsl
@@ -1,11 +1,39 @@
-SKIP: FAILED
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float16_t arg_0[];
+} sb_rw;
+uint arrayLength_cbd6b5() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_cbd6b5();
+}
+#version 310 es
+#extension GL_AMD_gpu_shader_half_float: require
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float16_t arg_0[];
+} sb_rw;
+uint arrayLength_cbd6b5() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_cbd6b5();
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.ir.glsl
index ffd961c..ebff2a4 100644
--- a/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.ir.glsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float arg_0[];
+} sb_rw;
+uint arrayLength_cdd123() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_cdd123();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  float arg_0[];
+} sb_rw;
+uint arrayLength_cdd123() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_cdd123();
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.ir.glsl
index ffd961c..aa2b0b8 100644
--- a/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.ir.glsl
@@ -1,11 +1,68 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  uint arg_0[];
+} sb_ro;
+uint arrayLength_cfca0a() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_cfca0a();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  uint arg_0[];
+} sb_ro;
+uint arrayLength_cfca0a() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_cfca0a();
+}
+#version 310 es
+
+
+struct VertexOutput {
+  vec4 pos;
+  uint prevent_dce;
+};
+
+layout(binding = 1, std430)
+buffer SB_RO_1_ssbo {
+  uint arg_0[];
+} sb_ro;
+layout(location = 0) flat out uint vertex_main_loc0_Output;
+uint arrayLength_cfca0a() {
+  uint res = uint(sb_ro.arg_0.length());
+  return res;
+}
+VertexOutput vertex_main_inner() {
+  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), 0u);
+  tint_symbol.pos = vec4(0.0f);
+  tint_symbol.prevent_dce = arrayLength_cfca0a();
+  return tint_symbol;
+}
+void main() {
+  VertexOutput v = vertex_main_inner();
+  gl_Position = v.pos;
+  gl_Position[1u] = -(gl_Position.y);
+  gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
+  vertex_main_loc0_Output = v.prevent_dce;
+  gl_PointSize = 1.0f;
+}
diff --git a/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.ir.glsl
index ffd961c..fcf2a58 100644
--- a/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.ir.glsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+#version 310 es
+precision highp float;
+precision highp int;
 
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  uint arg_0[];
+} sb_rw;
+uint arrayLength_eb510f() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+void main() {
+  v.tint_symbol = arrayLength_eb510f();
+}
+#version 310 es
 
-tint executable returned error: signal: trace/BPT trap
+layout(binding = 0, std430)
+buffer tint_symbol_1_1_ssbo {
+  uint tint_symbol;
+} v;
+layout(binding = 1, std430)
+buffer SB_RW_1_ssbo {
+  uint arg_0[];
+} sb_rw;
+uint arrayLength_eb510f() {
+  uint res = uint(sb_rw.arg_0.length());
+  return res;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  v.tint_symbol = arrayLength_eb510f();
+}
diff --git a/test/tint/unittest/reader/spirv/SpvParserMemoryTest_ArrayLength_FromAccessChain.spvasm.expected.ir.glsl b/test/tint/unittest/reader/spirv/SpvParserMemoryTest_ArrayLength_FromAccessChain.spvasm.expected.ir.glsl
deleted file mode 100644
index ffd961c..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserMemoryTest_ArrayLength_FromAccessChain.spvasm.expected.ir.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-SKIP: FAILED
-
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
-
-tint executable returned error: signal: trace/BPT trap
diff --git a/test/tint/unittest/reader/spirv/SpvParserMemoryTest_ArrayLength_FromVar.spvasm.expected.ir.glsl b/test/tint/unittest/reader/spirv/SpvParserMemoryTest_ArrayLength_FromVar.spvasm.expected.ir.glsl
deleted file mode 100644
index ffd961c..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserMemoryTest_ArrayLength_FromVar.spvasm.expected.ir.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-SKIP: FAILED
-
-<dawn>/src/tint/lang/glsl/writer/printer/printer.cc:1451 internal compiler error: TINT_UNREACHABLE unhandled core builtin: arrayLength
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
-
-tint executable returned error: signal: trace/BPT trap