Import Tint changes from Dawn

Changes:
  - 4fe7b1132a5249a6b0da48cfeeb9df5fa2b996e9 [ir] Make branch targets comments in disassembly by James Price <jrprice@google.com>
  - 7710e30ee0505d986b54c6f3d41a2f6d6c0bdcbc [ir] Change disassembled block names to $Bn by James Price <jrprice@google.com>
  - 10600c005fe72c2ebda8ec878f63884f213e5d40 [ir] Remove ` -> %b*` from function disassembly by James Price <jrprice@google.com>
  - 9fa001ed71737abb45cb74ca7d812c9bc9e1b754 [tint][fuzz][ast] Add MultiplanarExternalTexture fuzzer by Ben Clayton <bclayton@google.com>
  - 5ef0e21c245e5363a747dbceef3eb24de8d1e803 [tint][fuzz][ast] Add FoldConstants fuzzer by Ben Clayton <bclayton@google.com>
  - 6b4fab68c055edb9a9c20fd4d346b4a6690af377 [tint][fuzz][ast] Add FirstIndexOffset fuzzer by Ben Clayton <bclayton@google.com>
  - 976813e9896696961e217bc696724378a55b2627 [tint][fuzz][ast] Add ExpandCompoundAssignment fuzzer by Ben Clayton <bclayton@google.com>
  - 5b77af631846626212bb4363c89e4f18fba0ce34 [tint][fuzz][ast] Add DisableUniformityAnalysis fuzzer by Ben Clayton <bclayton@google.com>
  - 605f924fef3288c20aac11cfce88e26e398ceeb6 [tint][fuzz] Add basic base-64 comments to dictionary.txt by Ben Clayton <bclayton@google.com>
  - 752629f817e9891be7a86af43758b49a58d4e606 [tint][fuzz][ast] Add DirectVariableAccess fuzzer by Ben Clayton <bclayton@google.com>
  - 32715b7f43746fd3c5afc6af1ead1cbe3bf213ba [tint][fuzz][ast] Add DemoteToHelper fuzzer by Ben Clayton <bclayton@google.com>
  - a56b139b0097721e2427870c04b8b1b1cc074a1f [tint][fuzz][ast] Add ClampFragDepth fuzzer by Ben Clayton <bclayton@google.com>
  - 7320e43c215888610a197bce2ced7e344ff3f103 [tint][fuzz][ast] Add CanonicalizeEntryPointIO fuzzer by Ben Clayton <bclayton@google.com>
  - 8ec8ac6d714a121281269377247b1698770acd34 [tint][fuzz][ast] Add BuiltinPolyfill fuzzer by Ben Clayton <bclayton@google.com>
  - b3484ecaaa6df24b916c1c296ae3a65cf6a3a010 [tint][fuzz][ast] Add BindingRemapper fuzzer by Ben Clayton <bclayton@google.com>
  - 9904db03515a17ac833a86e61b82ed14fb9f9479 [tint][fuzz][glsl] Skip large depth_range_offsets by Ben Clayton <bclayton@google.com>
GitOrigin-RevId: 4fe7b1132a5249a6b0da48cfeeb9df5fa2b996e9
Change-Id: I805af485f22b952cbd26d0eb3f57a1e9dddb2da6
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/185982
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/cmd/fuzz/wgsl/dictionary.txt b/src/tint/cmd/fuzz/wgsl/dictionary.txt
index cc0d9d3..a8a1694 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt
@@ -55,6 +55,9 @@
 "->"
 "."
 "/"
+"// AAAA"
+"// AAAB"
+"// BAAA"
 "/="
 ":"
 ";"
diff --git a/src/tint/cmd/fuzz/wgsl/dictionary.txt.tmpl b/src/tint/cmd/fuzz/wgsl/dictionary.txt.tmpl
index 5ffad37..e5605d7 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt.tmpl
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt.tmpl
@@ -17,7 +17,7 @@
 
 {{- $tokens := List}}
 
-{{- /* ============================== Operators ============================== */ -}}
+{{- /* ========================= Operators & Keywords ======================== */ -}}
 {{- $tokens = Append $tokens
     "!"
     "!="
@@ -105,6 +105,13 @@
     "true" "false"
 -}}
 
+{{- /* =========================== Base64 comments =========================== */ -}}
+{{- $tokens = Append $tokens
+    "// AAAA"
+    "// BAAA"
+    "// AAAB"
+-}}
+
 {{- /* ========================== Builtin functions ========================== */ -}}
 {{- range $W.Sem.Builtins}}{{$tokens = Append $tokens .Name}}{{end -}}
 
diff --git a/src/tint/lang/core/ir/disassembler.cc b/src/tint/lang/core/ir/disassembler.cc
index 281cb61..c31cad8 100644
--- a/src/tint/lang/core/ir/disassembler.cc
+++ b/src/tint/lang/core/ir/disassembler.cc
@@ -184,7 +184,7 @@
     Indent();
 
     SourceMarker sm(this);
-    out_ << "%b" << IdOf(blk) << " = block";
+    out_ << "$B" << IdOf(blk);
     if (auto* merge = blk->As<MultiInBlock>()) {
         if (!merge->Params().IsEmpty()) {
             out_ << " (";
@@ -201,7 +201,7 @@
     }
     sm.Store(blk);
 
-    out_ << " {";
+    out_ << ": {";
     if (!comment.empty()) {
         out_ << "  # " << comment;
     }
@@ -340,7 +340,7 @@
 
     EmitReturnAttributes(func);
 
-    out_ << " -> %b" << IdOf(func->Block()) << " {";
+    out_ << " {";
 
     {  // Add a comment if the function IDs or parameter IDs doesn't match their name
         Vector<std::string, 4> names;
@@ -621,9 +621,9 @@
 
     bool has_false = !if_->False()->IsEmpty();
 
-    out_ << " [t: %b" << IdOf(if_->True());
+    out_ << " [t: $B" << IdOf(if_->True());
     if (has_false) {
-        out_ << ", f: %b" << IdOf(if_->False());
+        out_ << ", f: $B" << IdOf(if_->False());
     }
     out_ << "]";
     sm.Store(if_);
@@ -657,12 +657,12 @@
 void Disassembler::EmitLoop(const Loop* l) {
     Vector<std::string, 3> parts;
     if (!l->Initializer()->IsEmpty()) {
-        parts.Push("i: %b" + std::to_string(IdOf(l->Initializer())));
+        parts.Push("i: $B" + std::to_string(IdOf(l->Initializer())));
     }
-    parts.Push("b: %b" + std::to_string(IdOf(l->Body())));
+    parts.Push("b: $B" + std::to_string(IdOf(l->Body())));
 
     if (!l->Continuing()->IsEmpty()) {
-        parts.Push("c: %b" + std::to_string(IdOf(l->Continuing())));
+        parts.Push("c: $B" + std::to_string(IdOf(l->Continuing())));
     }
     SourceMarker sm(this);
     if (auto results = l->Results(); !results.IsEmpty()) {
@@ -734,7 +734,7 @@
                 EmitValue(selector.val);
             }
         }
-        out_ << ", %b" << IdOf(c.block) << ")";
+        out_ << ", $B" << IdOf(c.block) << ")";
     }
     out_ << "]";
     sm.Store(s);
@@ -760,8 +760,8 @@
             out_ << "ret";
             args_offset = ir::Return::kArgsOperandOffset;
         },
-        [&](const ir::Continue* cont) {
-            out_ << "continue %b" << IdOf(cont->Loop()->Continuing());
+        [&](const ir::Continue*) {
+            out_ << "continue";
             args_offset = ir::Continue::kArgsOperandOffset;
         },
         [&](const ir::ExitIf*) {
@@ -776,15 +776,14 @@
             out_ << "exit_loop";
             args_offset = ir::ExitLoop::kArgsOperandOffset;
         },
-        [&](const ir::NextIteration* ni) {
-            out_ << "next_iteration %b" << IdOf(ni->Loop()->Body());
+        [&](const ir::NextIteration*) {
+            out_ << "next_iteration";
             args_offset = ir::NextIteration::kArgsOperandOffset;
         },
         [&](const ir::Unreachable*) { out_ << "unreachable"; },
         [&](const ir::BreakIf* bi) {
             out_ << "break_if ";
             EmitValue(bi->Condition());
-            out_ << " %b" << IdOf(bi->Loop()->Body());
             args_offset = ir::BreakIf::kArgsOperandOffset;
         },
         [&](const ir::TerminateInvocation*) { out_ << "terminate_invocation"; },
@@ -797,10 +796,16 @@
     sm.Store(b);
 
     tint::Switch(
-        b,                                                                        //
-        [&](const ir::ExitIf* e) { out_ << "  # " << NameOf(e->If()); },          //
-        [&](const ir::ExitSwitch* e) { out_ << "  # " << NameOf(e->Switch()); },  //
-        [&](const ir::ExitLoop* e) { out_ << "  # " << NameOf(e->Loop()); }       //
+        b,  //
+        [&](const ir::BreakIf* bi) {
+            out_ << "  # -> [t: exit_loop " << NameOf(bi->Loop()) << ", f: $B"
+                 << IdOf(bi->Loop()->Body()) << "]";
+        },                                                                                     //
+        [&](const ir::Continue* c) { out_ << "  # -> $B" << IdOf(c->Loop()->Continuing()); },  //
+        [&](const ir::ExitIf* e) { out_ << "  # " << NameOf(e->If()); },                       //
+        [&](const ir::ExitSwitch* e) { out_ << "  # " << NameOf(e->Switch()); },               //
+        [&](const ir::ExitLoop* e) { out_ << "  # " << NameOf(e->Loop()); },                   //
+        [&](const ir::NextIteration* ni) { out_ << "  # -> $B" << IdOf(ni->Loop()->Body()); }  //
     );
 }
 
diff --git a/src/tint/lang/core/ir/transform/add_empty_entry_point_test.cc b/src/tint/lang/core/ir/transform/add_empty_entry_point_test.cc
index 541b68e..6a449d7 100644
--- a/src/tint/lang/core/ir/transform/add_empty_entry_point_test.cc
+++ b/src/tint/lang/core/ir/transform/add_empty_entry_point_test.cc
@@ -38,8 +38,8 @@
 
 TEST_F(IR_AddEmptyEntryPointTest, EmptyModule) {
     auto* expect = R"(
-%unused_entry_point = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%unused_entry_point = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     ret
   }
 }
@@ -55,8 +55,8 @@
     ep->Block()->Append(b.Return(ep));
 
     auto* expect = R"(
-%main = @fragment func():void -> %b1 {
-  %b1 = block {
+%main = @fragment func():void {
+  $B1: {
     ret
   }
 }
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc
index 7028d4e..1e4b39e 100644
--- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc
+++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc
@@ -45,8 +45,8 @@
     func->Block()->Append(b.Return(func));
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     ret
   }
 }
@@ -78,12 +78,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void {
+  $B2: {
     %5:texture_storage_2d<rgba8unorm, write> = load %texture
     %6:void = textureStore %5, %coords, %value
     ret
@@ -115,8 +115,8 @@
     });
 
     auto* src = R"(
-%foo = func(%texture:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%texture:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {
+  $B1: {
     %5:void = textureStore %texture, %coords, %value
     ret
   }
@@ -151,12 +151,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<bgra8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void {
+  $B2: {
     %5:texture_storage_2d<bgra8unorm, write> = load %texture
     %6:void = textureStore %5, %coords, %value
     ret
@@ -164,12 +164,12 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void {
+  $B2: {
     %5:texture_storage_2d<rgba8unorm, write> = load %texture
     %6:vec4<f32> = swizzle %value, zyxw
     %7:void = textureStore %5, %coords, %6
@@ -201,16 +201,16 @@
     });
 
     auto* src = R"(
-%foo = func(%texture:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%texture:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {
+  $B1: {
     %5:void = textureStore %texture, %coords, %value
     ret
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%texture:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%texture:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {
+  $B1: {
     %5:vec4<f32> = swizzle %value, zyxw
     %6:void = textureStore %texture, %coords, %5
     ret
@@ -259,18 +259,18 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<bgra8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%bar = func(%texture_1:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b2 {  # %texture_1: 'texture'
-  %b2 = block {
+%bar = func(%texture_1:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {  # %texture_1: 'texture'
+  $B2: {
     %6:void = textureStore %texture_1, %coords, %value
     ret
   }
 }
-%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %10:texture_storage_2d<bgra8unorm, write> = load %texture
     %11:void = call %bar, %10, %coords_1, %value_1
     ret
@@ -278,19 +278,19 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%bar = func(%texture_1:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b2 {  # %texture_1: 'texture'
-  %b2 = block {
+%bar = func(%texture_1:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {  # %texture_1: 'texture'
+  $B2: {
     %6:vec4<f32> = swizzle %value, zyxw
     %7:void = textureStore %texture_1, %coords, %6
     ret
   }
 }
-%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %11:texture_storage_2d<rgba8unorm, write> = load %texture
     %12:void = call %bar, %11, %coords_1, %value_1
     ret
@@ -351,22 +351,22 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture_a:ptr<handle, texture_storage_2d<bgra8unorm, write>, read> = var @binding_point(1, 2)
   %texture_b:ptr<handle, texture_storage_2d<bgra8unorm, write>, read> = var @binding_point(1, 3)
   %texture_c:ptr<handle, texture_storage_2d<bgra8unorm, write>, read> = var @binding_point(1, 4)
 }
 
-%bar = func(%texture_a_1:texture_storage_2d<bgra8unorm, write>, %texture_b_1:texture_storage_2d<bgra8unorm, write>, %texture_b_2:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b2 {  # %texture_a_1: 'texture_a', %texture_b_1: 'texture_b', %texture_b_2: 'texture_b'
-  %b2 = block {
+%bar = func(%texture_a_1:texture_storage_2d<bgra8unorm, write>, %texture_b_1:texture_storage_2d<bgra8unorm, write>, %texture_b_2:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {  # %texture_a_1: 'texture_a', %texture_b_1: 'texture_b', %texture_b_2: 'texture_b'
+  $B2: {
     %10:void = textureStore %texture_a_1, %coords, %value
     %11:void = textureStore %texture_b_1, %coords, %value
     %12:void = textureStore %texture_b_2, %coords, %value
     ret
   }
 }
-%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %16:texture_storage_2d<bgra8unorm, write> = load %texture_a
     %17:texture_storage_2d<bgra8unorm, write> = load %texture_b
     %18:texture_storage_2d<bgra8unorm, write> = load %texture_c
@@ -376,14 +376,14 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture_a:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 2)
   %texture_b:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 3)
   %texture_c:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 4)
 }
 
-%bar = func(%texture_a_1:texture_storage_2d<rgba8unorm, write>, %texture_b_1:texture_storage_2d<rgba8unorm, write>, %texture_b_2:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b2 {  # %texture_a_1: 'texture_a', %texture_b_1: 'texture_b', %texture_b_2: 'texture_b'
-  %b2 = block {
+%bar = func(%texture_a_1:texture_storage_2d<rgba8unorm, write>, %texture_b_1:texture_storage_2d<rgba8unorm, write>, %texture_b_2:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {  # %texture_a_1: 'texture_a', %texture_b_1: 'texture_b', %texture_b_2: 'texture_b'
+  $B2: {
     %10:vec4<f32> = swizzle %value, zyxw
     %11:void = textureStore %texture_a_1, %coords, %10
     %12:vec4<f32> = swizzle %value, zyxw
@@ -393,8 +393,8 @@
     ret
   }
 }
-%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %19:texture_storage_2d<rgba8unorm, write> = load %texture_a
     %20:texture_storage_2d<rgba8unorm, write> = load %texture_b
     %21:texture_storage_2d<rgba8unorm, write> = load %texture_c
@@ -451,20 +451,20 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<bgra8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%bar = func(%texture_1:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b2 {  # %texture_1: 'texture'
-  %b2 = block {
+%bar = func(%texture_1:texture_storage_2d<bgra8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {  # %texture_1: 'texture'
+  $B2: {
     %6:void = textureStore %texture_1, %coords, %value
     %7:void = textureStore %texture_1, %coords, %value
     %8:void = textureStore %texture_1, %coords, %value
     ret
   }
 }
-%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %12:texture_storage_2d<bgra8unorm, write> = load %texture
     %13:void = textureStore %12, %coords_1, %value_1
     %14:texture_storage_2d<bgra8unorm, write> = load %texture
@@ -476,12 +476,12 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%bar = func(%texture_1:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void -> %b2 {  # %texture_1: 'texture'
-  %b2 = block {
+%bar = func(%texture_1:texture_storage_2d<rgba8unorm, write>, %coords:vec2<u32>, %value:vec4<f32>):void {  # %texture_1: 'texture'
+  $B2: {
     %6:vec4<f32> = swizzle %value, zyxw
     %7:void = textureStore %texture_1, %coords, %6
     %8:vec4<f32> = swizzle %value, zyxw
@@ -491,8 +491,8 @@
     ret
   }
 }
-%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%foo = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %15:texture_storage_2d<rgba8unorm, write> = load %texture
     %16:vec4<f32> = swizzle %value_1, zyxw
     %17:void = textureStore %15, %coords_1, %16
@@ -533,12 +533,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d_array<bgra8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void {
+  $B2: {
     %5:texture_storage_2d_array<bgra8unorm, write> = load %texture
     %6:void = textureStore %5, %coords, %index, %value
     ret
@@ -546,12 +546,12 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d_array<rgba8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:vec4<f32>, %coords:vec2<u32>):void {
+  $B2: {
     %5:texture_storage_2d_array<rgba8unorm, write> = load %texture
     %6:vec4<f32> = swizzle %value, zyxw
     %7:void = textureStore %5, %coords, %index, %6
@@ -585,12 +585,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<bgra8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func():vec2<u32> -> %b2 {
-  %b2 = block {
+%foo = func():vec2<u32> {
+  $B2: {
     %3:texture_storage_2d<bgra8unorm, write> = load %texture
     %dims:vec2<u32> = textureDimensions %3
     ret %dims
@@ -598,12 +598,12 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func():vec2<u32> -> %b2 {
-  %b2 = block {
+%foo = func():vec2<u32> {
+  $B2: {
     %3:texture_storage_2d<rgba8unorm, write> = load %texture
     %dims:vec2<u32> = textureDimensions %3
     ret %dims
@@ -638,12 +638,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<bgra8unorm, read>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%coords:vec2<u32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):vec4<f32> {
+  $B2: {
     %4:texture_storage_2d<bgra8unorm, read> = load %texture
     %result:vec4<f32> = textureLoad %4, %coords
     ret %result
@@ -651,12 +651,12 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, read>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%coords:vec2<u32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):vec4<f32> {
+  $B2: {
     %4:texture_storage_2d<rgba8unorm, read> = load %texture
     %result:vec4<f32> = textureLoad %4, %coords
     %6:vec4<f32> = swizzle %result, zyxw
@@ -693,12 +693,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<bgra8unorm, read_write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):void {
+  $B2: {
     %4:texture_storage_2d<bgra8unorm, read_write> = load %texture
     %result:vec4<f32> = textureLoad %4, %coords
     %6:void = textureStore %4, %coords, %result
@@ -707,12 +707,12 @@
 }
 )";
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, read_write>, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):void {
+  $B2: {
     %4:texture_storage_2d<rgba8unorm, read_write> = load %texture
     %result:vec4<f32> = textureLoad %4, %coords
     %6:vec4<f32> = swizzle %result, zyxw
diff --git a/src/tint/lang/core/ir/transform/binary_polyfill_test.cc b/src/tint/lang/core/ir/transform/binary_polyfill_test.cc
index 314ac0c..1711351 100644
--- a/src/tint/lang/core/ir/transform/binary_polyfill_test.cc
+++ b/src/tint/lang/core/ir/transform/binary_polyfill_test.cc
@@ -65,8 +65,8 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftLeft_NoPolyfill) {
     Build(BinaryOp::kShiftLeft, ty.i32(), ty.i32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
     %result:i32 = shl %lhs, %rhs
     ret %result
   }
@@ -85,8 +85,8 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftRight_NoPolyfill) {
     Build(BinaryOp::kShiftRight, ty.i32(), ty.i32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
     %result:i32 = shr %lhs, %rhs
     ret %result
   }
@@ -105,16 +105,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftLeft_I32) {
     Build(BinaryOp::kShiftLeft, ty.i32(), ty.i32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
     %result:i32 = shl %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
     %4:u32 = and %rhs, 31u
     %result:i32 = shl %lhs, %4
     ret %result
@@ -133,16 +133,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftLeft_U32) {
     Build(BinaryOp::kShiftLeft, ty.u32(), ty.u32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %result:u32 = shl %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %4:u32 = and %rhs, 31u
     %result:u32 = shl %lhs, %4
     ret %result
@@ -161,16 +161,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftLeft_Vec2I32) {
     Build(BinaryOp::kShiftLeft, ty.vec2<i32>(), ty.vec2<i32>(), ty.vec2<u32>());
     auto* src = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = shl %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> {
+  $B1: {
     %4:vec2<u32> = and %rhs, vec2<u32>(31u)
     %result:vec2<i32> = shl %lhs, %4
     ret %result
@@ -189,16 +189,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftLeft_Vec3U32) {
     Build(BinaryOp::kShiftLeft, ty.vec3<u32>(), ty.vec3<u32>(), ty.vec3<u32>());
     auto* src = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %result:vec3<u32> = shl %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %4:vec3<u32> = and %rhs, vec3<u32>(31u)
     %result:vec3<u32> = shl %lhs, %4
     ret %result
@@ -217,16 +217,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftRight_I32) {
     Build(BinaryOp::kShiftRight, ty.i32(), ty.i32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
     %result:i32 = shr %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:u32):i32 {
+  $B1: {
     %4:u32 = and %rhs, 31u
     %result:i32 = shr %lhs, %4
     ret %result
@@ -245,16 +245,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftRight_U32) {
     Build(BinaryOp::kShiftRight, ty.u32(), ty.u32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %result:u32 = shr %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %4:u32 = and %rhs, 31u
     %result:u32 = shr %lhs, %4
     ret %result
@@ -273,16 +273,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftRight_Vec2I32) {
     Build(BinaryOp::kShiftRight, ty.vec2<i32>(), ty.vec2<i32>(), ty.vec2<u32>());
     auto* src = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = shr %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<u32>):vec2<i32> {
+  $B1: {
     %4:vec2<u32> = and %rhs, vec2<u32>(31u)
     %result:vec2<i32> = shr %lhs, %4
     ret %result
@@ -301,16 +301,16 @@
 TEST_F(IR_BinaryPolyfillTest, ShiftRight_Vec3U32) {
     Build(BinaryOp::kShiftRight, ty.vec3<u32>(), ty.vec3<u32>(), ty.vec3<u32>());
     auto* src = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %result:vec3<u32> = shr %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %4:vec3<u32> = and %rhs, vec3<u32>(31u)
     %result:vec3<u32> = shr %lhs, %4
     ret %result
@@ -329,8 +329,8 @@
 TEST_F(IR_BinaryPolyfillTest, Divide_NoPolyfill) {
     Build(BinaryOp::kDivide, ty.i32(), ty.i32(), ty.i32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
     %result:i32 = div %lhs, %rhs
     ret %result
   }
@@ -349,8 +349,8 @@
 TEST_F(IR_BinaryPolyfillTest, Modulo_NoPolyfill) {
     Build(BinaryOp::kModulo, ty.i32(), ty.i32(), ty.i32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
     %result:i32 = mod %lhs, %rhs
     ret %result
   }
@@ -369,22 +369,22 @@
 TEST_F(IR_BinaryPolyfillTest, Divide_I32) {
     Build(BinaryOp::kDivide, ty.i32(), ty.i32(), ty.i32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
     %result:i32 = div %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
     %result:i32 = call %tint_div_i32, %lhs, %rhs
     ret %result
   }
 }
-%tint_div_i32 = func(%lhs_1:i32, %rhs_1:i32):i32 -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_div_i32 = func(%lhs_1:i32, %rhs_1:i32):i32 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:bool = eq %rhs_1, 0i
     %9:bool = eq %lhs_1, -2147483648i
     %10:bool = eq %rhs_1, -1i
@@ -408,22 +408,22 @@
 TEST_F(IR_BinaryPolyfillTest, Divide_U32) {
     Build(BinaryOp::kDivide, ty.u32(), ty.u32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %result:u32 = div %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %result:u32 = call %tint_div_u32, %lhs, %rhs
     ret %result
   }
 }
-%tint_div_u32 = func(%lhs_1:u32, %rhs_1:u32):u32 -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_div_u32 = func(%lhs_1:u32, %rhs_1:u32):u32 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:bool = eq %rhs_1, 0u
     %9:u32 = select %rhs_1, 1u, %8
     %10:u32 = div %lhs_1, %9
@@ -443,22 +443,22 @@
 TEST_F(IR_BinaryPolyfillTest, Divide_Vec2I32) {
     Build(BinaryOp::kDivide, ty.vec2<i32>(), ty.vec2<i32>(), ty.vec2<i32>());
     auto* src = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = div %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = call %tint_div_v2i32, %lhs, %rhs
     ret %result
   }
 }
-%tint_div_v2i32 = func(%lhs_1:vec2<i32>, %rhs_1:vec2<i32>):vec2<i32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_div_v2i32 = func(%lhs_1:vec2<i32>, %rhs_1:vec2<i32>):vec2<i32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:vec2<bool> = eq %rhs_1, vec2<i32>(0i)
     %9:vec2<bool> = eq %lhs_1, vec2<i32>(-2147483648i)
     %10:vec2<bool> = eq %rhs_1, vec2<i32>(-1i)
@@ -482,22 +482,22 @@
 TEST_F(IR_BinaryPolyfillTest, Divide_Vec3U32) {
     Build(BinaryOp::kDivide, ty.vec3<u32>(), ty.vec3<u32>(), ty.vec3<u32>());
     auto* src = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %result:vec3<u32> = div %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %result:vec3<u32> = call %tint_div_v3u32, %lhs, %rhs
     ret %result
   }
 }
-%tint_div_v3u32 = func(%lhs_1:vec3<u32>, %rhs_1:vec3<u32>):vec3<u32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_div_v3u32 = func(%lhs_1:vec3<u32>, %rhs_1:vec3<u32>):vec3<u32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:vec3<bool> = eq %rhs_1, vec3<u32>(0u)
     %9:vec3<u32> = select %rhs_1, vec3<u32>(1u), %8
     %10:vec3<u32> = div %lhs_1, %9
@@ -517,22 +517,22 @@
 TEST_F(IR_BinaryPolyfillTest, Modulo_I32) {
     Build(BinaryOp::kModulo, ty.i32(), ty.i32(), ty.i32());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
     %result:i32 = mod %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:i32):i32 {
+  $B1: {
     %result:i32 = call %tint_mod_i32, %lhs, %rhs
     ret %result
   }
 }
-%tint_mod_i32 = func(%lhs_1:i32, %rhs_1:i32):i32 -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_mod_i32 = func(%lhs_1:i32, %rhs_1:i32):i32 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:bool = eq %rhs_1, 0i
     %9:bool = eq %lhs_1, -2147483648i
     %10:bool = eq %rhs_1, -1i
@@ -558,22 +558,22 @@
 TEST_F(IR_BinaryPolyfillTest, Modulo_U32) {
     Build(BinaryOp::kModulo, ty.u32(), ty.u32(), ty.u32());
     auto* src = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %result:u32 = mod %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:u32, %rhs:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:u32, %rhs:u32):u32 {
+  $B1: {
     %result:u32 = call %tint_mod_u32, %lhs, %rhs
     ret %result
   }
 }
-%tint_mod_u32 = func(%lhs_1:u32, %rhs_1:u32):u32 -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_mod_u32 = func(%lhs_1:u32, %rhs_1:u32):u32 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:bool = eq %rhs_1, 0u
     %9:u32 = select %rhs_1, 1u, %8
     %10:u32 = div %lhs_1, %9
@@ -595,22 +595,22 @@
 TEST_F(IR_BinaryPolyfillTest, Modulo_Vec2I32) {
     Build(BinaryOp::kModulo, ty.vec2<i32>(), ty.vec2<i32>(), ty.vec2<i32>());
     auto* src = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = mod %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec2<i32>, %rhs:vec2<i32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = call %tint_mod_v2i32, %lhs, %rhs
     ret %result
   }
 }
-%tint_mod_v2i32 = func(%lhs_1:vec2<i32>, %rhs_1:vec2<i32>):vec2<i32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_mod_v2i32 = func(%lhs_1:vec2<i32>, %rhs_1:vec2<i32>):vec2<i32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:vec2<bool> = eq %rhs_1, vec2<i32>(0i)
     %9:vec2<bool> = eq %lhs_1, vec2<i32>(-2147483648i)
     %10:vec2<bool> = eq %rhs_1, vec2<i32>(-1i)
@@ -636,22 +636,22 @@
 TEST_F(IR_BinaryPolyfillTest, Modulo_Vec3U32) {
     Build(BinaryOp::kModulo, ty.vec3<u32>(), ty.vec3<u32>(), ty.vec3<u32>());
     auto* src = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %result:vec3<u32> = mod %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec3<u32>, %rhs:vec3<u32>):vec3<u32> {
+  $B1: {
     %result:vec3<u32> = call %tint_mod_v3u32, %lhs, %rhs
     ret %result
   }
 }
-%tint_mod_v3u32 = func(%lhs_1:vec3<u32>, %rhs_1:vec3<u32>):vec3<u32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_mod_v3u32 = func(%lhs_1:vec3<u32>, %rhs_1:vec3<u32>):vec3<u32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %8:vec3<bool> = eq %rhs_1, vec3<u32>(0u)
     %9:vec3<u32> = select %rhs_1, vec3<u32>(1u), %8
     %10:vec3<u32> = div %lhs_1, %9
@@ -673,23 +673,23 @@
 TEST_F(IR_BinaryPolyfillTest, Divide_Scalar_Vector) {
     Build(BinaryOp::kDivide, ty.vec4<i32>(), ty.i32(), ty.vec4<i32>());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = div %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = construct %lhs
     %result:vec4<i32> = call %tint_div_v4i32, %4, %rhs
     ret %result
   }
 }
-%tint_div_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_div_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %9:vec4<bool> = eq %rhs_1, vec4<i32>(0i)
     %10:vec4<bool> = eq %lhs_1, vec4<i32>(-2147483648i)
     %11:vec4<bool> = eq %rhs_1, vec4<i32>(-1i)
@@ -713,23 +713,23 @@
 TEST_F(IR_BinaryPolyfillTest, Divide_Vector_Scalar) {
     Build(BinaryOp::kDivide, ty.vec4<i32>(), ty.vec4<i32>(), ty.i32());
     auto* src = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = div %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = construct %rhs
     %result:vec4<i32> = call %tint_div_v4i32, %lhs, %4
     ret %result
   }
 }
-%tint_div_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_div_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %9:vec4<bool> = eq %rhs_1, vec4<i32>(0i)
     %10:vec4<bool> = eq %lhs_1, vec4<i32>(-2147483648i)
     %11:vec4<bool> = eq %rhs_1, vec4<i32>(-1i)
@@ -753,23 +753,23 @@
 TEST_F(IR_BinaryPolyfillTest, Modulo_Scalar_Vector) {
     Build(BinaryOp::kModulo, ty.vec4<i32>(), ty.i32(), ty.vec4<i32>());
     auto* src = R"(
-%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = mod %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:i32, %rhs:vec4<i32>):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = construct %lhs
     %result:vec4<i32> = call %tint_mod_v4i32, %4, %rhs
     ret %result
   }
 }
-%tint_mod_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_mod_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %9:vec4<bool> = eq %rhs_1, vec4<i32>(0i)
     %10:vec4<bool> = eq %lhs_1, vec4<i32>(-2147483648i)
     %11:vec4<bool> = eq %rhs_1, vec4<i32>(-1i)
@@ -795,23 +795,23 @@
 TEST_F(IR_BinaryPolyfillTest, Modulo_Vector_Scalar) {
     Build(BinaryOp::kModulo, ty.vec4<i32>(), ty.vec4<i32>(), ty.i32());
     auto* src = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = mod %lhs, %rhs
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%lhs:vec4<i32>, %rhs:i32):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = construct %rhs
     %result:vec4<i32> = call %tint_mod_v4i32, %lhs, %4
     ret %result
   }
 }
-%tint_mod_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%tint_mod_v4i32 = func(%lhs_1:vec4<i32>, %rhs_1:vec4<i32>):vec4<i32> {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %9:vec4<bool> = eq %rhs_1, vec4<i32>(0i)
     %10:vec4<bool> = eq %lhs_1, vec4<i32>(-2147483648i)
     %11:vec4<bool> = eq %rhs_1, vec4<i32>(-1i)
@@ -893,8 +893,8 @@
     }
 
     auto* src = R"(
-%foo_i32 = func(%lhs:i32, %rhs:i32):void -> %b1 {
-  %b1 = block {
+%foo_i32 = func(%lhs:i32, %rhs:i32):void {
+  $B1: {
     %4:i32 = div %lhs, %rhs
     %5:i32 = div %lhs, %rhs
     %6:i32 = mod %lhs, %rhs
@@ -902,8 +902,8 @@
     ret
   }
 }
-%foo_u32 = func(%lhs_1:u32, %rhs_1:u32):void -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%foo_u32 = func(%lhs_1:u32, %rhs_1:u32):void {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %11:u32 = div %lhs_1, %rhs_1
     %12:u32 = div %lhs_1, %rhs_1
     %13:u32 = mod %lhs_1, %rhs_1
@@ -911,8 +911,8 @@
     ret
   }
 }
-%foo_vec4i = func(%lhs_2:vec4<i32>, %rhs_2:vec4<i32>):void -> %b3 {  # %lhs_2: 'lhs', %rhs_2: 'rhs'
-  %b3 = block {
+%foo_vec4i = func(%lhs_2:vec4<i32>, %rhs_2:vec4<i32>):void {  # %lhs_2: 'lhs', %rhs_2: 'rhs'
+  $B3: {
     %18:vec4<i32> = div %lhs_2, %rhs_2
     %19:vec4<i32> = div %lhs_2, %rhs_2
     %20:vec4<i32> = mod %lhs_2, %rhs_2
@@ -920,8 +920,8 @@
     ret
   }
 }
-%foo_vec4u = func(%lhs_3:vec4<u32>, %rhs_3:vec4<u32>):void -> %b4 {  # %lhs_3: 'lhs', %rhs_3: 'rhs'
-  %b4 = block {
+%foo_vec4u = func(%lhs_3:vec4<u32>, %rhs_3:vec4<u32>):void {  # %lhs_3: 'lhs', %rhs_3: 'rhs'
+  $B4: {
     %25:vec4<u32> = div %lhs_3, %rhs_3
     %26:vec4<u32> = div %lhs_3, %rhs_3
     %27:vec4<u32> = mod %lhs_3, %rhs_3
@@ -931,8 +931,8 @@
 }
 )";
     auto* expect = R"(
-%foo_i32 = func(%lhs:i32, %rhs:i32):void -> %b1 {
-  %b1 = block {
+%foo_i32 = func(%lhs:i32, %rhs:i32):void {
+  $B1: {
     %4:i32 = call %tint_div_i32, %lhs, %rhs
     %6:i32 = call %tint_div_i32, %lhs, %rhs
     %7:i32 = call %tint_mod_i32, %lhs, %rhs
@@ -940,8 +940,8 @@
     ret
   }
 }
-%foo_u32 = func(%lhs_1:u32, %rhs_1:u32):void -> %b2 {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
-  %b2 = block {
+%foo_u32 = func(%lhs_1:u32, %rhs_1:u32):void {  # %lhs_1: 'lhs', %rhs_1: 'rhs'
+  $B2: {
     %13:u32 = call %tint_div_u32, %lhs_1, %rhs_1
     %15:u32 = call %tint_div_u32, %lhs_1, %rhs_1
     %16:u32 = call %tint_mod_u32, %lhs_1, %rhs_1
@@ -949,8 +949,8 @@
     ret
   }
 }
-%foo_vec4i = func(%lhs_2:vec4<i32>, %rhs_2:vec4<i32>):void -> %b3 {  # %lhs_2: 'lhs', %rhs_2: 'rhs'
-  %b3 = block {
+%foo_vec4i = func(%lhs_2:vec4<i32>, %rhs_2:vec4<i32>):void {  # %lhs_2: 'lhs', %rhs_2: 'rhs'
+  $B3: {
     %22:vec4<i32> = call %tint_div_v4i32, %lhs_2, %rhs_2
     %24:vec4<i32> = call %tint_div_v4i32, %lhs_2, %rhs_2
     %25:vec4<i32> = call %tint_mod_v4i32, %lhs_2, %rhs_2
@@ -958,8 +958,8 @@
     ret
   }
 }
-%foo_vec4u = func(%lhs_3:vec4<u32>, %rhs_3:vec4<u32>):void -> %b4 {  # %lhs_3: 'lhs', %rhs_3: 'rhs'
-  %b4 = block {
+%foo_vec4u = func(%lhs_3:vec4<u32>, %rhs_3:vec4<u32>):void {  # %lhs_3: 'lhs', %rhs_3: 'rhs'
+  $B4: {
     %31:vec4<u32> = call %tint_div_v4u32, %lhs_3, %rhs_3
     %33:vec4<u32> = call %tint_div_v4u32, %lhs_3, %rhs_3
     %34:vec4<u32> = call %tint_mod_v4u32, %lhs_3, %rhs_3
@@ -967,8 +967,8 @@
     ret
   }
 }
-%tint_div_i32 = func(%lhs_4:i32, %rhs_4:i32):i32 -> %b5 {  # %lhs_4: 'lhs', %rhs_4: 'rhs'
-  %b5 = block {
+%tint_div_i32 = func(%lhs_4:i32, %rhs_4:i32):i32 {  # %lhs_4: 'lhs', %rhs_4: 'rhs'
+  $B5: {
     %39:bool = eq %rhs_4, 0i
     %40:bool = eq %lhs_4, -2147483648i
     %41:bool = eq %rhs_4, -1i
@@ -979,8 +979,8 @@
     ret %45
   }
 }
-%tint_mod_i32 = func(%lhs_5:i32, %rhs_5:i32):i32 -> %b6 {  # %lhs_5: 'lhs', %rhs_5: 'rhs'
-  %b6 = block {
+%tint_mod_i32 = func(%lhs_5:i32, %rhs_5:i32):i32 {  # %lhs_5: 'lhs', %rhs_5: 'rhs'
+  $B6: {
     %48:bool = eq %rhs_5, 0i
     %49:bool = eq %lhs_5, -2147483648i
     %50:bool = eq %rhs_5, -1i
@@ -993,16 +993,16 @@
     ret %56
   }
 }
-%tint_div_u32 = func(%lhs_6:u32, %rhs_6:u32):u32 -> %b7 {  # %lhs_6: 'lhs', %rhs_6: 'rhs'
-  %b7 = block {
+%tint_div_u32 = func(%lhs_6:u32, %rhs_6:u32):u32 {  # %lhs_6: 'lhs', %rhs_6: 'rhs'
+  $B7: {
     %59:bool = eq %rhs_6, 0u
     %60:u32 = select %rhs_6, 1u, %59
     %61:u32 = div %lhs_6, %60
     ret %61
   }
 }
-%tint_mod_u32 = func(%lhs_7:u32, %rhs_7:u32):u32 -> %b8 {  # %lhs_7: 'lhs', %rhs_7: 'rhs'
-  %b8 = block {
+%tint_mod_u32 = func(%lhs_7:u32, %rhs_7:u32):u32 {  # %lhs_7: 'lhs', %rhs_7: 'rhs'
+  $B8: {
     %64:bool = eq %rhs_7, 0u
     %65:u32 = select %rhs_7, 1u, %64
     %66:u32 = div %lhs_7, %65
@@ -1011,8 +1011,8 @@
     ret %68
   }
 }
-%tint_div_v4i32 = func(%lhs_8:vec4<i32>, %rhs_8:vec4<i32>):vec4<i32> -> %b9 {  # %lhs_8: 'lhs', %rhs_8: 'rhs'
-  %b9 = block {
+%tint_div_v4i32 = func(%lhs_8:vec4<i32>, %rhs_8:vec4<i32>):vec4<i32> {  # %lhs_8: 'lhs', %rhs_8: 'rhs'
+  $B9: {
     %71:vec4<bool> = eq %rhs_8, vec4<i32>(0i)
     %72:vec4<bool> = eq %lhs_8, vec4<i32>(-2147483648i)
     %73:vec4<bool> = eq %rhs_8, vec4<i32>(-1i)
@@ -1023,8 +1023,8 @@
     ret %77
   }
 }
-%tint_mod_v4i32 = func(%lhs_9:vec4<i32>, %rhs_9:vec4<i32>):vec4<i32> -> %b10 {  # %lhs_9: 'lhs', %rhs_9: 'rhs'
-  %b10 = block {
+%tint_mod_v4i32 = func(%lhs_9:vec4<i32>, %rhs_9:vec4<i32>):vec4<i32> {  # %lhs_9: 'lhs', %rhs_9: 'rhs'
+  $B10: {
     %80:vec4<bool> = eq %rhs_9, vec4<i32>(0i)
     %81:vec4<bool> = eq %lhs_9, vec4<i32>(-2147483648i)
     %82:vec4<bool> = eq %rhs_9, vec4<i32>(-1i)
@@ -1037,16 +1037,16 @@
     ret %88
   }
 }
-%tint_div_v4u32 = func(%lhs_10:vec4<u32>, %rhs_10:vec4<u32>):vec4<u32> -> %b11 {  # %lhs_10: 'lhs', %rhs_10: 'rhs'
-  %b11 = block {
+%tint_div_v4u32 = func(%lhs_10:vec4<u32>, %rhs_10:vec4<u32>):vec4<u32> {  # %lhs_10: 'lhs', %rhs_10: 'rhs'
+  $B11: {
     %91:vec4<bool> = eq %rhs_10, vec4<u32>(0u)
     %92:vec4<u32> = select %rhs_10, vec4<u32>(1u), %91
     %93:vec4<u32> = div %lhs_10, %92
     ret %93
   }
 }
-%tint_mod_v4u32 = func(%lhs_11:vec4<u32>, %rhs_11:vec4<u32>):vec4<u32> -> %b12 {  # %lhs_11: 'lhs', %rhs_11: 'rhs'
-  %b12 = block {
+%tint_mod_v4u32 = func(%lhs_11:vec4<u32>, %rhs_11:vec4<u32>):vec4<u32> {  # %lhs_11: 'lhs', %rhs_11: 'rhs'
+  $B12: {
     %96:vec4<bool> = eq %rhs_11, vec4<u32>(0u)
     %97:vec4<u32> = select %rhs_11, vec4<u32>(1u), %96
     %98:vec4<u32> = div %lhs_11, %97
diff --git a/src/tint/lang/core/ir/transform/binding_remapper_test.cc b/src/tint/lang/core/ir/transform/binding_remapper_test.cc
index 11987b7..15eda22 100644
--- a/src/tint/lang/core/ir/transform/binding_remapper_test.cc
+++ b/src/tint/lang/core/ir/transform/binding_remapper_test.cc
@@ -45,7 +45,7 @@
     mod.root_block->Append(buffer);
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(0, 0)
 }
 
@@ -66,7 +66,7 @@
     mod.root_block->Append(buffer);
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(0, 0)
 }
 
@@ -88,7 +88,7 @@
     mod.root_block->Append(buffer);
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(1, 2)
 }
 
@@ -96,7 +96,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(3, 2)
 }
 
@@ -115,7 +115,7 @@
     mod.root_block->Append(buffer);
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(1, 2)
 }
 
@@ -123,7 +123,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(1, 3)
 }
 
@@ -142,7 +142,7 @@
     mod.root_block->Append(buffer);
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(1, 2)
 }
 
@@ -150,7 +150,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, i32, read> = var @binding_point(3, 4)
 }
 
@@ -172,7 +172,7 @@
     mod.root_block->Append(buffer_b);
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer_a:ptr<uniform, i32, read> = var @binding_point(1, 2)
   %buffer_b:ptr<uniform, i32, read> = var @binding_point(3, 4)
 }
@@ -181,7 +181,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer_a:ptr<uniform, i32, read> = var @binding_point(3, 4)
   %buffer_b:ptr<uniform, i32, read> = var @binding_point(1, 2)
 }
@@ -212,13 +212,13 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer_a:ptr<uniform, i32, read> = var @binding_point(1, 2)
   %buffer_b:ptr<uniform, i32, read> = var @binding_point(3, 4)
 }
 
-%main = @fragment func():void -> %b2 {
-  %b2 = block {
+%main = @fragment func():void {
+  $B2: {
     %4:i32 = load %buffer_a
     %5:i32 = load %buffer_b
     ret
@@ -228,13 +228,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer_a:ptr<uniform, i32, read> = var @binding_point(0, 1)
   %buffer_b:ptr<uniform, i32, read> = var @binding_point(0, 1)
 }
 
-%main = @fragment func():void -> %b2 {
-  %b2 = block {
+%main = @fragment func():void {
+  $B2: {
     %4:i32 = load %buffer_a
     %5:i32 = load %buffer_b
     ret
diff --git a/src/tint/lang/core/ir/transform/block_decorated_structs_test.cc b/src/tint/lang/core/ir/transform/block_decorated_structs_test.cc
index 714e39c..f85e4dd 100644
--- a/src/tint/lang/core/ir/transform/block_decorated_structs_test.cc
+++ b/src/tint/lang/core/ir/transform/block_decorated_structs_test.cc
@@ -47,8 +47,8 @@
     func->Block()->Append(b.Return(func));
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     ret
   }
 }
@@ -75,12 +75,12 @@
   tint_symbol:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<uniform, tint_symbol_1, read> = var @binding_point(0, 0)
 }
 
-%foo = func():i32 -> %b2 {
-  %b2 = block {
+%foo = func():i32 {
+  $B2: {
     %3:ptr<uniform, i32, read> = access %1, 0u
     %4:i32 = load %3
     ret %4
@@ -107,12 +107,12 @@
   tint_symbol:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<storage, i32, read_write> = access %1, 0u
     store %3, 42i
     ret
@@ -139,12 +139,12 @@
   tint_symbol:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<push_constant, tint_symbol_1, read> = var
 }
 
-%foo = func():i32 -> %b2 {
-  %b2 = block {
+%foo = func():i32 {
+  $B2: {
     %3:ptr<push_constant, i32, read> = access %1, 0u
     %4:i32 = load %3
     ret %4
@@ -175,12 +175,12 @@
   tint_symbol:array<i32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<storage, array<i32>, read_write> = access %1, 0u
     %4:ptr<storage, i32, read_write> = access %3, 1u
     store %4, 42i
@@ -223,12 +223,12 @@
   arr:array<i32> @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<storage, i32, read_write> = access %1, 0u
     %4:i32 = load %3
     %5:ptr<storage, i32, read_write> = access %1, 1u, 3u
@@ -268,12 +268,12 @@
   arr:array<i32> @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %root:ptr<storage, MyStruct, read_write> = let %1
     %4:ptr<storage, array<i32>, read_write> = access %root, 1u
     %arr:ptr<storage, array<i32>, read_write> = let %4
@@ -316,13 +316,13 @@
   tint_symbol:MyStruct @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read_write> = var @binding_point(0, 0)
   %2:ptr<private, MyStruct, read_write> = var
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %4:MyStruct = load %2
     %5:ptr<storage, MyStruct, read_write> = access %1, 0u
     store %5, %4
@@ -369,14 +369,14 @@
   tint_symbol_4:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read_write> = var @binding_point(0, 0)
   %2:ptr<storage, tint_symbol_3, read_write> = var @binding_point(0, 1)
   %3:ptr<storage, tint_symbol_5, read_write> = var @binding_point(0, 2)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %5:ptr<storage, i32, read_write> = access %2, 0u
     %6:i32 = load %5
     %7:ptr<storage, i32, read_write> = access %3, 0u
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc
index 6c6f910..0e1dd0a 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc
@@ -64,8 +64,8 @@
 TEST_F(IR_BuiltinPolyfillTest, Saturate_NoPolyfill) {
     Build(core::BuiltinFn::kSaturate, ty.f32(), Vector{ty.f32()});
     auto* src = R"(
-%foo = func(%arg:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:f32):f32 {
+  $B1: {
     %result:f32 = saturate %arg
     ret %result
   }
@@ -84,16 +84,16 @@
 TEST_F(IR_BuiltinPolyfillTest, Saturate_F32) {
     Build(core::BuiltinFn::kSaturate, ty.f32(), Vector{ty.f32()});
     auto* src = R"(
-%foo = func(%arg:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:f32):f32 {
+  $B1: {
     %result:f32 = saturate %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:f32):f32 {
+  $B1: {
     %result:f32 = clamp %arg, 0.0f, 1.0f
     ret %result
   }
@@ -111,16 +111,16 @@
 TEST_F(IR_BuiltinPolyfillTest, Saturate_F16) {
     Build(core::BuiltinFn::kSaturate, ty.f16(), Vector{ty.f16()});
     auto* src = R"(
-%foo = func(%arg:f16):f16 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:f16):f16 {
+  $B1: {
     %result:f16 = saturate %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:f16):f16 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:f16):f16 {
+  $B1: {
     %result:f16 = clamp %arg, 0.0h, 1.0h
     ret %result
   }
@@ -137,16 +137,16 @@
 TEST_F(IR_BuiltinPolyfillTest, Saturate_Vec2F32) {
     Build(core::BuiltinFn::kSaturate, ty.vec2<f32>(), Vector{ty.vec2<f32>()});
     auto* src = R"(
-%foo = func(%arg:vec2<f32>):vec2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<f32>):vec2<f32> {
+  $B1: {
     %result:vec2<f32> = saturate %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec2<f32>):vec2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<f32>):vec2<f32> {
+  $B1: {
     %result:vec2<f32> = clamp %arg, vec2<f32>(0.0f), vec2<f32>(1.0f)
     ret %result
   }
@@ -164,16 +164,16 @@
 TEST_F(IR_BuiltinPolyfillTest, Saturate_Vec4F16) {
     Build(core::BuiltinFn::kSaturate, ty.vec4<f16>(), Vector{ty.vec4<f16>()});
     auto* src = R"(
-%foo = func(%arg:vec4<f16>):vec4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<f16>):vec4<f16> {
+  $B1: {
     %result:vec4<f16> = saturate %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec4<f16>):vec4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<f16>):vec4<f16> {
+  $B1: {
     %result:vec4<f16> = clamp %arg, vec4<f16>(0.0h), vec4<f16>(1.0h)
     ret %result
   }
@@ -191,8 +191,8 @@
 TEST_F(IR_BuiltinPolyfillTest, CountLeadingZeros_NoPolyfill) {
     Build(core::BuiltinFn::kCountLeadingZeros, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = countLeadingZeros %arg
     ret %result
   }
@@ -211,16 +211,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountLeadingZeros_U32) {
     Build(core::BuiltinFn::kCountLeadingZeros, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = countLeadingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %3:bool = lte %arg, 65535u
     %4:u32 = select 0u, 16u, %3
     %5:u32 = shl %arg, %4
@@ -259,16 +259,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountLeadingZeros_I32) {
     Build(core::BuiltinFn::kCountLeadingZeros, ty.i32(), Vector{ty.i32()});
     auto* src = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %result:i32 = countLeadingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %3:u32 = bitcast %arg
     %4:bool = lte %3, 65535u
     %5:u32 = select 0u, 16u, %4
@@ -309,16 +309,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountLeadingZeros_Vec2U32) {
     Build(core::BuiltinFn::kCountLeadingZeros, ty.vec2<u32>(), Vector{ty.vec2<u32>()});
     auto* src = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = countLeadingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %3:vec2<bool> = lte %arg, vec2<u32>(65535u)
     %4:vec2<u32> = select vec2<u32>(0u), vec2<u32>(16u), %3
     %5:vec2<u32> = shl %arg, %4
@@ -357,16 +357,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountLeadingZeros_Vec4I32) {
     Build(core::BuiltinFn::kCountLeadingZeros, ty.vec4<i32>(), Vector{ty.vec4<i32>()});
     auto* src = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = countLeadingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %3:vec4<u32> = bitcast %arg
     %4:vec4<bool> = lte %3, vec4<u32>(65535u)
     %5:vec4<u32> = select vec4<u32>(0u), vec4<u32>(16u), %4
@@ -407,8 +407,8 @@
 TEST_F(IR_BuiltinPolyfillTest, CountTrailingZeros_NoPolyfill) {
     Build(core::BuiltinFn::kCountTrailingZeros, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = countTrailingZeros %arg
     ret %result
   }
@@ -427,16 +427,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountTrailingZeros_U32) {
     Build(core::BuiltinFn::kCountTrailingZeros, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = countTrailingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %3:u32 = and %arg, 65535u
     %4:bool = eq %3, 0u
     %5:u32 = select 0u, 16u, %4
@@ -479,16 +479,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountTrailingZeros_I32) {
     Build(core::BuiltinFn::kCountTrailingZeros, ty.i32(), Vector{ty.i32()});
     auto* src = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %result:i32 = countTrailingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %3:u32 = bitcast %arg
     %4:u32 = and %3, 65535u
     %5:bool = eq %4, 0u
@@ -533,16 +533,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountTrailingZeros_Vec2U32) {
     Build(core::BuiltinFn::kCountTrailingZeros, ty.vec2<u32>(), Vector{ty.vec2<u32>()});
     auto* src = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = countTrailingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = and %arg, vec2<u32>(65535u)
     %4:vec2<bool> = eq %3, vec2<u32>(0u)
     %5:vec2<u32> = select vec2<u32>(0u), vec2<u32>(16u), %4
@@ -585,16 +585,16 @@
 TEST_F(IR_BuiltinPolyfillTest, CountTrailingZeros_Vec4I32) {
     Build(core::BuiltinFn::kCountTrailingZeros, ty.vec4<i32>(), Vector{ty.vec4<i32>()});
     auto* src = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = countTrailingZeros %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = countTrailingZeros %arg
     ret %result
   }
@@ -612,8 +612,8 @@
 TEST_F(IR_BuiltinPolyfillTest, ExtractBits_NoPolyfill) {
     Build(core::BuiltinFn::kExtractBits, ty.u32(), Vector{ty.u32(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32):u32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32):u32 {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %result:u32 = extractBits %arg, %arg_1, %arg_2
     ret %result
   }
@@ -632,16 +632,16 @@
 TEST_F(IR_BuiltinPolyfillTest, ExtractBits_ClampArgs_U32) {
     Build(core::BuiltinFn::kExtractBits, ty.u32(), Vector{ty.u32(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32):u32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32):u32 {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %result:u32 = extractBits %arg, %arg_1, %arg_2
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32):u32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32):u32 {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %5:u32 = min %arg_1, 32u
     %6:u32 = sub 32u, %5
     %7:u32 = min %arg_2, %6
@@ -662,16 +662,16 @@
 TEST_F(IR_BuiltinPolyfillTest, ExtractBits_ClampArgs_I32) {
     Build(core::BuiltinFn::kExtractBits, ty.i32(), Vector{ty.i32(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:i32, %arg_1:u32, %arg_2:u32):i32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:i32, %arg_1:u32, %arg_2:u32):i32 {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %result:i32 = extractBits %arg, %arg_1, %arg_2
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:i32, %arg_1:u32, %arg_2:u32):i32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:i32, %arg_1:u32, %arg_2:u32):i32 {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %5:u32 = min %arg_1, 32u
     %6:u32 = sub 32u, %5
     %7:u32 = min %arg_2, %6
@@ -693,16 +693,16 @@
     Build(core::BuiltinFn::kExtractBits, ty.vec2<u32>(),
           Vector{ty.vec2<u32>(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:vec2<u32>, %arg_1:u32, %arg_2:u32):vec2<u32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec2<u32>, %arg_1:u32, %arg_2:u32):vec2<u32> {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %result:vec2<u32> = extractBits %arg, %arg_1, %arg_2
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec2<u32>, %arg_1:u32, %arg_2:u32):vec2<u32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec2<u32>, %arg_1:u32, %arg_2:u32):vec2<u32> {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %5:u32 = min %arg_1, 32u
     %6:u32 = sub 32u, %5
     %7:u32 = min %arg_2, %6
@@ -724,16 +724,16 @@
     Build(core::BuiltinFn::kExtractBits, ty.vec4<i32>(),
           Vector{ty.vec4<i32>(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:vec4<i32>, %arg_1:u32, %arg_2:u32):vec4<i32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec4<i32>, %arg_1:u32, %arg_2:u32):vec4<i32> {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %result:vec4<i32> = extractBits %arg, %arg_1, %arg_2
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>, %arg_1:u32, %arg_2:u32):vec4<i32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec4<i32>, %arg_1:u32, %arg_2:u32):vec4<i32> {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %5:u32 = min %arg_1, 32u
     %6:u32 = sub 32u, %5
     %7:u32 = min %arg_2, %6
@@ -754,8 +754,8 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstLeadingBit_NoPolyfill) {
     Build(core::BuiltinFn::kFirstLeadingBit, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = firstLeadingBit %arg
     ret %result
   }
@@ -774,16 +774,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstLeadingBit_U32) {
     Build(core::BuiltinFn::kFirstLeadingBit, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = firstLeadingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %3:u32 = and %arg, 4294901760u
     %4:bool = eq %3, 0u
     %5:u32 = select 16u, 0u, %4
@@ -825,16 +825,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstLeadingBit_I32) {
     Build(core::BuiltinFn::kFirstLeadingBit, ty.i32(), Vector{ty.i32()});
     auto* src = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %result:i32 = firstLeadingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %3:u32 = bitcast %arg
     %4:u32 = complement %3
     %5:bool = lt %3, 2147483648u
@@ -881,16 +881,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstLeadingBit_Vec2U32) {
     Build(core::BuiltinFn::kFirstLeadingBit, ty.vec2<u32>(), Vector{ty.vec2<u32>()});
     auto* src = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = firstLeadingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = and %arg, vec2<u32>(4294901760u)
     %4:vec2<bool> = eq %3, vec2<u32>(0u)
     %5:vec2<u32> = select vec2<u32>(16u), vec2<u32>(0u), %4
@@ -932,16 +932,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstLeadingBit_Vec4I32) {
     Build(core::BuiltinFn::kFirstLeadingBit, ty.vec4<i32>(), Vector{ty.vec4<i32>()});
     auto* src = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = firstLeadingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %3:vec4<u32> = bitcast %arg
     %4:vec4<u32> = complement %3
     %5:vec4<bool> = lt %3, vec4<u32>(2147483648u)
@@ -988,8 +988,8 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstTrailingBit_NoPolyfill) {
     Build(core::BuiltinFn::kFirstTrailingBit, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = firstTrailingBit %arg
     ret %result
   }
@@ -1008,16 +1008,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstTrailingBit_U32) {
     Build(core::BuiltinFn::kFirstTrailingBit, ty.u32(), Vector{ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %result:u32 = firstTrailingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):u32 {
+  $B1: {
     %3:u32 = and %arg, 65535u
     %4:bool = eq %3, 0u
     %5:u32 = select 0u, 16u, %4
@@ -1059,16 +1059,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstTrailingBit_I32) {
     Build(core::BuiltinFn::kFirstTrailingBit, ty.i32(), Vector{ty.i32()});
     auto* src = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %result:i32 = firstTrailingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:i32):i32 {
+  $B1: {
     %3:u32 = bitcast %arg
     %4:u32 = and %3, 65535u
     %5:bool = eq %4, 0u
@@ -1112,16 +1112,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstTrailingBit_Vec2U32) {
     Build(core::BuiltinFn::kFirstTrailingBit, ty.vec2<u32>(), Vector{ty.vec2<u32>()});
     auto* src = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = firstTrailingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec2<u32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec2<u32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = and %arg, vec2<u32>(65535u)
     %4:vec2<bool> = eq %3, vec2<u32>(0u)
     %5:vec2<u32> = select vec2<u32>(0u), vec2<u32>(16u), %4
@@ -1163,16 +1163,16 @@
 TEST_F(IR_BuiltinPolyfillTest, FirstTrailingBit_Vec4I32) {
     Build(core::BuiltinFn::kFirstTrailingBit, ty.vec4<i32>(), Vector{ty.vec4<i32>()});
     auto* src = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = firstTrailingBit %arg
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):vec4<i32> {
+  $B1: {
     %3:vec4<u32> = bitcast %arg
     %4:vec4<u32> = and %3, vec4<u32>(65535u)
     %5:vec4<bool> = eq %4, vec4<u32>(0u)
@@ -1216,8 +1216,8 @@
 TEST_F(IR_BuiltinPolyfillTest, InsertBits_NoPolyfill) {
     Build(core::BuiltinFn::kInsertBits, ty.u32(), Vector{ty.u32(), ty.u32(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32, %arg_3:u32):u32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32, %arg_3:u32):u32 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %result:u32 = insertBits %arg, %arg_1, %arg_2, %arg_3
     ret %result
   }
@@ -1236,16 +1236,16 @@
 TEST_F(IR_BuiltinPolyfillTest, InsertBits_ClampArgs_U32) {
     Build(core::BuiltinFn::kInsertBits, ty.u32(), Vector{ty.u32(), ty.u32(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32, %arg_3:u32):u32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32, %arg_3:u32):u32 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %result:u32 = insertBits %arg, %arg_1, %arg_2, %arg_3
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32, %arg_3:u32):u32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32, %arg_2:u32, %arg_3:u32):u32 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %6:u32 = min %arg_2, 32u
     %7:u32 = sub 32u, %6
     %8:u32 = min %arg_3, %7
@@ -1266,16 +1266,16 @@
 TEST_F(IR_BuiltinPolyfillTest, InsertBits_ClampArgs_I32) {
     Build(core::BuiltinFn::kInsertBits, ty.i32(), Vector{ty.i32(), ty.i32(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:i32, %arg_1:i32, %arg_2:u32, %arg_3:u32):i32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:i32, %arg_1:i32, %arg_2:u32, %arg_3:u32):i32 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %result:i32 = insertBits %arg, %arg_1, %arg_2, %arg_3
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:i32, %arg_1:i32, %arg_2:u32, %arg_3:u32):i32 -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:i32, %arg_1:i32, %arg_2:u32, %arg_3:u32):i32 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %6:u32 = min %arg_2, 32u
     %7:u32 = sub 32u, %6
     %8:u32 = min %arg_3, %7
@@ -1297,16 +1297,16 @@
     Build(core::BuiltinFn::kInsertBits, ty.vec2<u32>(),
           Vector{ty.vec2<u32>(), ty.vec2<u32>(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:vec2<u32>, %arg_1:vec2<u32>, %arg_2:u32, %arg_3:u32):vec2<u32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec2<u32>, %arg_1:vec2<u32>, %arg_2:u32, %arg_3:u32):vec2<u32> {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %result:vec2<u32> = insertBits %arg, %arg_1, %arg_2, %arg_3
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec2<u32>, %arg_1:vec2<u32>, %arg_2:u32, %arg_3:u32):vec2<u32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec2<u32>, %arg_1:vec2<u32>, %arg_2:u32, %arg_3:u32):vec2<u32> {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %6:u32 = min %arg_2, 32u
     %7:u32 = sub 32u, %6
     %8:u32 = min %arg_3, %7
@@ -1328,16 +1328,16 @@
     Build(core::BuiltinFn::kInsertBits, ty.vec4<i32>(),
           Vector{ty.vec4<i32>(), ty.vec4<i32>(), ty.u32(), ty.u32()});
     auto* src = R"(
-%foo = func(%arg:vec4<i32>, %arg_1:vec4<i32>, %arg_2:u32, %arg_3:u32):vec4<i32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec4<i32>, %arg_1:vec4<i32>, %arg_2:u32, %arg_3:u32):vec4<i32> {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %result:vec4<i32> = insertBits %arg, %arg_1, %arg_2, %arg_3
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>, %arg_1:vec4<i32>, %arg_2:u32, %arg_3:u32):vec4<i32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
-  %b1 = block {
+%foo = func(%arg:vec4<i32>, %arg_1:vec4<i32>, %arg_2:u32, %arg_3:u32):vec4<i32> {  # %arg_1: 'arg', %arg_2: 'arg', %arg_3: 'arg'
+  $B1: {
     %6:u32 = min %arg_2, 32u
     %7:u32 = sub 32u, %6
     %8:u32 = min %arg_3, %7
@@ -1361,8 +1361,8 @@
     Build(core::BuiltinFn::kTextureSampleBaseClampToEdge, ty.vec4<f32>(),
           Vector{texture_ty, ty.sampler(), ty.vec2<f32>()});
     auto* src = R"(
-%foo = func(%arg:texture_2d<f32>, %arg_1:sampler, %arg_2:vec2<f32>):vec4<f32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:texture_2d<f32>, %arg_1:sampler, %arg_2:vec2<f32>):vec4<f32> {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %result:vec4<f32> = textureSampleBaseClampToEdge %arg, %arg_1, %arg_2
     ret %result
   }
@@ -1384,16 +1384,16 @@
     Build(core::BuiltinFn::kTextureSampleBaseClampToEdge, ty.vec4<f32>(),
           Vector{texture_ty, ty.sampler(), ty.vec2<f32>()});
     auto* src = R"(
-%foo = func(%arg:texture_2d<f32>, %arg_1:sampler, %arg_2:vec2<f32>):vec4<f32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:texture_2d<f32>, %arg_1:sampler, %arg_2:vec2<f32>):vec4<f32> {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %result:vec4<f32> = textureSampleBaseClampToEdge %arg, %arg_1, %arg_2
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%arg:texture_2d<f32>, %arg_1:sampler, %arg_2:vec2<f32>):vec4<f32> -> %b1 {  # %arg_1: 'arg', %arg_2: 'arg'
-  %b1 = block {
+%foo = func(%arg:texture_2d<f32>, %arg_1:sampler, %arg_2:vec2<f32>):vec4<f32> {  # %arg_1: 'arg', %arg_2: 'arg'
+  $B1: {
     %5:vec2<u32> = textureDimensions %arg
     %6:vec2<f32> = convert %5
     %7:vec2<f32> = div vec2<f32>(0.5f), %6
@@ -1417,8 +1417,8 @@
     Build(core::BuiltinFn::kPack4XI8, ty.u32(), Vector{ty.vec4<i32>()});
 
     auto* src = R"(
-%foo = func(%arg:vec4<i32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):u32 {
+  $B1: {
     %result:u32 = pack4xI8 %arg
     ret %result
   }
@@ -1427,8 +1427,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):u32 {
+  $B1: {
     %3:vec4<u32> = construct 0u, 8u, 16u, 24u
     %4:vec4<u32> = bitcast %arg
     %5:vec4<u32> = construct 255u
@@ -1452,8 +1452,8 @@
     Build(core::BuiltinFn::kPack4XU8, ty.u32(), Vector{ty.vec4<u32>()});
 
     auto* src = R"(
-%foo = func(%arg:vec4<u32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<u32>):u32 {
+  $B1: {
     %result:u32 = pack4xU8 %arg
     ret %result
   }
@@ -1462,8 +1462,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:vec4<u32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<u32>):u32 {
+  $B1: {
     %3:vec4<u32> = construct 0u, 8u, 16u, 24u
     %4:vec4<u32> = construct 255u
     %5:vec4<u32> = and %arg, %4
@@ -1486,8 +1486,8 @@
     Build(core::BuiltinFn::kPack4XI8Clamp, ty.u32(), Vector{ty.vec4<i32>()});
 
     auto* src = R"(
-%foo = func(%arg:vec4<i32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):u32 {
+  $B1: {
     %result:u32 = pack4xI8Clamp %arg
     ret %result
   }
@@ -1496,8 +1496,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:vec4<i32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<i32>):u32 {
+  $B1: {
     %3:vec4<u32> = construct 0u, 8u, 16u, 24u
     %4:vec4<i32> = construct -128i
     %5:vec4<i32> = construct 127i
@@ -1524,8 +1524,8 @@
     Build(core::BuiltinFn::kPack4XU8Clamp, ty.u32(), Vector{ty.vec4<u32>()});
 
     auto* src = R"(
-%foo = func(%arg:vec4<u32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<u32>):u32 {
+  $B1: {
     %result:u32 = pack4xU8Clamp %arg
     ret %result
   }
@@ -1534,8 +1534,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:vec4<u32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<u32>):u32 {
+  $B1: {
     %3:vec4<u32> = construct 0u, 8u, 16u, 24u
     %4:vec4<u32> = construct 0u
     %5:vec4<u32> = construct 255u
@@ -1559,8 +1559,8 @@
     Build(core::BuiltinFn::kUnpack4XI8, ty.vec4<i32>(), Vector{ty.u32()});
 
     auto* src = R"(
-%foo = func(%arg:u32):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):vec4<i32> {
+  $B1: {
     %result:vec4<i32> = unpack4xI8 %arg
     ret %result
   }
@@ -1569,8 +1569,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:u32):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):vec4<i32> {
+  $B1: {
     %3:vec4<u32> = construct 24u, 16u, 8u, 0u
     %4:vec4<u32> = construct %arg
     %5:vec4<u32> = shl %4, %3
@@ -1593,8 +1593,8 @@
     Build(core::BuiltinFn::kUnpack4XU8, ty.vec4<u32>(), Vector{ty.u32()});
 
     auto* src = R"(
-%foo = func(%arg:u32):vec4<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):vec4<u32> {
+  $B1: {
     %result:vec4<u32> = unpack4xU8 %arg
     ret %result
   }
@@ -1603,8 +1603,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:u32):vec4<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:u32):vec4<u32> {
+  $B1: {
     %3:vec4<u32> = construct 0u, 8u, 16u, 24u
     %4:vec4<u32> = construct %arg
     %5:vec4<u32> = shr %4, %3
@@ -1626,8 +1626,8 @@
     Build(core::BuiltinFn::kDot4I8Packed, ty.i32(), Vector{ty.u32(), ty.u32()});
 
     auto* src = R"(
-%foo = func(%arg:u32, %arg_1:u32):i32 -> %b1 {  # %arg_1: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32):i32 {  # %arg_1: 'arg'
+  $B1: {
     %result:i32 = dot4I8Packed %arg, %arg_1
     ret %result
   }
@@ -1636,8 +1636,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:u32, %arg_1:u32):i32 -> %b1 {  # %arg_1: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32):i32 {  # %arg_1: 'arg'
+  $B1: {
     %4:vec4<u32> = construct 24u, 16u, 8u, 0u
     %5:vec4<u32> = construct %arg
     %6:vec4<u32> = shl %5, %4
@@ -1667,8 +1667,8 @@
     Build(core::BuiltinFn::kDot4U8Packed, ty.u32(), Vector{ty.u32(), ty.u32()});
 
     auto* src = R"(
-%foo = func(%arg:u32, %arg_1:u32):u32 -> %b1 {  # %arg_1: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32):u32 {  # %arg_1: 'arg'
+  $B1: {
     %result:u32 = dot4U8Packed %arg, %arg_1
     ret %result
   }
@@ -1677,8 +1677,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:u32, %arg_1:u32):u32 -> %b1 {  # %arg_1: 'arg'
-  %b1 = block {
+%foo = func(%arg:u32, %arg_1:u32):u32 {  # %arg_1: 'arg'
+  $B1: {
     %4:vec4<u32> = construct 0u, 8u, 16u, 24u
     %5:vec4<u32> = construct %arg
     %6:vec4<u32> = shr %5, %4
diff --git a/src/tint/lang/core/ir/transform/combine_access_instructions_test.cc b/src/tint/lang/core/ir/transform/combine_access_instructions_test.cc
index 8fd46fd..2d07019 100644
--- a/src/tint/lang/core/ir/transform/combine_access_instructions_test.cc
+++ b/src/tint/lang/core/ir/transform/combine_access_instructions_test.cc
@@ -73,12 +73,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, MyStruct, read> = access %buffer
     %4:MyStruct = load %3
     %5:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
@@ -127,12 +127,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:ptr<uniform, mat3x3<f32>, read> = access %3, 1u
     %5:ptr<uniform, vec3<f32>, read> = access %4, 2u
@@ -148,12 +148,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, vec3<f32>, read> = access %buffer, 0u, 1u, 2u
     %4:vec3<f32> = load %3
     ret
@@ -191,12 +191,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, MyStruct, read> = access %buffer
     %4:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %3, 0u
     %5:array<mat3x3<f32>, 4> = load %4
@@ -211,12 +211,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:array<mat3x3<f32>, 4> = load %3
     ret
@@ -255,12 +255,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %3
     %5:ptr<uniform, mat3x3<f32>, read> = access %4, 1u
@@ -276,12 +276,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, mat3x3<f32>, read> = access %buffer, 0u, 1u
     %4:mat3x3<f32> = load %3
     ret
@@ -320,12 +320,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:ptr<uniform, mat3x3<f32>, read> = access %3, 1u
     %5:ptr<uniform, mat3x3<f32>, read> = access %4
@@ -341,12 +341,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, mat3x3<f32>, read> = access %buffer, 0u, 1u
     %4:mat3x3<f32> = load %3
     ret
@@ -399,12 +399,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:ptr<uniform, mat3x3<f32>, read> = access %3, 1u
     %5:ptr<uniform, vec3<f32>, read> = access %4, 2u
@@ -426,12 +426,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, vec3<f32>, read> = access %buffer, 0u, 1u, 2u
     %4:vec3<f32> = load %3
     %5:ptr<uniform, vec3<f32>, read> = access %buffer, 0u, 2u, 0u
@@ -486,12 +486,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:ptr<uniform, mat3x3<f32>, read> = access %3, 1u
     %5:ptr<uniform, vec3<f32>, read> = access %4, 2u
@@ -511,12 +511,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, vec3<f32>, read> = access %buffer, 0u, 1u, 2u
     %4:vec3<f32> = load %3
     %5:ptr<uniform, vec3<f32>, read> = access %buffer, 0u, 1u, 0u
@@ -561,12 +561,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:array<mat3x3<f32>, 4> = load %3
     %5:ptr<uniform, mat3x3<f32>, read> = access %3, 1u
@@ -583,12 +583,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:array<mat3x3<f32>, 4> = load %3
     %5:ptr<uniform, vec3<f32>, read> = access %buffer, 0u, 1u, 2u
@@ -631,12 +631,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
     %4:ptr<uniform, mat3x3<f32>, read> = access %3, 1u
     %5:mat3x3<f32> = load %4
@@ -653,12 +653,12 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, mat3x3<f32>, read> = access %buffer, 0u, 1u
     %4:mat3x3<f32> = load %3
     %5:ptr<uniform, vec3<f32>, read> = access %buffer, 0u, 1u, 2u
@@ -684,8 +684,8 @@
     });
 
     auto* src = R"(
-%foo = func():f32 -> %b1 {
-  %b1 = block {
+%foo = func():f32 {
+  $B1: {
     %2:u32 = access %indices, 1u
     %4:f32 = access %values, %2
     ret %4
@@ -734,20 +734,20 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
-    if true [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    if true [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         %4:ptr<uniform, mat3x3<f32>, read> = access %3, 1u
         %5:mat3x3<f32> = load %4
         exit_if  # if_1
       }
-      %b4 = block {  # false
+      $B4: {  # false
         %6:ptr<uniform, mat3x3<f32>, read> = access %3, 2u
         %7:mat3x3<f32> = load %6
         exit_if  # if_1
@@ -764,19 +764,19 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
-    if true [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+%foo = func():void {
+  $B2: {
+    if true [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         %3:ptr<uniform, mat3x3<f32>, read> = access %buffer, 0u, 1u
         %4:mat3x3<f32> = load %3
         exit_if  # if_1
       }
-      %b4 = block {  # false
+      $B4: {  # false
         %5:ptr<uniform, mat3x3<f32>, read> = access %buffer, 0u, 2u
         %6:mat3x3<f32> = load %5
         exit_if  # if_1
@@ -825,23 +825,23 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<mat3x3<f32>, 4>, read> = access %buffer, 0u
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
         %4:ptr<uniform, mat3x3<f32>, read> = access %3, 2u
         %5:mat3x3<f32> = load %4
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %6:ptr<uniform, mat3x3<f32>, read> = access %3, 3u
         %7:mat3x3<f32> = load %6
-        break_if true %b3
+        break_if true  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret
@@ -855,22 +855,22 @@
   a:array<mat3x3<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
+%foo = func():void {
+  $B2: {
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
         %3:ptr<uniform, mat3x3<f32>, read> = access %buffer, 0u, 2u
         %4:mat3x3<f32> = load %3
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %5:ptr<uniform, mat3x3<f32>, read> = access %buffer, 0u, 3u
         %6:mat3x3<f32> = load %5
-        break_if true %b3
+        break_if true  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret
diff --git a/src/tint/lang/core/ir/transform/conversion_polyfill_test.cc b/src/tint/lang/core/ir/transform/conversion_polyfill_test.cc
index 214ca29..cdb2db9 100644
--- a/src/tint/lang/core/ir/transform/conversion_polyfill_test.cc
+++ b/src/tint/lang/core/ir/transform/conversion_polyfill_test.cc
@@ -58,8 +58,8 @@
 TEST_F(IR_ConversionPolyfillTest, I32_to_F32) {
     Build(ty.i32(), ty.f32());
     auto* src = R"(
-%foo = func(%src:i32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:i32):f32 {
+  $B1: {
     %result:f32 = convert %src
     ret %result
   }
@@ -79,8 +79,8 @@
 TEST_F(IR_ConversionPolyfillTest, U32_to_F32) {
     Build(ty.u32(), ty.f32());
     auto* src = R"(
-%foo = func(%src:u32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:u32):f32 {
+  $B1: {
     %result:f32 = convert %src
     ret %result
   }
@@ -99,8 +99,8 @@
 TEST_F(IR_ConversionPolyfillTest, F32_to_I32_NoPolyfill) {
     Build(ty.f32(), ty.i32());
     auto* src = R"(
-%foo = func(%src:f32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f32):i32 {
+  $B1: {
     %result:i32 = convert %src
     ret %result
   }
@@ -119,22 +119,22 @@
 TEST_F(IR_ConversionPolyfillTest, F32_to_I32) {
     Build(ty.f32(), ty.i32());
     auto* src = R"(
-%foo = func(%src:f32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f32):i32 {
+  $B1: {
     %result:i32 = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:f32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f32):i32 {
+  $B1: {
     %result:i32 = call %tint_f32_to_i32, %src
     ret %result
   }
 }
-%tint_f32_to_i32 = func(%value:f32):i32 -> %b2 {
-  %b2 = block {
+%tint_f32_to_i32 = func(%value:f32):i32 {
+  $B2: {
     %6:i32 = convert %value
     %7:bool = gte %value, -2147483648.0f
     %8:i32 = select -2147483648i, %6, %7
@@ -156,22 +156,22 @@
 TEST_F(IR_ConversionPolyfillTest, F32_to_U32) {
     Build(ty.f32(), ty.u32());
     auto* src = R"(
-%foo = func(%src:f32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f32):u32 {
+  $B1: {
     %result:u32 = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:f32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f32):u32 {
+  $B1: {
     %result:u32 = call %tint_f32_to_u32, %src
     ret %result
   }
 }
-%tint_f32_to_u32 = func(%value:f32):u32 -> %b2 {
-  %b2 = block {
+%tint_f32_to_u32 = func(%value:f32):u32 {
+  $B2: {
     %6:u32 = convert %value
     %7:bool = gte %value, 0.0f
     %8:u32 = select 0u, %6, %7
@@ -193,22 +193,22 @@
 TEST_F(IR_ConversionPolyfillTest, F32_to_I32_Vec2) {
     Build(ty.vec2<f32>(), ty.vec2<i32>());
     auto* src = R"(
-%foo = func(%src:vec2<f32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:vec2<f32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f32>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = call %tint_v2f32_to_v2i32, %src
     ret %result
   }
 }
-%tint_v2f32_to_v2i32 = func(%value:vec2<f32>):vec2<i32> -> %b2 {
-  %b2 = block {
+%tint_v2f32_to_v2i32 = func(%value:vec2<f32>):vec2<i32> {
+  $B2: {
     %6:vec2<i32> = convert %value
     %7:vec2<bool> = gte %value, vec2<f32>(-2147483648.0f)
     %8:vec2<i32> = select vec2<i32>(-2147483648i), %6, %7
@@ -230,22 +230,22 @@
 TEST_F(IR_ConversionPolyfillTest, F32_to_U32_Vec3) {
     Build(ty.vec2<f32>(), ty.vec2<u32>());
     auto* src = R"(
-%foo = func(%src:vec2<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f32>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:vec2<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f32>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = call %tint_v2f32_to_v2u32, %src
     ret %result
   }
 }
-%tint_v2f32_to_v2u32 = func(%value:vec2<f32>):vec2<u32> -> %b2 {
-  %b2 = block {
+%tint_v2f32_to_v2u32 = func(%value:vec2<f32>):vec2<u32> {
+  $B2: {
     %6:vec2<u32> = convert %value
     %7:vec2<bool> = gte %value, vec2<f32>(0.0f)
     %8:vec2<u32> = select vec2<u32>(0u), %6, %7
@@ -267,22 +267,22 @@
 TEST_F(IR_ConversionPolyfillTest, F16_to_I32) {
     Build(ty.f16(), ty.i32());
     auto* src = R"(
-%foo = func(%src:f16):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f16):i32 {
+  $B1: {
     %result:i32 = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:f16):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f16):i32 {
+  $B1: {
     %result:i32 = call %tint_f16_to_i32, %src
     ret %result
   }
 }
-%tint_f16_to_i32 = func(%value:f16):i32 -> %b2 {
-  %b2 = block {
+%tint_f16_to_i32 = func(%value:f16):i32 {
+  $B2: {
     %6:i32 = convert %value
     %7:bool = gte %value, -65504.0h
     %8:i32 = select -2147483648i, %6, %7
@@ -304,22 +304,22 @@
 TEST_F(IR_ConversionPolyfillTest, F16_to_U32) {
     Build(ty.f16(), ty.u32());
     auto* src = R"(
-%foo = func(%src:f16):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f16):u32 {
+  $B1: {
     %result:u32 = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:f16):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%src:f16):u32 {
+  $B1: {
     %result:u32 = call %tint_f16_to_u32, %src
     ret %result
   }
 }
-%tint_f16_to_u32 = func(%value:f16):u32 -> %b2 {
-  %b2 = block {
+%tint_f16_to_u32 = func(%value:f16):u32 {
+  $B2: {
     %6:u32 = convert %value
     %7:bool = gte %value, 0.0h
     %8:u32 = select 0u, %6, %7
@@ -341,22 +341,22 @@
 TEST_F(IR_ConversionPolyfillTest, F16_to_I32_Vec2) {
     Build(ty.vec2<f16>(), ty.vec2<i32>());
     auto* src = R"(
-%foo = func(%src:vec2<f16>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f16>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:vec2<f16>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f16>):vec2<i32> {
+  $B1: {
     %result:vec2<i32> = call %tint_v2f16_to_v2i32, %src
     ret %result
   }
 }
-%tint_v2f16_to_v2i32 = func(%value:vec2<f16>):vec2<i32> -> %b2 {
-  %b2 = block {
+%tint_v2f16_to_v2i32 = func(%value:vec2<f16>):vec2<i32> {
+  $B2: {
     %6:vec2<i32> = convert %value
     %7:vec2<bool> = gte %value, vec2<f16>(-65504.0h)
     %8:vec2<i32> = select vec2<i32>(-2147483648i), %6, %7
@@ -378,22 +378,22 @@
 TEST_F(IR_ConversionPolyfillTest, F16_to_U32_Vec3) {
     Build(ty.vec2<f16>(), ty.vec2<u32>());
     auto* src = R"(
-%foo = func(%src:vec2<f16>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f16>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = convert %src
     ret %result
   }
 }
 )";
     auto* expect = R"(
-%foo = func(%src:vec2<f16>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%src:vec2<f16>):vec2<u32> {
+  $B1: {
     %result:vec2<u32> = call %tint_v2f16_to_v2u32, %src
     ret %result
   }
 }
-%tint_v2f16_to_v2u32 = func(%value:vec2<f16>):vec2<u32> -> %b2 {
-  %b2 = block {
+%tint_v2f16_to_v2u32 = func(%value:vec2<f16>):vec2<u32> {
+  $B2: {
     %6:vec2<u32> = convert %value
     %7:vec2<bool> = gte %value, vec2<f16>(0.0h)
     %8:vec2<u32> = select vec2<u32>(0u), %6, %7
diff --git a/src/tint/lang/core/ir/transform/demote_to_helper_test.cc b/src/tint/lang/core/ir/transform/demote_to_helper_test.cc
index e997e41..e26ff8d 100644
--- a/src/tint/lang/core/ir/transform/demote_to_helper_test.cc
+++ b/src/tint/lang/core/ir/transform/demote_to_helper_test.cc
@@ -56,12 +56,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
 }
 
-%ep = @fragment func():f32 [@location(0)] -> %b2 {
-  %b2 = block {
+%ep = @fragment func():f32 [@location(0)] {
+  $B2: {
     store %buffer, 42i
     ret 0.5f
   }
@@ -98,14 +98,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -118,30 +118,30 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %5 [t: $B4] {  # if_2
+      $B4: {  # true
         store %buffer, 42i
         exit_if  # if_2
       }
     }
     %6:bool = load %continue_execution
     %7:bool = eq %6, false
-    if %7 [t: %b5] {  # if_3
-      %b5 = block {  # true
+    if %7 [t: $B5] {  # if_3
+      $B5: {  # true
         terminate_invocation
       }
     }
@@ -183,20 +183,20 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     store %buffer, 42i
     ret
   }
 }
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b3 {
-  %b3 = block {
-    if %front_facing [t: %b4] {  # if_1
-      %b4 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B3: {
+    if %front_facing [t: $B4] {  # if_1
+      $B4: {  # true
         discard
         exit_if  # if_1
       }
@@ -209,16 +209,16 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %4:bool = load %continue_execution
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %buffer, 42i
         exit_if  # if_1
       }
@@ -226,10 +226,10 @@
     ret
   }
 }
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b4 {
-  %b4 = block {
-    if %front_facing [t: %b5] {  # if_2
-      %b5 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B4: {
+    if %front_facing [t: $B5] {  # if_2
+      $B5: {  # true
         store %continue_execution, false
         exit_if  # if_2
       }
@@ -237,8 +237,8 @@
     %7:void = call %foo
     %8:bool = load %continue_execution
     %9:bool = eq %8, false
-    if %9 [t: %b6] {  # if_3
-      %b6 = block {  # true
+    if %9 [t: $B6] {  # if_3
+      $B6: {  # true
         terminate_invocation
       }
     }
@@ -282,14 +282,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%cond:bool):void -> %b2 {
-  %b2 = block {
-    if %cond [t: %b3] {  # if_1
-      %b3 = block {  # true
+%foo = func(%cond:bool):void {
+  $B2: {
+    if %cond [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -297,8 +297,8 @@
     ret
   }
 }
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b4 {
-  %b4 = block {
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B4: {
     %6:void = call %foo, %front_facing
     store %buffer, 42i
     ret 0.5f
@@ -308,15 +308,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%foo = func(%cond:bool):void -> %b2 {
-  %b2 = block {
-    if %cond [t: %b3] {  # if_1
-      %b3 = block {  # true
+%foo = func(%cond:bool):void {
+  $B2: {
+    if %cond [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
@@ -324,20 +324,20 @@
     ret
   }
 }
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b4 {
-  %b4 = block {
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B4: {
     %7:void = call %foo, %front_facing
     %8:bool = load %continue_execution
-    if %8 [t: %b5] {  # if_2
-      %b5 = block {  # true
+    if %8 [t: $B5] {  # if_2
+      $B5: {  # true
         store %buffer, 42i
         exit_if  # if_2
       }
     }
     %9:bool = load %continue_execution
     %10:bool = eq %9, false
-    if %10 [t: %b6] {  # if_3
-      %b6 = block {  # true
+    if %10 [t: $B6] {  # if_3
+      $B6: {  # true
         terminate_invocation
       }
     }
@@ -381,14 +381,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%cond:bool):void -> %b2 {
-  %b2 = block {
-    if %cond [t: %b3] {  # if_1
-      %b3 = block {  # true
+%foo = func(%cond:bool):void {
+  $B2: {
+    if %cond [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -397,8 +397,8 @@
     ret
   }
 }
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b4 {
-  %b4 = block {
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B4: {
     %6:void = call %foo, %front_facing
     ret 0.5f
   }
@@ -407,22 +407,22 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, i32, read_write> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%foo = func(%cond:bool):void -> %b2 {
-  %b2 = block {
-    if %cond [t: %b3] {  # if_1
-      %b3 = block {  # true
+%foo = func(%cond:bool):void {
+  $B2: {
+    if %cond [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %5 [t: $B4] {  # if_2
+      $B4: {  # true
         store %buffer, 42i
         exit_if  # if_2
       }
@@ -430,13 +430,13 @@
     ret
   }
 }
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b5 {
-  %b5 = block {
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B5: {
     %8:void = call %foo, %front_facing
     %9:bool = load %continue_execution
     %10:bool = eq %9, false
-    if %10 [t: %b6] {  # if_3
-      %b6 = block {  # true
+    if %10 [t: $B6] {  # if_3
+      $B6: {  # true
         terminate_invocation
       }
     }
@@ -471,15 +471,15 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %priv:ptr<private, i32, read_write> = var
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
     %func:ptr<function, i32, read_write> = var
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -493,16 +493,16 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %priv:ptr<private, i32, read_write> = var
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
     %func:ptr<function, i32, read_write> = var
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
@@ -511,8 +511,8 @@
     store %func, 42i
     %6:bool = load %continue_execution
     %7:bool = eq %6, false
-    if %7 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %7 [t: $B4] {  # if_2
+      $B4: {  # true
         terminate_invocation
       }
     }
@@ -555,14 +555,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<r32float, write>, read> = var @binding_point(0, 0)
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing], %coord:vec2<i32>):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing], %coord:vec2<i32>):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -576,31 +576,31 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<r32float, write>, read> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing], %coord:vec2<i32>):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing], %coord:vec2<i32>):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
     }
     %6:texture_storage_2d<r32float, write> = load %texture
     %7:bool = load %continue_execution
-    if %7 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %7 [t: $B4] {  # if_2
+      $B4: {  # true
         %8:void = textureStore %6, %coord, vec4<f32>(0.5f)
         exit_if  # if_2
       }
     }
     %9:bool = load %continue_execution
     %10:bool = eq %9, false
-    if %10 [t: %b5] {  # if_3
-      %b5 = block {  # true
+    if %10 [t: $B5] {  # if_3
+      $B5: {  # true
         terminate_invocation
       }
     }
@@ -636,14 +636,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -656,30 +656,30 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %5 [t: $B4] {  # if_2
+      $B4: {  # true
         %6:void = atomicStore %buffer, 42i
         exit_if  # if_2
       }
     }
     %7:bool = load %continue_execution
     %8:bool = eq %7, false
-    if %8 [t: %b5] {  # if_3
-      %b5 = block {  # true
+    if %8 [t: $B5] {  # if_3
+      $B5: {  # true
         terminate_invocation
       }
     }
@@ -716,14 +716,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -737,22 +737,22 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    %6:i32 = if %5 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    %6:i32 = if %5 [t: $B4] {  # if_2
+      $B4: {  # true
         %7:i32 = atomicAdd %buffer, 42i
         exit_if %7  # if_2
       }
@@ -761,8 +761,8 @@
     %8:i32 = add %6, 1i
     %9:bool = load %continue_execution
     %10:bool = eq %9, false
-    if %10 [t: %b5] {  # if_3
-      %b5 = block {  # true
+    if %10 [t: $B5] {  # if_3
+      $B5: {  # true
         terminate_invocation
       }
     }
@@ -806,14 +806,14 @@
   exchanged:bool @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         discard
         exit_if  # if_1
       }
@@ -833,22 +833,22 @@
   exchanged:bool @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%ep = @fragment func(%front_facing:bool [@front_facing]):f32 [@location(0)] {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    %6:__atomic_compare_exchange_result_i32 = if %5 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    %6:__atomic_compare_exchange_result_i32 = if %5 [t: $B4] {  # if_2
+      $B4: {  # true
         %7:__atomic_compare_exchange_result_i32 = atomicCompareExchangeWeak %buffer, 0i, 42i
         exit_if %7  # if_2
       }
@@ -858,8 +858,8 @@
     %9:i32 = add %8, 1i
     %10:bool = load %continue_execution
     %11:bool = eq %10, false
-    if %11 [t: %b5] {  # if_3
-      %b5 = block {  # true
+    if %11 [t: $B5] {  # if_3
+      $B5: {  # true
         terminate_invocation
       }
     }
@@ -882,8 +882,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     discard
     ret
   }
@@ -892,12 +892,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %continue_execution:ptr<private, bool, read_write> = var, true
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     store %continue_execution, false
     ret
   }
diff --git a/src/tint/lang/core/ir/transform/direct_variable_access_test.cc b/src/tint/lang/core/ir/transform/direct_variable_access_test.cc
index 4919a26..cf464d3 100644
--- a/src/tint/lang/core/ir/transform/direct_variable_access_test.cc
+++ b/src/tint/lang/core/ir/transform/direct_variable_access_test.cc
@@ -75,12 +75,12 @@
     b.Append(u->Block(), [&] { b.Return(u, b.Load(p)); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
-%u = func(%pre:i32, %p:ptr<uniform, i32, read>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%u = func(%pre:i32, %p:ptr<uniform, i32, read>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
@@ -90,7 +90,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
@@ -114,12 +114,12 @@
     b.Append(s->Block(), [&] { b.Return(s, b.Load(p)); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
-%s = func(%pre:i32, %p:ptr<storage, i32, read>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%s = func(%pre:i32, %p:ptr<storage, i32, read>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
@@ -129,7 +129,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
@@ -153,12 +153,12 @@
     b.Append(w->Block(), [&] { b.Return(w, b.Load(p)); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
-%w = func(%pre:i32, %p:ptr<workgroup, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%w = func(%pre:i32, %p:ptr<workgroup, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
@@ -168,7 +168,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
@@ -192,12 +192,12 @@
     b.Append(f->Block(), [&] { b.Return(f, b.Load(p)); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
-%f = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%f = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
@@ -226,12 +226,12 @@
     b.Append(f->Block(), [&] { b.Return(f, b.Load(p)); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
-%f = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%f = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
@@ -241,7 +241,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
@@ -264,12 +264,12 @@
     b.Append(f->Block(), [&] { b.Return(f, b.Load(p)); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
-%f = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%f = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
@@ -298,12 +298,12 @@
     b.Append(f->Block(), [&] { b.Return(f, b.Load(p)); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
-%f = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%f = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
@@ -312,7 +312,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %keep_me:ptr<private, i32, read_write> = var, 42i
 }
 
@@ -384,18 +384,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p:ptr<uniform, vec4<i32>, read>, %post:i32):vec4<i32> -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<uniform, vec4<i32>, read>, %post:i32):vec4<i32> {
+  $B2: {
     %6:vec4<i32> = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %p0:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = let %U
     %p1:ptr<uniform, array<array<vec4<i32>, 8>, 8>, read> = access %p0, 1i
     %p2:ptr<uniform, array<vec4<i32>, 8>, read> = access %p1, 2i
@@ -404,8 +404,8 @@
     ret
   }
 }
-%c = func(%p_1:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read>):void -> %b4 {  # %p_1: 'p'
-  %b4 = block {
+%c = func(%p_1:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read>):void {  # %p_1: 'p'
+  $B4: {
     %p0_1:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = let %p_1  # %p0_1: 'p0'
     %p1_1:ptr<uniform, array<array<vec4<i32>, 8>, 8>, read> = access %p0_1, 1i  # %p1_1: 'p1'
     %p2_1:ptr<uniform, array<vec4<i32>, 8>, read> = access %p1_1, 2i  # %p2_1: 'p2'
@@ -414,8 +414,8 @@
     ret
   }
 }
-%d = func():void -> %b5 {
-  %b5 = block {
+%d = func():void {
+  $B5: {
     %21:void = call %c, %U
     ret
   }
@@ -426,12 +426,12 @@
 
     auto* expect =
         R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p_indices:array<u32, 3>, %post:i32):vec4<i32> -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p_indices:array<u32, 3>, %post:i32):vec4<i32> {
+  $B2: {
     %6:u32 = access %p_indices, 0u
     %7:u32 = access %p_indices, 1u
     %8:u32 = access %p_indices, 2u
@@ -440,8 +440,8 @@
     ret %10
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %12:u32 = convert 3i
     %13:u32 = convert 2i
     %14:u32 = convert 1i
@@ -450,8 +450,8 @@
     ret
   }
 }
-%c = func():void -> %b4 {
-  %b4 = block {
+%c = func():void {
+  $B4: {
     %18:u32 = convert 3i
     %19:u32 = convert 2i
     %20:u32 = convert 1i
@@ -460,8 +460,8 @@
     ret
   }
 }
-%d = func():void -> %b5 {
-  %b5 = block {
+%d = func():void {
+  $B5: {
     %24:void = call %c
     ret
   }
@@ -539,13 +539,13 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = var @binding_point(0, 0)
   %i:ptr<private, i32, read_write> = var
 }
 
-%first = func():i32 -> %b2 {
-  %b2 = block {
+%first = func():i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, 1i
     store %i, %5
@@ -553,8 +553,8 @@
     ret %6
   }
 }
-%second = func():i32 -> %b3 {
-  %b3 = block {
+%second = func():i32 {
+  $B3: {
     %8:i32 = load %i
     %9:i32 = add %8, 1i
     store %i, %9
@@ -562,8 +562,8 @@
     ret %10
   }
 }
-%third = func():i32 -> %b4 {
-  %b4 = block {
+%third = func():i32 {
+  $B4: {
     %12:i32 = load %i
     %13:i32 = add %12, 1i
     store %i, %13
@@ -571,14 +571,14 @@
     ret %14
   }
 }
-%a = func(%pre:i32, %p:ptr<uniform, vec4<i32>, read>, %post:i32):vec4<i32> -> %b5 {
-  %b5 = block {
+%a = func(%pre:i32, %p:ptr<uniform, vec4<i32>, read>, %post:i32):vec4<i32> {
+  $B5: {
     %19:vec4<i32> = load %p
     ret %19
   }
 }
-%b = func():void -> %b6 {
-  %b6 = block {
+%b = func():void {
+  $B6: {
     %p0:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = let %U
     %22:i32 = call %first
     %p1:ptr<uniform, array<array<vec4<i32>, 8>, 8>, read> = access %p0, %22
@@ -589,8 +589,8 @@
     ret
   }
 }
-%c = func(%p_1:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read>):void -> %b7 {  # %p_1: 'p'
-  %b7 = block {
+%c = func(%p_1:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read>):void {  # %p_1: 'p'
+  $B7: {
     %p0_1:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = let %p_1  # %p0_1: 'p0'
     %31:i32 = call %first
     %p1_1:ptr<uniform, array<array<vec4<i32>, 8>, 8>, read> = access %p0_1, %31  # %p1_1: 'p1'
@@ -601,8 +601,8 @@
     ret
   }
 }
-%d = func():void -> %b8 {
-  %b8 = block {
+%d = func():void {
+  $B8: {
     %38:void = call %c, %U
     ret
   }
@@ -612,13 +612,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<array<array<vec4<i32>, 8>, 8>, 8>, read> = var @binding_point(0, 0)
   %i:ptr<private, i32, read_write> = var
 }
 
-%first = func():i32 -> %b2 {
-  %b2 = block {
+%first = func():i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, 1i
     store %i, %5
@@ -626,8 +626,8 @@
     ret %6
   }
 }
-%second = func():i32 -> %b3 {
-  %b3 = block {
+%second = func():i32 {
+  $B3: {
     %8:i32 = load %i
     %9:i32 = add %8, 1i
     store %i, %9
@@ -635,8 +635,8 @@
     ret %10
   }
 }
-%third = func():i32 -> %b4 {
-  %b4 = block {
+%third = func():i32 {
+  $B4: {
     %12:i32 = load %i
     %13:i32 = add %12, 1i
     store %i, %13
@@ -644,8 +644,8 @@
     ret %14
   }
 }
-%a = func(%pre:i32, %p_indices:array<u32, 3>, %post:i32):vec4<i32> -> %b5 {
-  %b5 = block {
+%a = func(%pre:i32, %p_indices:array<u32, 3>, %post:i32):vec4<i32> {
+  $B5: {
     %19:u32 = access %p_indices, 0u
     %20:u32 = access %p_indices, 1u
     %21:u32 = access %p_indices, 2u
@@ -654,8 +654,8 @@
     ret %23
   }
 }
-%b = func():void -> %b6 {
-  %b6 = block {
+%b = func():void {
+  $B6: {
     %25:i32 = call %first
     %26:i32 = call %second
     %27:i32 = call %third
@@ -667,8 +667,8 @@
     ret
   }
 }
-%c = func():void -> %b7 {
-  %b7 = block {
+%c = func():void {
+  $B7: {
     %34:i32 = call %first
     %35:i32 = call %second
     %36:i32 = call %third
@@ -680,8 +680,8 @@
     ret
   }
 }
-%d = func():void -> %b8 {
-  %b8 = block {
+%d = func():void {
+  $B8: {
     %43:void = call %c
     ret
   }
@@ -726,18 +726,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, i32, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p:ptr<uniform, i32, read>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<uniform, i32, read>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:i32 = call %a, 10i, %U, 20i
     ret
   }
@@ -747,19 +747,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, i32, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):i32 {
+  $B2: {
     %5:ptr<uniform, i32, read> = access %U
     %6:i32 = load %5
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:i32 = call %a, 10i, 20i
     ret
   }
@@ -797,18 +797,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<vec4<i32>, 8>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p:ptr<uniform, vec4<i32>, read>, %post:i32):vec4<i32> -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<uniform, vec4<i32>, read>, %post:i32):vec4<i32> {
+  $B2: {
     %6:vec4<i32> = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %I:i32 = let 3i
     %9:ptr<uniform, vec4<i32>, read> = access %U, %I
     %10:vec4<i32> = call %a, 10i, %9, 20i
@@ -820,20 +820,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<vec4<i32>, 8>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):vec4<i32> -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):vec4<i32> {
+  $B2: {
     %6:u32 = access %p_indices, 0u
     %7:ptr<uniform, vec4<i32>, read> = access %U, %6
     %8:vec4<i32> = load %7
     ret %8
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %I:i32 = let 3i
     %11:u32 = convert %I
     %12:array<u32, 1> = construct %11
@@ -952,18 +952,18 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%f0 = func(%p:ptr<uniform, vec4<f32>, read>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p:ptr<uniform, vec4<f32>, read>):f32 {
+  $B2: {
     %4:f32 = load_vector_element %p, 0u
     ret %4
   }
 }
-%f1 = func(%p_1:ptr<uniform, mat3x4<f32>, read>):f32 -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<uniform, mat3x4<f32>, read>):f32 {  # %p_1: 'p'
+  $B3: {
     %res:ptr<function, f32, read_write> = var
     %8:ptr<uniform, vec4<f32>, read> = access %p_1, 1i
     %9:f32 = call %f0, %8
@@ -989,15 +989,15 @@
     ret %24
   }
 }
-%f2 = func(%p_2:ptr<uniform, Inner, read>):f32 -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f2 = func(%p_2:ptr<uniform, Inner, read>):f32 {  # %p_2: 'p'
+  $B4: {
     %p_mat:ptr<uniform, mat3x4<f32>, read> = access %p_2, 0u
     %28:f32 = call %f1, %p_mat
     ret %28
   }
 }
-%f3 = func(%p0:ptr<uniform, array<Inner, 4>, read>, %p1:ptr<uniform, mat3x4<f32>, read>):f32 -> %b5 {
-  %b5 = block {
+%f3 = func(%p0:ptr<uniform, array<Inner, 4>, read>, %p1:ptr<uniform, mat3x4<f32>, read>):f32 {
+  $B5: {
     %p0_inner:ptr<uniform, Inner, read> = access %p0, 3i
     %33:f32 = call %f2, %p0_inner
     %34:f32 = call %f1, %p1
@@ -1005,16 +1005,16 @@
     ret %35
   }
 }
-%f4 = func(%p_3:ptr<uniform, Outer, read>):f32 -> %b6 {  # %p_3: 'p'
-  %b6 = block {
+%f4 = func(%p_3:ptr<uniform, Outer, read>):f32 {  # %p_3: 'p'
+  $B6: {
     %38:ptr<uniform, array<Inner, 4>, read> = access %p_3, 0u
     %39:ptr<uniform, mat3x4<f32>, read> = access %U, 1u
     %40:f32 = call %f3, %38, %39
     ret %40
   }
 }
-%b = func():void -> %b7 {
-  %b7 = block {
+%b = func():void {
+  $B7: {
     %42:f32 = call %f4, %U
     ret
   }
@@ -1033,20 +1033,20 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%f0 = func(%p_indices:array<u32, 1>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p_indices:array<u32, 1>):f32 {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:ptr<uniform, vec4<f32>, read> = access %U, 1u, %4
     %6:f32 = load_vector_element %5, 0u
     ret %6
   }
 }
-%f0_1 = func(%p_indices_1:array<u32, 2>):f32 -> %b3 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
-  %b3 = block {
+%f0_1 = func(%p_indices_1:array<u32, 2>):f32 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
+  $B3: {
     %9:u32 = access %p_indices_1, 0u
     %10:u32 = access %p_indices_1, 1u
     %11:ptr<uniform, vec4<f32>, read> = access %U, 0u, %9, 0u, %10
@@ -1054,8 +1054,8 @@
     ret %12
   }
 }
-%f1 = func():f32 -> %b4 {
-  %b4 = block {
+%f1 = func():f32 {
+  $B4: {
     %res:ptr<function, f32, read_write> = var
     %15:u32 = convert 1i
     %16:array<u32, 1> = construct %15
@@ -1087,8 +1087,8 @@
     ret %37
   }
 }
-%f1_1 = func(%p_indices_2:array<u32, 1>):f32 -> %b5 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
-  %b5 = block {
+%f1_1 = func(%p_indices_2:array<u32, 1>):f32 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
+  $B5: {
     %40:u32 = access %p_indices_2, 0u
     %res_1:ptr<function, f32, read_write> = var  # %res_1: 'res'
     %42:u32 = convert 1i
@@ -1121,16 +1121,16 @@
     ret %64
   }
 }
-%f2 = func(%p_indices_3:array<u32, 1>):f32 -> %b6 {  # %p_indices_3: 'p_indices'
-  %b6 = block {
+%f2 = func(%p_indices_3:array<u32, 1>):f32 {  # %p_indices_3: 'p_indices'
+  $B6: {
     %67:u32 = access %p_indices_3, 0u
     %68:array<u32, 1> = construct %67
     %69:f32 = call %f1_1, %68
     ret %69
   }
 }
-%f3 = func():f32 -> %b7 {
-  %b7 = block {
+%f3 = func():f32 {
+  $B7: {
     %71:u32 = convert 3i
     %72:array<u32, 1> = construct %71
     %73:f32 = call %f2, %72
@@ -1139,14 +1139,14 @@
     ret %75
   }
 }
-%f4 = func():f32 -> %b8 {
-  %b8 = block {
+%f4 = func():f32 {
+  $B8: {
     %77:f32 = call %f3
     ret %77
   }
 }
-%b = func():void -> %b9 {
-  %b9 = block {
+%b = func():void {
+  $B9: {
     %79:f32 = call %f4
     ret
   }
@@ -1202,33 +1202,33 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<array<array<vec4<i32>, 5>, 5>, 5>, read> = var @binding_point(0, 0)
 }
 
-%f2 = func(%p:ptr<uniform, array<vec4<i32>, 5>, read>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p:ptr<uniform, array<vec4<i32>, 5>, read>):vec4<i32> {
+  $B2: {
     %4:ptr<uniform, vec4<i32>, read> = access %p, 3u
     %5:vec4<i32> = load %4
     ret %5
   }
 }
-%f1 = func(%p_1:ptr<uniform, array<array<vec4<i32>, 5>, 5>, read>):vec4<i32> -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<uniform, array<array<vec4<i32>, 5>, 5>, read>):vec4<i32> {  # %p_1: 'p'
+  $B3: {
     %8:ptr<uniform, array<vec4<i32>, 5>, read> = access %p_1, 2u
     %9:vec4<i32> = call %f2, %8
     ret %9
   }
 }
-%f0 = func(%p_2:ptr<uniform, array<array<array<vec4<i32>, 5>, 5>, 5>, read>):vec4<i32> -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f0 = func(%p_2:ptr<uniform, array<array<array<vec4<i32>, 5>, 5>, 5>, read>):vec4<i32> {  # %p_2: 'p'
+  $B4: {
     %12:ptr<uniform, array<array<vec4<i32>, 5>, 5>, read> = access %p_2, 1u
     %13:vec4<i32> = call %f1, %12
     ret %13
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %15:vec4<i32> = call %f0, %U
     ret
   }
@@ -1238,12 +1238,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, array<array<array<vec4<i32>, 5>, 5>, 5>, read> = var @binding_point(0, 0)
 }
 
-%f2 = func(%p_indices:array<u32, 2>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p_indices:array<u32, 2>):vec4<i32> {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:u32 = access %p_indices, 1u
     %6:ptr<uniform, array<vec4<i32>, 5>, read> = access %U, %4, %5
@@ -1252,23 +1252,23 @@
     ret %8
   }
 }
-%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> -> %b3 {  # %p_indices_1: 'p_indices'
-  %b3 = block {
+%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> {  # %p_indices_1: 'p_indices'
+  $B3: {
     %11:u32 = access %p_indices_1, 0u
     %12:array<u32, 2> = construct %11, 2u
     %13:vec4<i32> = call %f2, %12
     ret %13
   }
 }
-%f0 = func():vec4<i32> -> %b4 {
-  %b4 = block {
+%f0 = func():vec4<i32> {
+  $B4: {
     %15:array<u32, 1> = construct 1u
     %16:vec4<i32> = call %f1, %15
     ret %16
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %18:vec4<i32> = call %f0
     ret
   }
@@ -1322,18 +1322,18 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, str, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p:ptr<storage, i32, read>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<storage, i32, read>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:ptr<storage, i32, read> = access %S, 0u
     %9:i32 = call %a, 10i, %8, 20i
     ret
@@ -1348,19 +1348,19 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, str, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):i32 {
+  $B2: {
     %5:ptr<storage, i32, read> = access %S, 0u
     %6:i32 = load %5
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:i32 = call %a, 10i, 20i
     ret
   }
@@ -1409,18 +1409,18 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, str, read_write> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p:ptr<storage, array<i32, 4>, read_write>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<storage, array<i32, 4>, read_write>, %post:i32):void {
+  $B2: {
     store %p, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:ptr<storage, array<i32, 4>, read_write> = access %S, 0u
     %8:void = call %a, 10i, %7, 20i
     ret
@@ -1435,19 +1435,19 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, str, read_write> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):void {
+  $B2: {
     %5:ptr<storage, array<i32, 4>, read_write> = access %S, 0u
     store %5, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:void = call %a, 10i, 20i
     ret
   }
@@ -1488,18 +1488,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<vec4<i32>, 8>, read_write> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p:ptr<storage, vec4<i32>, read_write>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<storage, vec4<i32>, read_write>, %post:i32):void {
+  $B2: {
     store %p, vec4<i32>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %I:i32 = let 3i
     %8:ptr<storage, vec4<i32>, read_write> = access %S, %I
     %9:void = call %a, 10i, %8, 20i
@@ -1511,20 +1511,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<vec4<i32>, 8>, read_write> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):void {
+  $B2: {
     %6:u32 = access %p_indices, 0u
     %7:ptr<storage, vec4<i32>, read_write> = access %S, %6
     store %7, vec4<i32>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %I:i32 = let 3i
     %10:u32 = convert %I
     %11:array<u32, 1> = construct %10
@@ -1643,18 +1643,18 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, Outer, read> = var @binding_point(0, 0)
 }
 
-%f0 = func(%p:ptr<storage, vec4<f32>, read>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p:ptr<storage, vec4<f32>, read>):f32 {
+  $B2: {
     %4:f32 = load_vector_element %p, 0u
     ret %4
   }
 }
-%f1 = func(%p_1:ptr<storage, mat3x4<f32>, read>):f32 -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<storage, mat3x4<f32>, read>):f32 {  # %p_1: 'p'
+  $B3: {
     %res:ptr<function, f32, read_write> = var
     %8:ptr<storage, vec4<f32>, read> = access %p_1, 1i
     %9:f32 = call %f0, %8
@@ -1680,15 +1680,15 @@
     ret %24
   }
 }
-%f2 = func(%p_2:ptr<storage, Inner, read>):f32 -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f2 = func(%p_2:ptr<storage, Inner, read>):f32 {  # %p_2: 'p'
+  $B4: {
     %p_mat:ptr<storage, mat3x4<f32>, read> = access %p_2, 0u
     %28:f32 = call %f1, %p_mat
     ret %28
   }
 }
-%f3 = func(%p0:ptr<storage, array<Inner, 4>, read>, %p1:ptr<storage, mat3x4<f32>, read>):f32 -> %b5 {
-  %b5 = block {
+%f3 = func(%p0:ptr<storage, array<Inner, 4>, read>, %p1:ptr<storage, mat3x4<f32>, read>):f32 {
+  $B5: {
     %p0_inner:ptr<storage, Inner, read> = access %p0, 3i
     %33:f32 = call %f2, %p0_inner
     %34:f32 = call %f1, %p1
@@ -1696,16 +1696,16 @@
     ret %35
   }
 }
-%f4 = func(%p_3:ptr<storage, Outer, read>):f32 -> %b6 {  # %p_3: 'p'
-  %b6 = block {
+%f4 = func(%p_3:ptr<storage, Outer, read>):f32 {  # %p_3: 'p'
+  $B6: {
     %38:ptr<storage, array<Inner, 4>, read> = access %p_3, 0u
     %39:ptr<storage, mat3x4<f32>, read> = access %S, 1u
     %40:f32 = call %f3, %38, %39
     ret %40
   }
 }
-%b = func():void -> %b7 {
-  %b7 = block {
+%b = func():void {
+  $B7: {
     %42:f32 = call %f4, %S
     ret
   }
@@ -1724,20 +1724,20 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, Outer, read> = var @binding_point(0, 0)
 }
 
-%f0 = func(%p_indices:array<u32, 1>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p_indices:array<u32, 1>):f32 {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:ptr<storage, vec4<f32>, read> = access %S, 1u, %4
     %6:f32 = load_vector_element %5, 0u
     ret %6
   }
 }
-%f0_1 = func(%p_indices_1:array<u32, 2>):f32 -> %b3 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
-  %b3 = block {
+%f0_1 = func(%p_indices_1:array<u32, 2>):f32 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
+  $B3: {
     %9:u32 = access %p_indices_1, 0u
     %10:u32 = access %p_indices_1, 1u
     %11:ptr<storage, vec4<f32>, read> = access %S, 0u, %9, 0u, %10
@@ -1745,8 +1745,8 @@
     ret %12
   }
 }
-%f1 = func():f32 -> %b4 {
-  %b4 = block {
+%f1 = func():f32 {
+  $B4: {
     %res:ptr<function, f32, read_write> = var
     %15:u32 = convert 1i
     %16:array<u32, 1> = construct %15
@@ -1778,8 +1778,8 @@
     ret %37
   }
 }
-%f1_1 = func(%p_indices_2:array<u32, 1>):f32 -> %b5 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
-  %b5 = block {
+%f1_1 = func(%p_indices_2:array<u32, 1>):f32 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
+  $B5: {
     %40:u32 = access %p_indices_2, 0u
     %res_1:ptr<function, f32, read_write> = var  # %res_1: 'res'
     %42:u32 = convert 1i
@@ -1812,16 +1812,16 @@
     ret %64
   }
 }
-%f2 = func(%p_indices_3:array<u32, 1>):f32 -> %b6 {  # %p_indices_3: 'p_indices'
-  %b6 = block {
+%f2 = func(%p_indices_3:array<u32, 1>):f32 {  # %p_indices_3: 'p_indices'
+  $B6: {
     %67:u32 = access %p_indices_3, 0u
     %68:array<u32, 1> = construct %67
     %69:f32 = call %f1_1, %68
     ret %69
   }
 }
-%f3 = func():f32 -> %b7 {
-  %b7 = block {
+%f3 = func():f32 {
+  $B7: {
     %71:u32 = convert 3i
     %72:array<u32, 1> = construct %71
     %73:f32 = call %f2, %72
@@ -1830,14 +1830,14 @@
     ret %75
   }
 }
-%f4 = func():f32 -> %b8 {
-  %b8 = block {
+%f4 = func():f32 {
+  $B8: {
     %77:f32 = call %f3
     ret %77
   }
 }
-%b = func():void -> %b9 {
-  %b9 = block {
+%b = func():void {
+  $B9: {
     %79:f32 = call %f4
     ret
   }
@@ -1893,33 +1893,33 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<storage, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var @binding_point(0, 0)
 }
 
-%f2 = func(%p:ptr<storage, array<vec4<i32>, 5>, read_write>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p:ptr<storage, array<vec4<i32>, 5>, read_write>):vec4<i32> {
+  $B2: {
     %4:ptr<storage, vec4<i32>, read_write> = access %p, 3u
     %5:vec4<i32> = load %4
     ret %5
   }
 }
-%f1 = func(%p_1:ptr<storage, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<storage, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> {  # %p_1: 'p'
+  $B3: {
     %8:ptr<storage, array<vec4<i32>, 5>, read_write> = access %p_1, 2u
     %9:vec4<i32> = call %f2, %8
     ret %9
   }
 }
-%f0 = func(%p_2:ptr<storage, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f0 = func(%p_2:ptr<storage, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> {  # %p_2: 'p'
+  $B4: {
     %12:ptr<storage, array<array<vec4<i32>, 5>, 5>, read_write> = access %p_2, 1u
     %13:vec4<i32> = call %f1, %12
     ret %13
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %15:vec4<i32> = call %f0, %U
     ret
   }
@@ -1929,12 +1929,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<storage, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var @binding_point(0, 0)
 }
 
-%f2 = func(%p_indices:array<u32, 2>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p_indices:array<u32, 2>):vec4<i32> {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:u32 = access %p_indices, 1u
     %6:ptr<storage, array<vec4<i32>, 5>, read_write> = access %U, %4, %5
@@ -1943,23 +1943,23 @@
     ret %8
   }
 }
-%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> -> %b3 {  # %p_indices_1: 'p_indices'
-  %b3 = block {
+%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> {  # %p_indices_1: 'p_indices'
+  $B3: {
     %11:u32 = access %p_indices_1, 0u
     %12:array<u32, 2> = construct %11, 2u
     %13:vec4<i32> = call %f2, %12
     ret %13
   }
 }
-%f0 = func():vec4<i32> -> %b4 {
-  %b4 = block {
+%f0 = func():vec4<i32> {
+  $B4: {
     %15:array<u32, 1> = construct 1u
     %16:vec4<i32> = call %f1, %15
     ret %16
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %18:vec4<i32> = call %f0
     ret
   }
@@ -2004,18 +2004,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, array<vec4<i32>, 8>, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<workgroup, vec4<i32>, read_write>, %post:i32):vec4<i32> -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<workgroup, vec4<i32>, read_write>, %post:i32):vec4<i32> {
+  $B2: {
     %6:vec4<i32> = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:ptr<workgroup, vec4<i32>, read_write> = access %W, 3i
     %9:vec4<i32> = call %a, 10i, %8, 20i
     ret
@@ -2026,20 +2026,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, array<vec4<i32>, 8>, read_write> = var
 }
 
-%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):vec4<i32> -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):vec4<i32> {
+  $B2: {
     %6:u32 = access %p_indices, 0u
     %7:ptr<workgroup, vec4<i32>, read_write> = access %W, %6
     %8:vec4<i32> = load %7
     ret %8
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %10:u32 = convert 3i
     %11:array<u32, 1> = construct %10
     %12:vec4<i32> = call %a, 10i, %11, 20i
@@ -2080,18 +2080,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, array<vec4<i32>, 8>, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<workgroup, vec4<i32>, read_write>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<workgroup, vec4<i32>, read_write>, %post:i32):void {
+  $B2: {
     store %p, vec4<i32>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:ptr<workgroup, vec4<i32>, read_write> = access %W, 3i
     %8:void = call %a, 10i, %7, 20i
     ret
@@ -2102,20 +2102,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, array<vec4<i32>, 8>, read_write> = var
 }
 
-%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p_indices:array<u32, 1>, %post:i32):void {
+  $B2: {
     %6:u32 = access %p_indices, 0u
     %7:ptr<workgroup, vec4<i32>, read_write> = access %W, %6
     store %7, vec4<i32>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %9:u32 = convert 3i
     %10:array<u32, 1> = construct %9
     %11:void = call %a, 10i, %10, 20i
@@ -2232,18 +2232,18 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, Outer, read_write> = var
 }
 
-%f0 = func(%p:ptr<workgroup, vec4<f32>, read_write>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p:ptr<workgroup, vec4<f32>, read_write>):f32 {
+  $B2: {
     %4:f32 = load_vector_element %p, 0u
     ret %4
   }
 }
-%f1 = func(%p_1:ptr<workgroup, mat3x4<f32>, read_write>):f32 -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<workgroup, mat3x4<f32>, read_write>):f32 {  # %p_1: 'p'
+  $B3: {
     %res:ptr<function, f32, read_write> = var
     %8:ptr<workgroup, vec4<f32>, read_write> = access %p_1, 1i
     %9:f32 = call %f0, %8
@@ -2269,15 +2269,15 @@
     ret %24
   }
 }
-%f2 = func(%p_2:ptr<workgroup, Inner, read_write>):f32 -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f2 = func(%p_2:ptr<workgroup, Inner, read_write>):f32 {  # %p_2: 'p'
+  $B4: {
     %p_mat:ptr<workgroup, mat3x4<f32>, read_write> = access %p_2, 0u
     %28:f32 = call %f1, %p_mat
     ret %28
   }
 }
-%f3 = func(%p0:ptr<workgroup, array<Inner, 4>, read_write>, %p1:ptr<workgroup, mat3x4<f32>, read_write>):f32 -> %b5 {
-  %b5 = block {
+%f3 = func(%p0:ptr<workgroup, array<Inner, 4>, read_write>, %p1:ptr<workgroup, mat3x4<f32>, read_write>):f32 {
+  $B5: {
     %p0_inner:ptr<workgroup, Inner, read_write> = access %p0, 3i
     %33:f32 = call %f2, %p0_inner
     %34:f32 = call %f1, %p1
@@ -2285,16 +2285,16 @@
     ret %35
   }
 }
-%f4 = func(%p_3:ptr<workgroup, Outer, read_write>):f32 -> %b6 {  # %p_3: 'p'
-  %b6 = block {
+%f4 = func(%p_3:ptr<workgroup, Outer, read_write>):f32 {  # %p_3: 'p'
+  $B6: {
     %38:ptr<workgroup, array<Inner, 4>, read_write> = access %p_3, 0u
     %39:ptr<workgroup, mat3x4<f32>, read_write> = access %W, 1u
     %40:f32 = call %f3, %38, %39
     ret %40
   }
 }
-%b = func():void -> %b7 {
-  %b7 = block {
+%b = func():void {
+  $B7: {
     %42:f32 = call %f4, %W
     ret
   }
@@ -2313,20 +2313,20 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, Outer, read_write> = var
 }
 
-%f0 = func(%p_indices:array<u32, 1>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p_indices:array<u32, 1>):f32 {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:ptr<workgroup, vec4<f32>, read_write> = access %W, 1u, %4
     %6:f32 = load_vector_element %5, 0u
     ret %6
   }
 }
-%f0_1 = func(%p_indices_1:array<u32, 2>):f32 -> %b3 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
-  %b3 = block {
+%f0_1 = func(%p_indices_1:array<u32, 2>):f32 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
+  $B3: {
     %9:u32 = access %p_indices_1, 0u
     %10:u32 = access %p_indices_1, 1u
     %11:ptr<workgroup, vec4<f32>, read_write> = access %W, 0u, %9, 0u, %10
@@ -2334,8 +2334,8 @@
     ret %12
   }
 }
-%f1 = func():f32 -> %b4 {
-  %b4 = block {
+%f1 = func():f32 {
+  $B4: {
     %res:ptr<function, f32, read_write> = var
     %15:u32 = convert 1i
     %16:array<u32, 1> = construct %15
@@ -2367,8 +2367,8 @@
     ret %37
   }
 }
-%f1_1 = func(%p_indices_2:array<u32, 1>):f32 -> %b5 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
-  %b5 = block {
+%f1_1 = func(%p_indices_2:array<u32, 1>):f32 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
+  $B5: {
     %40:u32 = access %p_indices_2, 0u
     %res_1:ptr<function, f32, read_write> = var  # %res_1: 'res'
     %42:u32 = convert 1i
@@ -2401,16 +2401,16 @@
     ret %64
   }
 }
-%f2 = func(%p_indices_3:array<u32, 1>):f32 -> %b6 {  # %p_indices_3: 'p_indices'
-  %b6 = block {
+%f2 = func(%p_indices_3:array<u32, 1>):f32 {  # %p_indices_3: 'p_indices'
+  $B6: {
     %67:u32 = access %p_indices_3, 0u
     %68:array<u32, 1> = construct %67
     %69:f32 = call %f1_1, %68
     ret %69
   }
 }
-%f3 = func():f32 -> %b7 {
-  %b7 = block {
+%f3 = func():f32 {
+  $B7: {
     %71:u32 = convert 3i
     %72:array<u32, 1> = construct %71
     %73:f32 = call %f2, %72
@@ -2419,14 +2419,14 @@
     ret %75
   }
 }
-%f4 = func():f32 -> %b8 {
-  %b8 = block {
+%f4 = func():f32 {
+  $B8: {
     %77:f32 = call %f3
     ret %77
   }
 }
-%b = func():void -> %b9 {
-  %b9 = block {
+%b = func():void {
+  $B9: {
     %79:f32 = call %f4
     ret
   }
@@ -2482,33 +2482,33 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<workgroup, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var @binding_point(0, 0)
 }
 
-%f2 = func(%p:ptr<workgroup, array<vec4<i32>, 5>, read_write>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p:ptr<workgroup, array<vec4<i32>, 5>, read_write>):vec4<i32> {
+  $B2: {
     %4:ptr<workgroup, vec4<i32>, read_write> = access %p, 3u
     %5:vec4<i32> = load %4
     ret %5
   }
 }
-%f1 = func(%p_1:ptr<workgroup, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<workgroup, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> {  # %p_1: 'p'
+  $B3: {
     %8:ptr<workgroup, array<vec4<i32>, 5>, read_write> = access %p_1, 2u
     %9:vec4<i32> = call %f2, %8
     ret %9
   }
 }
-%f0 = func(%p_2:ptr<workgroup, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f0 = func(%p_2:ptr<workgroup, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> {  # %p_2: 'p'
+  $B4: {
     %12:ptr<workgroup, array<array<vec4<i32>, 5>, 5>, read_write> = access %p_2, 1u
     %13:vec4<i32> = call %f1, %12
     ret %13
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %15:vec4<i32> = call %f0, %U
     ret
   }
@@ -2518,12 +2518,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<workgroup, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var @binding_point(0, 0)
 }
 
-%f2 = func(%p_indices:array<u32, 2>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p_indices:array<u32, 2>):vec4<i32> {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:u32 = access %p_indices, 1u
     %6:ptr<workgroup, array<vec4<i32>, 5>, read_write> = access %U, %4, %5
@@ -2532,23 +2532,23 @@
     ret %8
   }
 }
-%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> -> %b3 {  # %p_indices_1: 'p_indices'
-  %b3 = block {
+%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> {  # %p_indices_1: 'p_indices'
+  $B3: {
     %11:u32 = access %p_indices_1, 0u
     %12:array<u32, 2> = construct %11, 2u
     %13:vec4<i32> = call %f2, %12
     ret %13
   }
 }
-%f0 = func():vec4<i32> -> %b4 {
-  %b4 = block {
+%f0 = func():vec4<i32> {
+  $B4: {
     %15:array<u32, 1> = construct 1u
     %16:vec4<i32> = call %f1, %15
     ret %16
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %18:vec4<i32> = call %f0
     ret
   }
@@ -2592,18 +2592,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, i32, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:i32 = call %a, 10i, %P, 20i
     ret
   }
@@ -2613,19 +2613,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, i32, read_write> = var
 }
 
-%a = func(%pre:i32, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):i32 {
+  $B2: {
     %5:ptr<private, i32, read_write> = access %P
     %6:i32 = load %5
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:i32 = call %a, 10i, 20i
     ret
   }
@@ -2663,18 +2663,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, i32, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):void {
+  $B2: {
     store %p, 42i
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:void = call %a, 10i, %P, 20i
     ret
   }
@@ -2684,19 +2684,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, i32, read_write> = var
 }
 
-%a = func(%pre:i32, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):void {
+  $B2: {
     %5:ptr<private, i32, read_write> = access %P
     store %5, 42i
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:void = call %a, 10i, 20i
     ret
   }
@@ -2740,18 +2740,18 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, str, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:ptr<private, i32, read_write> = access %P, 0u
     %9:i32 = call %a, 10i, %8, 20i
     ret
@@ -2766,19 +2766,19 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, str, read_write> = var
 }
 
-%a = func(%pre:i32, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):i32 {
+  $B2: {
     %5:ptr<private, i32, read_write> = access %P, 0u
     %6:i32 = load %5
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:i32 = call %a, 10i, 20i
     ret
   }
@@ -2822,18 +2822,18 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, str, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %p
     ret %6
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %8:ptr<private, i32, read_write> = access %P, 0u
     %9:i32 = call %a, 10i, %8, 20i
     ret
@@ -2886,18 +2886,18 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, str, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, array<i32, 4>, read_write>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, array<i32, 4>, read_write>, %post:i32):void {
+  $B2: {
     store %p, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:ptr<private, array<i32, 4>, read_write> = access %P, 0u
     %8:void = call %a, 10i, %7, 20i
     ret
@@ -2912,19 +2912,19 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, str, read_write> = var
 }
 
-%a = func(%pre:i32, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):void {
+  $B2: {
     %5:ptr<private, array<i32, 4>, read_write> = access %P, 0u
     store %5, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:void = call %a, 10i, 20i
     ret
   }
@@ -2972,18 +2972,18 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, str, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, array<i32, 4>, read_write>, %post:i32):void -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, array<i32, 4>, read_write>, %post:i32):void {
+  $B2: {
     store %p, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %7:ptr<private, array<i32, 4>, read_write> = access %P, 0u
     %8:void = call %a, 10i, %7, 20i
     ret
@@ -3045,20 +3045,20 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %Pi:ptr<private, i32, read_write> = var
   %Ps:ptr<private, str, read_write> = var
   %Pa:ptr<private, array<i32, 4>, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %8:i32 = load %p
     ret %8
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %10:i32 = call %a, 10i, %Pi, 20i
     %11:ptr<private, i32, read_write> = access %Ps, 0u
     %12:i32 = call %a, 30i, %11, 40i
@@ -3076,36 +3076,36 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %Pi:ptr<private, i32, read_write> = var
   %Ps:ptr<private, str, read_write> = var
   %Pa:ptr<private, array<i32, 4>, read_write> = var
 }
 
-%a = func(%pre:i32, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %post:i32):i32 {
+  $B2: {
     %7:ptr<private, i32, read_write> = access %Pi
     %8:i32 = load %7
     ret %8
   }
 }
-%a_1 = func(%pre_1:i32, %post_1:i32):i32 -> %b3 {  # %a_1: 'a', %pre_1: 'pre', %post_1: 'post'
-  %b3 = block {
+%a_1 = func(%pre_1:i32, %post_1:i32):i32 {  # %a_1: 'a', %pre_1: 'pre', %post_1: 'post'
+  $B3: {
     %12:ptr<private, i32, read_write> = access %Ps, 0u
     %13:i32 = load %12
     ret %13
   }
 }
-%a_2 = func(%pre_2:i32, %p_indices:array<u32, 1>, %post_2:i32):i32 -> %b4 {  # %a_2: 'a', %pre_2: 'pre', %post_2: 'post'
-  %b4 = block {
+%a_2 = func(%pre_2:i32, %p_indices:array<u32, 1>, %post_2:i32):i32 {  # %a_2: 'a', %pre_2: 'pre', %post_2: 'post'
+  $B4: {
     %18:u32 = access %p_indices, 0u
     %19:ptr<private, i32, read_write> = access %Pa, %18
     %20:i32 = load %19
     ret %20
   }
 }
-%b = func():void -> %b5 {
-  %b5 = block {
+%b = func():void {
+  $B5: {
     %22:i32 = call %a, 10i, 20i
     %23:i32 = call %a_1, 30i, 40i
     %24:u32 = convert 2i
@@ -3166,20 +3166,20 @@
   i:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %Pi:ptr<private, i32, read_write> = var
   %Ps:ptr<private, str, read_write> = var
   %Pa:ptr<private, array<i32, 4>, read_write> = var
 }
 
-%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %p:ptr<private, i32, read_write>, %post:i32):i32 {
+  $B2: {
     %8:i32 = load %p
     ret %8
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %10:i32 = call %a, 10i, %Pi, 20i
     %11:ptr<private, i32, read_write> = access %Ps, 0u
     %12:i32 = call %a, 30i, %11, 40i
@@ -3302,18 +3302,18 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, Outer, read_write> = var
 }
 
-%f0 = func(%p:ptr<private, vec4<f32>, read_write>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p:ptr<private, vec4<f32>, read_write>):f32 {
+  $B2: {
     %4:f32 = load_vector_element %p, 0u
     ret %4
   }
 }
-%f1 = func(%p_1:ptr<private, mat3x4<f32>, read_write>):f32 -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<private, mat3x4<f32>, read_write>):f32 {  # %p_1: 'p'
+  $B3: {
     %res:ptr<function, f32, read_write> = var
     %8:ptr<private, vec4<f32>, read_write> = access %p_1, 1i
     %9:f32 = call %f0, %8
@@ -3339,15 +3339,15 @@
     ret %24
   }
 }
-%f2 = func(%p_2:ptr<private, Inner, read_write>):f32 -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f2 = func(%p_2:ptr<private, Inner, read_write>):f32 {  # %p_2: 'p'
+  $B4: {
     %p_mat:ptr<private, mat3x4<f32>, read_write> = access %p_2, 0u
     %28:f32 = call %f1, %p_mat
     ret %28
   }
 }
-%f3 = func(%p0:ptr<private, array<Inner, 4>, read_write>, %p1:ptr<private, mat3x4<f32>, read_write>):f32 -> %b5 {
-  %b5 = block {
+%f3 = func(%p0:ptr<private, array<Inner, 4>, read_write>, %p1:ptr<private, mat3x4<f32>, read_write>):f32 {
+  $B5: {
     %p0_inner:ptr<private, Inner, read_write> = access %p0, 3i
     %33:f32 = call %f2, %p0_inner
     %34:f32 = call %f1, %p1
@@ -3355,16 +3355,16 @@
     ret %35
   }
 }
-%f4 = func(%p_3:ptr<private, Outer, read_write>):f32 -> %b6 {  # %p_3: 'p'
-  %b6 = block {
+%f4 = func(%p_3:ptr<private, Outer, read_write>):f32 {  # %p_3: 'p'
+  $B6: {
     %38:ptr<private, array<Inner, 4>, read_write> = access %p_3, 0u
     %39:ptr<private, mat3x4<f32>, read_write> = access %P, 1u
     %40:f32 = call %f3, %38, %39
     ret %40
   }
 }
-%b = func():void -> %b7 {
-  %b7 = block {
+%b = func():void {
+  $B7: {
     %42:f32 = call %f4, %P
     ret
   }
@@ -3383,20 +3383,20 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, Outer, read_write> = var
 }
 
-%f0 = func(%p_indices:array<u32, 1>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p_indices:array<u32, 1>):f32 {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:ptr<private, vec4<f32>, read_write> = access %P, 1u, %4
     %6:f32 = load_vector_element %5, 0u
     ret %6
   }
 }
-%f0_1 = func(%p_indices_1:array<u32, 2>):f32 -> %b3 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
-  %b3 = block {
+%f0_1 = func(%p_indices_1:array<u32, 2>):f32 {  # %f0_1: 'f0', %p_indices_1: 'p_indices'
+  $B3: {
     %9:u32 = access %p_indices_1, 0u
     %10:u32 = access %p_indices_1, 1u
     %11:ptr<private, vec4<f32>, read_write> = access %P, 0u, %9, 0u, %10
@@ -3404,8 +3404,8 @@
     ret %12
   }
 }
-%f1 = func():f32 -> %b4 {
-  %b4 = block {
+%f1 = func():f32 {
+  $B4: {
     %res:ptr<function, f32, read_write> = var
     %15:u32 = convert 1i
     %16:array<u32, 1> = construct %15
@@ -3437,8 +3437,8 @@
     ret %37
   }
 }
-%f1_1 = func(%p_indices_2:array<u32, 1>):f32 -> %b5 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
-  %b5 = block {
+%f1_1 = func(%p_indices_2:array<u32, 1>):f32 {  # %f1_1: 'f1', %p_indices_2: 'p_indices'
+  $B5: {
     %40:u32 = access %p_indices_2, 0u
     %res_1:ptr<function, f32, read_write> = var  # %res_1: 'res'
     %42:u32 = convert 1i
@@ -3471,16 +3471,16 @@
     ret %64
   }
 }
-%f2 = func(%p_indices_3:array<u32, 1>):f32 -> %b6 {  # %p_indices_3: 'p_indices'
-  %b6 = block {
+%f2 = func(%p_indices_3:array<u32, 1>):f32 {  # %p_indices_3: 'p_indices'
+  $B6: {
     %67:u32 = access %p_indices_3, 0u
     %68:array<u32, 1> = construct %67
     %69:f32 = call %f1_1, %68
     ret %69
   }
 }
-%f3 = func():f32 -> %b7 {
-  %b7 = block {
+%f3 = func():f32 {
+  $B7: {
     %71:u32 = convert 3i
     %72:array<u32, 1> = construct %71
     %73:f32 = call %f2, %72
@@ -3489,14 +3489,14 @@
     ret %75
   }
 }
-%f4 = func():f32 -> %b8 {
-  %b8 = block {
+%f4 = func():f32 {
+  $B8: {
     %77:f32 = call %f3
     ret %77
   }
 }
-%b = func():void -> %b9 {
-  %b9 = block {
+%b = func():void {
+  $B9: {
     %79:f32 = call %f4
     ret
   }
@@ -3611,18 +3611,18 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, Outer, read_write> = var
 }
 
-%f0 = func(%p:ptr<private, vec4<f32>, read_write>):f32 -> %b2 {
-  %b2 = block {
+%f0 = func(%p:ptr<private, vec4<f32>, read_write>):f32 {
+  $B2: {
     %4:f32 = load_vector_element %p, 0u
     ret %4
   }
 }
-%f1 = func(%p_1:ptr<private, mat3x4<f32>, read_write>):f32 -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<private, mat3x4<f32>, read_write>):f32 {  # %p_1: 'p'
+  $B3: {
     %res:ptr<function, f32, read_write> = var
     %8:ptr<private, vec4<f32>, read_write> = access %p_1, 1i
     %9:f32 = call %f0, %8
@@ -3648,15 +3648,15 @@
     ret %24
   }
 }
-%f2 = func(%p_2:ptr<private, Inner, read_write>):f32 -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f2 = func(%p_2:ptr<private, Inner, read_write>):f32 {  # %p_2: 'p'
+  $B4: {
     %p_mat:ptr<private, mat3x4<f32>, read_write> = access %p_2, 0u
     %28:f32 = call %f1, %p_mat
     ret %28
   }
 }
-%f3 = func(%p0:ptr<private, array<Inner, 4>, read_write>, %p1:ptr<private, mat3x4<f32>, read_write>):f32 -> %b5 {
-  %b5 = block {
+%f3 = func(%p0:ptr<private, array<Inner, 4>, read_write>, %p1:ptr<private, mat3x4<f32>, read_write>):f32 {
+  $B5: {
     %p0_inner:ptr<private, Inner, read_write> = access %p0, 3i
     %33:f32 = call %f2, %p0_inner
     %34:f32 = call %f1, %p1
@@ -3664,16 +3664,16 @@
     ret %35
   }
 }
-%f4 = func(%p_3:ptr<private, Outer, read_write>):f32 -> %b6 {  # %p_3: 'p'
-  %b6 = block {
+%f4 = func(%p_3:ptr<private, Outer, read_write>):f32 {  # %p_3: 'p'
+  $B6: {
     %38:ptr<private, array<Inner, 4>, read_write> = access %p_3, 0u
     %39:ptr<private, mat3x4<f32>, read_write> = access %P, 1u
     %40:f32 = call %f3, %38, %39
     ret %40
   }
 }
-%b = func():void -> %b7 {
-  %b7 = block {
+%b = func():void {
+  $B7: {
     %42:f32 = call %f4, %P
     ret
   }
@@ -3733,33 +3733,33 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var
 }
 
-%f2 = func(%p:ptr<private, array<vec4<i32>, 5>, read_write>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p:ptr<private, array<vec4<i32>, 5>, read_write>):vec4<i32> {
+  $B2: {
     %4:ptr<private, vec4<i32>, read_write> = access %p, 3u
     %5:vec4<i32> = load %4
     ret %5
   }
 }
-%f1 = func(%p_1:ptr<private, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<private, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> {  # %p_1: 'p'
+  $B3: {
     %8:ptr<private, array<vec4<i32>, 5>, read_write> = access %p_1, 2u
     %9:vec4<i32> = call %f2, %8
     ret %9
   }
 }
-%f0 = func(%p_2:ptr<private, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f0 = func(%p_2:ptr<private, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> {  # %p_2: 'p'
+  $B4: {
     %12:ptr<private, array<array<vec4<i32>, 5>, 5>, read_write> = access %p_2, 1u
     %13:vec4<i32> = call %f1, %12
     ret %13
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %15:vec4<i32> = call %f0, %P
     ret
   }
@@ -3769,12 +3769,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var
 }
 
-%f2 = func(%p_indices:array<u32, 2>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p_indices:array<u32, 2>):vec4<i32> {
+  $B2: {
     %4:u32 = access %p_indices, 0u
     %5:u32 = access %p_indices, 1u
     %6:ptr<private, array<vec4<i32>, 5>, read_write> = access %P, %4, %5
@@ -3783,23 +3783,23 @@
     ret %8
   }
 }
-%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> -> %b3 {  # %p_indices_1: 'p_indices'
-  %b3 = block {
+%f1 = func(%p_indices_1:array<u32, 1>):vec4<i32> {  # %p_indices_1: 'p_indices'
+  $B3: {
     %11:u32 = access %p_indices_1, 0u
     %12:array<u32, 2> = construct %11, 2u
     %13:vec4<i32> = call %f2, %12
     ret %13
   }
 }
-%f0 = func():vec4<i32> -> %b4 {
-  %b4 = block {
+%f0 = func():vec4<i32> {
+  $B4: {
     %15:array<u32, 1> = construct 1u
     %16:vec4<i32> = call %f1, %15
     ret %16
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %18:vec4<i32> = call %f0
     ret
   }
@@ -3855,33 +3855,33 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %P:ptr<private, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var
 }
 
-%f2 = func(%p:ptr<private, array<vec4<i32>, 5>, read_write>):vec4<i32> -> %b2 {
-  %b2 = block {
+%f2 = func(%p:ptr<private, array<vec4<i32>, 5>, read_write>):vec4<i32> {
+  $B2: {
     %4:ptr<private, vec4<i32>, read_write> = access %p, 3u
     %5:vec4<i32> = load %4
     ret %5
   }
 }
-%f1 = func(%p_1:ptr<private, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%f1 = func(%p_1:ptr<private, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> {  # %p_1: 'p'
+  $B3: {
     %8:ptr<private, array<vec4<i32>, 5>, read_write> = access %p_1, 2u
     %9:vec4<i32> = call %f2, %8
     ret %9
   }
 }
-%f0 = func(%p_2:ptr<private, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%f0 = func(%p_2:ptr<private, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> {  # %p_2: 'p'
+  $B4: {
     %12:ptr<private, array<array<vec4<i32>, 5>, 5>, read_write> = access %p_2, 1u
     %13:vec4<i32> = call %f1, %12
     ret %13
   }
 }
-%main = func():void -> %b5 {
-  %b5 = block {
+%main = func():void {
+  $B5: {
     %15:vec4<i32> = call %f0, %P
     ret
   }
@@ -3916,8 +3916,8 @@
     });
 
     auto* src = R"(
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
     %p:ptr<function, i32, read_write> = let %v
     %4:i32 = load %p
@@ -3954,14 +3954,14 @@
     });
 
     auto* src = R"(
-%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B1: {
     %5:i32 = load %p
     ret %5
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, i32, read_write> = var
     %8:i32 = call %a, 10i, %F, 20i
     ret
@@ -3972,15 +3972,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%pre:i32, %p_root:ptr<function, i32, read_write>, %post:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p_root:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B1: {
     %5:ptr<function, i32, read_write> = access %p_root
     %6:i32 = load %5
     ret %6
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, i32, read_write> = var
     %9:i32 = call %a, 10i, %F, 20i
     ret
@@ -4014,14 +4014,14 @@
     });
 
     auto* src = R"(
-%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):void -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):void {
+  $B1: {
     store %p, 42i
     ret
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, i32, read_write> = var
     %7:void = call %a, 10i, %F, 20i
     ret
@@ -4032,15 +4032,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%pre:i32, %p_root:ptr<function, i32, read_write>, %post:i32):void -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p_root:ptr<function, i32, read_write>, %post:i32):void {
+  $B1: {
     %5:ptr<function, i32, read_write> = access %p_root
     store %5, 42i
     ret
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, i32, read_write> = var
     %8:void = call %a, 10i, %F, 20i
     ret
@@ -4080,14 +4080,14 @@
   i:i32 @offset(0)
 }
 
-%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B1: {
     %5:i32 = load %p
     ret %5
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, str, read_write> = var
     %8:ptr<function, i32, read_write> = access %F, 0u
     %9:i32 = call %a, 10i, %8, 20i
@@ -4103,15 +4103,15 @@
   i:i32 @offset(0)
 }
 
-%a = func(%pre:i32, %p_root:ptr<function, str, read_write>, %post:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p_root:ptr<function, str, read_write>, %post:i32):i32 {
+  $B1: {
     %5:ptr<function, i32, read_write> = access %p_root, 0u
     %6:i32 = load %5
     ret %6
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, str, read_write> = var
     %9:i32 = call %a, 10i, %F, 20i
     ret
@@ -4155,14 +4155,14 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%a = func(%pre:i32, %p:ptr<function, array<i32, 4>, read_write>, %post:i32):void -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p:ptr<function, array<i32, 4>, read_write>, %post:i32):void {
+  $B1: {
     store %p, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, str, read_write> = var
     %7:ptr<function, array<i32, 4>, read_write> = access %F, 0u
     %8:void = call %a, 10i, %7, 20i
@@ -4178,15 +4178,15 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%a = func(%pre:i32, %p_root:ptr<function, str, read_write>, %post:i32):void -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p_root:ptr<function, str, read_write>, %post:i32):void {
+  $B1: {
     %5:ptr<function, array<i32, 4>, read_write> = access %p_root, 0u
     store %5, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, str, read_write> = var
     %8:void = call %a, 10i, %F, 20i
     ret
@@ -4237,14 +4237,14 @@
   i:i32 @offset(0)
 }
 
-%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B1: {
     %5:i32 = load %p
     ret %5
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %Fi:ptr<function, i32, read_write> = var
     %Fs:ptr<function, str, read_write> = var
     %Fa:ptr<function, array<i32, 4>, read_write> = var
@@ -4265,30 +4265,30 @@
   i:i32 @offset(0)
 }
 
-%a = func(%pre:i32, %p_root:ptr<function, i32, read_write>, %post:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p_root:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B1: {
     %5:ptr<function, i32, read_write> = access %p_root
     %6:i32 = load %5
     ret %6
   }
 }
-%a_1 = func(%pre_1:i32, %p_root_1:ptr<function, str, read_write>, %post_1:i32):i32 -> %b2 {  # %a_1: 'a', %pre_1: 'pre', %p_root_1: 'p_root', %post_1: 'post'
-  %b2 = block {
+%a_1 = func(%pre_1:i32, %p_root_1:ptr<function, str, read_write>, %post_1:i32):i32 {  # %a_1: 'a', %pre_1: 'pre', %p_root_1: 'p_root', %post_1: 'post'
+  $B2: {
     %11:ptr<function, i32, read_write> = access %p_root_1, 0u
     %12:i32 = load %11
     ret %12
   }
 }
-%a_2 = func(%pre_2:i32, %p_root_2:ptr<function, array<i32, 4>, read_write>, %p_indices:array<u32, 1>, %post_2:i32):i32 -> %b3 {  # %a_2: 'a', %pre_2: 'pre', %p_root_2: 'p_root', %post_2: 'post'
-  %b3 = block {
+%a_2 = func(%pre_2:i32, %p_root_2:ptr<function, array<i32, 4>, read_write>, %p_indices:array<u32, 1>, %post_2:i32):i32 {  # %a_2: 'a', %pre_2: 'pre', %p_root_2: 'p_root', %post_2: 'post'
+  $B3: {
     %18:u32 = access %p_indices, 0u
     %19:ptr<function, i32, read_write> = access %p_root_2, %18
     %20:i32 = load %19
     ret %20
   }
 }
-%b = func():void -> %b4 {
-  %b4 = block {
+%b = func():void {
+  $B4: {
     %Fi:ptr<function, i32, read_write> = var
     %Fs:ptr<function, str, read_write> = var
     %Fa:ptr<function, array<i32, 4>, read_write> = var
@@ -4334,14 +4334,14 @@
   i:i32 @offset(0)
 }
 
-%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p:ptr<function, i32, read_write>, %post:i32):i32 {
+  $B1: {
     %5:i32 = load %p
     ret %5
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, str, read_write> = var
     %8:ptr<function, i32, read_write> = access %F, 0u
     %9:i32 = call %a, 10i, %8, 20i
@@ -4390,14 +4390,14 @@
   arr:array<i32, 4> @offset(0)
 }
 
-%a = func(%pre:i32, %p:ptr<function, array<i32, 4>, read_write>, %post:i32):void -> %b1 {
-  %b1 = block {
+%a = func(%pre:i32, %p:ptr<function, array<i32, 4>, read_write>, %post:i32):void {
+  $B1: {
     store %p, array<i32, 4>(0i)
     ret
   }
 }
-%b = func():void -> %b2 {
-  %b2 = block {
+%b = func():void {
+  $B2: {
     %F:ptr<function, str, read_write> = var
     %7:ptr<function, array<i32, 4>, read_write> = access %F, 0u
     %8:void = call %a, 10i, %7, 20i
@@ -4505,14 +4505,14 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%f0 = func(%p:ptr<function, vec4<f32>, read_write>):f32 -> %b1 {
-  %b1 = block {
+%f0 = func(%p:ptr<function, vec4<f32>, read_write>):f32 {
+  $B1: {
     %3:f32 = load_vector_element %p, 0u
     ret %3
   }
 }
-%f1 = func(%p_1:ptr<function, mat3x4<f32>, read_write>):f32 -> %b2 {  # %p_1: 'p'
-  %b2 = block {
+%f1 = func(%p_1:ptr<function, mat3x4<f32>, read_write>):f32 {  # %p_1: 'p'
+  $B2: {
     %res:ptr<function, f32, read_write> = var
     %7:ptr<function, vec4<f32>, read_write> = access %p_1, 1i
     %8:f32 = call %f0, %7
@@ -4528,29 +4528,29 @@
     ret %15
   }
 }
-%f2 = func(%p_2:ptr<function, Inner, read_write>):f32 -> %b3 {  # %p_2: 'p'
-  %b3 = block {
+%f2 = func(%p_2:ptr<function, Inner, read_write>):f32 {  # %p_2: 'p'
+  $B3: {
     %p_mat:ptr<function, mat3x4<f32>, read_write> = access %p_2, 0u
     %19:f32 = call %f1, %p_mat
     ret %19
   }
 }
-%f3 = func(%p_3:ptr<function, array<Inner, 4>, read_write>):f32 -> %b4 {  # %p_3: 'p'
-  %b4 = block {
+%f3 = func(%p_3:ptr<function, array<Inner, 4>, read_write>):f32 {  # %p_3: 'p'
+  $B4: {
     %p_inner:ptr<function, Inner, read_write> = access %p_3, 3i
     %23:f32 = call %f2, %p_inner
     ret %23
   }
 }
-%f4 = func(%p_4:ptr<function, Outer, read_write>):f32 -> %b5 {  # %p_4: 'p'
-  %b5 = block {
+%f4 = func(%p_4:ptr<function, Outer, read_write>):f32 {  # %p_4: 'p'
+  $B5: {
     %26:ptr<function, array<Inner, 4>, read_write> = access %p_4, 0u
     %27:f32 = call %f3, %26
     ret %27
   }
 }
-%b = func():void -> %b6 {
-  %b6 = block {
+%b = func():void {
+  $B6: {
     %F:ptr<function, Outer, read_write> = var
     %30:f32 = call %f4, %F
     ret
@@ -4570,8 +4570,8 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%f0 = func(%p_root:ptr<function, Outer, read_write>, %p_indices:array<u32, 2>):f32 -> %b1 {
-  %b1 = block {
+%f0 = func(%p_root:ptr<function, Outer, read_write>, %p_indices:array<u32, 2>):f32 {
+  $B1: {
     %4:u32 = access %p_indices, 0u
     %5:u32 = access %p_indices, 1u
     %6:ptr<function, vec4<f32>, read_write> = access %p_root, 0u, %4, 0u, %5
@@ -4579,8 +4579,8 @@
     ret %7
   }
 }
-%f1 = func(%p_root_1:ptr<function, Outer, read_write>, %p_indices_1:array<u32, 1>):f32 -> %b2 {  # %p_root_1: 'p_root', %p_indices_1: 'p_indices'
-  %b2 = block {
+%f1 = func(%p_root_1:ptr<function, Outer, read_write>, %p_indices_1:array<u32, 1>):f32 {  # %p_root_1: 'p_root', %p_indices_1: 'p_indices'
+  $B2: {
     %11:u32 = access %p_indices_1, 0u
     %res:ptr<function, f32, read_write> = var
     %13:u32 = convert 1i
@@ -4599,30 +4599,30 @@
     ret %23
   }
 }
-%f2 = func(%p_root_2:ptr<function, Outer, read_write>, %p_indices_2:array<u32, 1>):f32 -> %b3 {  # %p_root_2: 'p_root', %p_indices_2: 'p_indices'
-  %b3 = block {
+%f2 = func(%p_root_2:ptr<function, Outer, read_write>, %p_indices_2:array<u32, 1>):f32 {  # %p_root_2: 'p_root', %p_indices_2: 'p_indices'
+  $B3: {
     %27:u32 = access %p_indices_2, 0u
     %28:array<u32, 1> = construct %27
     %29:f32 = call %f1, %p_root_2, %28
     ret %29
   }
 }
-%f3 = func(%p_root_3:ptr<function, Outer, read_write>):f32 -> %b4 {  # %p_root_3: 'p_root'
-  %b4 = block {
+%f3 = func(%p_root_3:ptr<function, Outer, read_write>):f32 {  # %p_root_3: 'p_root'
+  $B4: {
     %32:u32 = convert 3i
     %33:array<u32, 1> = construct %32
     %34:f32 = call %f2, %p_root_3, %33
     ret %34
   }
 }
-%f4 = func(%p_root_4:ptr<function, Outer, read_write>):f32 -> %b5 {  # %p_root_4: 'p_root'
-  %b5 = block {
+%f4 = func(%p_root_4:ptr<function, Outer, read_write>):f32 {  # %p_root_4: 'p_root'
+  $B5: {
     %37:f32 = call %f3, %p_root_4
     ret %37
   }
 }
-%b = func():void -> %b6 {
-  %b6 = block {
+%b = func():void {
+  $B6: {
     %F:ptr<function, Outer, read_write> = var
     %40:f32 = call %f4, %F
     ret
@@ -4725,14 +4725,14 @@
   mat:mat3x4<f32> @offset(192)
 }
 
-%f0 = func(%p:ptr<function, vec4<f32>, read_write>):f32 -> %b1 {
-  %b1 = block {
+%f0 = func(%p:ptr<function, vec4<f32>, read_write>):f32 {
+  $B1: {
     %3:f32 = load_vector_element %p, 0u
     ret %3
   }
 }
-%f1 = func(%p_1:ptr<function, mat3x4<f32>, read_write>):f32 -> %b2 {  # %p_1: 'p'
-  %b2 = block {
+%f1 = func(%p_1:ptr<function, mat3x4<f32>, read_write>):f32 {  # %p_1: 'p'
+  $B2: {
     %res:ptr<function, f32, read_write> = var
     %7:ptr<function, vec4<f32>, read_write> = access %p_1, 1i
     %8:f32 = call %f0, %7
@@ -4748,29 +4748,29 @@
     ret %15
   }
 }
-%f2 = func(%p_2:ptr<function, Inner, read_write>):f32 -> %b3 {  # %p_2: 'p'
-  %b3 = block {
+%f2 = func(%p_2:ptr<function, Inner, read_write>):f32 {  # %p_2: 'p'
+  $B3: {
     %p_mat:ptr<function, mat3x4<f32>, read_write> = access %p_2, 0u
     %19:f32 = call %f1, %p_mat
     ret %19
   }
 }
-%f3 = func(%p_3:ptr<function, array<Inner, 4>, read_write>):f32 -> %b4 {  # %p_3: 'p'
-  %b4 = block {
+%f3 = func(%p_3:ptr<function, array<Inner, 4>, read_write>):f32 {  # %p_3: 'p'
+  $B4: {
     %p_inner:ptr<function, Inner, read_write> = access %p_3, 3i
     %23:f32 = call %f2, %p_inner
     ret %23
   }
 }
-%f4 = func(%p_4:ptr<function, Outer, read_write>):f32 -> %b5 {  # %p_4: 'p'
-  %b5 = block {
+%f4 = func(%p_4:ptr<function, Outer, read_write>):f32 {  # %p_4: 'p'
+  $B5: {
     %26:ptr<function, array<Inner, 4>, read_write> = access %p_4, 0u
     %27:f32 = call %f3, %26
     ret %27
   }
 }
-%b = func():void -> %b6 {
-  %b6 = block {
+%b = func():void {
+  $B6: {
     %F:ptr<function, Outer, read_write> = var
     %30:f32 = call %f4, %F
     ret
@@ -4826,29 +4826,29 @@
     });
 
     auto* src = R"(
-%f2 = func(%p:ptr<function, array<vec4<i32>, 5>, read_write>):vec4<i32> -> %b1 {
-  %b1 = block {
+%f2 = func(%p:ptr<function, array<vec4<i32>, 5>, read_write>):vec4<i32> {
+  $B1: {
     %3:ptr<function, vec4<i32>, read_write> = access %p, 3u
     %4:vec4<i32> = load %3
     ret %4
   }
 }
-%f1 = func(%p_1:ptr<function, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> -> %b2 {  # %p_1: 'p'
-  %b2 = block {
+%f1 = func(%p_1:ptr<function, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> {  # %p_1: 'p'
+  $B2: {
     %7:ptr<function, array<vec4<i32>, 5>, read_write> = access %p_1, 2u
     %8:vec4<i32> = call %f2, %7
     ret %8
   }
 }
-%f0 = func(%p_2:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> -> %b3 {  # %p_2: 'p'
-  %b3 = block {
+%f0 = func(%p_2:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> {  # %p_2: 'p'
+  $B3: {
     %11:ptr<function, array<array<vec4<i32>, 5>, 5>, read_write> = access %p_2, 1u
     %12:vec4<i32> = call %f1, %11
     ret %12
   }
 }
-%main = func():void -> %b4 {
-  %b4 = block {
+%main = func():void {
+  $B4: {
     %F:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var
     %15:vec4<i32> = call %f0, %F
     ret
@@ -4859,8 +4859,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f2 = func(%p_root:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>, %p_indices:array<u32, 2>):vec4<i32> -> %b1 {
-  %b1 = block {
+%f2 = func(%p_root:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>, %p_indices:array<u32, 2>):vec4<i32> {
+  $B1: {
     %4:u32 = access %p_indices, 0u
     %5:u32 = access %p_indices, 1u
     %6:ptr<function, array<vec4<i32>, 5>, read_write> = access %p_root, %4, %5
@@ -4869,23 +4869,23 @@
     ret %8
   }
 }
-%f1 = func(%p_root_1:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>, %p_indices_1:array<u32, 1>):vec4<i32> -> %b2 {  # %p_root_1: 'p_root', %p_indices_1: 'p_indices'
-  %b2 = block {
+%f1 = func(%p_root_1:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>, %p_indices_1:array<u32, 1>):vec4<i32> {  # %p_root_1: 'p_root', %p_indices_1: 'p_indices'
+  $B2: {
     %12:u32 = access %p_indices_1, 0u
     %13:array<u32, 2> = construct %12, 2u
     %14:vec4<i32> = call %f2, %p_root_1, %13
     ret %14
   }
 }
-%f0 = func(%p_root_2:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> -> %b3 {  # %p_root_2: 'p_root'
-  %b3 = block {
+%f0 = func(%p_root_2:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> {  # %p_root_2: 'p_root'
+  $B3: {
     %17:array<u32, 1> = construct 1u
     %18:vec4<i32> = call %f1, %p_root_2, %17
     ret %18
   }
 }
-%main = func():void -> %b4 {
-  %b4 = block {
+%main = func():void {
+  $B4: {
     %F:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var
     %21:vec4<i32> = call %f0, %F
     ret
@@ -4937,29 +4937,29 @@
     });
 
     auto* src = R"(
-%f2 = func(%p:ptr<function, array<vec4<i32>, 5>, read_write>):vec4<i32> -> %b1 {
-  %b1 = block {
+%f2 = func(%p:ptr<function, array<vec4<i32>, 5>, read_write>):vec4<i32> {
+  $B1: {
     %3:ptr<function, vec4<i32>, read_write> = access %p, 3u
     %4:vec4<i32> = load %3
     ret %4
   }
 }
-%f1 = func(%p_1:ptr<function, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> -> %b2 {  # %p_1: 'p'
-  %b2 = block {
+%f1 = func(%p_1:ptr<function, array<array<vec4<i32>, 5>, 5>, read_write>):vec4<i32> {  # %p_1: 'p'
+  $B2: {
     %7:ptr<function, array<vec4<i32>, 5>, read_write> = access %p_1, 2u
     %8:vec4<i32> = call %f2, %7
     ret %8
   }
 }
-%f0 = func(%p_2:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> -> %b3 {  # %p_2: 'p'
-  %b3 = block {
+%f0 = func(%p_2:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write>):vec4<i32> {  # %p_2: 'p'
+  $B3: {
     %11:ptr<function, array<array<vec4<i32>, 5>, 5>, read_write> = access %p_2, 1u
     %12:vec4<i32> = call %f1, %11
     ret %12
   }
 }
-%main = func():void -> %b4 {
-  %b4 = block {
+%main = func():void {
+  $B4: {
     %F:ptr<function, array<array<array<vec4<i32>, 5>, 5>, 5>, read_write> = var
     %15:vec4<i32> = call %f0, %F
     ret
@@ -5008,18 +5008,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<f32>, read_write> = var @binding_point(0, 0)
 }
 
-%len = func(%p:ptr<storage, array<f32>, read_write>):u32 -> %b2 {
-  %b2 = block {
+%len = func(%p:ptr<storage, array<f32>, read_write>):u32 {
+  $B2: {
     %4:u32 = arrayLength %p
     ret %4
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %6:u32 = call %len, %S
     ret
   }
@@ -5029,19 +5029,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<f32>, read_write> = var @binding_point(0, 0)
 }
 
-%len = func():u32 -> %b2 {
-  %b2 = block {
+%len = func():u32 {
+  $B2: {
     %3:ptr<storage, array<f32>, read_write> = access %S
     %4:u32 = arrayLength %3
     ret %4
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %6:u32 = call %len
     ret
   }
@@ -5075,18 +5075,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%load = func(%p:ptr<workgroup, atomic<i32>, read_write>):i32 -> %b2 {
-  %b2 = block {
+%load = func(%p:ptr<workgroup, atomic<i32>, read_write>):i32 {
+  $B2: {
     %4:i32 = atomicLoad %p
     ret %4
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %6:i32 = call %load, %W
     ret
   }
@@ -5096,19 +5096,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%load = func():i32 -> %b2 {
-  %b2 = block {
+%load = func():i32 {
+  $B2: {
     %3:ptr<workgroup, atomic<i32>, read_write> = access %W
     %4:i32 = atomicLoad %3
     ret %4
   }
 }
-%b = func():void -> %b3 {
-  %b3 = block {
+%b = func():void {
+  $B3: {
     %6:i32 = call %load
     ret
   }
@@ -5265,7 +5265,7 @@
   i:vec4<i32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, vec4<i32>, read> = var @binding_point(0, 0)
   %U_str:ptr<uniform, str, read> = var @binding_point(0, 1)
   %U_arr:ptr<uniform, array<vec4<i32>, 8>, read> = var @binding_point(0, 2)
@@ -5280,26 +5280,26 @@
   %W_arr_arr:ptr<workgroup, array<array<vec4<i32>, 8>, 4>, read_write> = var
 }
 
-%fn_u = func(%p:ptr<uniform, vec4<i32>, read>):vec4<i32> -> %b2 {
-  %b2 = block {
+%fn_u = func(%p:ptr<uniform, vec4<i32>, read>):vec4<i32> {
+  $B2: {
     %15:vec4<i32> = load %p
     ret %15
   }
 }
-%fn_s = func(%p_1:ptr<storage, vec4<i32>, read>):vec4<i32> -> %b3 {  # %p_1: 'p'
-  %b3 = block {
+%fn_s = func(%p_1:ptr<storage, vec4<i32>, read>):vec4<i32> {  # %p_1: 'p'
+  $B3: {
     %18:vec4<i32> = load %p_1
     ret %18
   }
 }
-%fn_w = func(%p_2:ptr<workgroup, vec4<i32>, read_write>):vec4<i32> -> %b4 {  # %p_2: 'p'
-  %b4 = block {
+%fn_w = func(%p_2:ptr<workgroup, vec4<i32>, read_write>):vec4<i32> {  # %p_2: 'p'
+  $B4: {
     %21:vec4<i32> = load %p_2
     ret %21
   }
 }
-%b = func():void -> %b5 {
-  %b5 = block {
+%b = func():void {
+  $B5: {
     %I:i32 = let 3i
     %J:i32 = let 4i
     %u:vec4<i32> = call %fn_u, %U
@@ -5365,7 +5365,7 @@
   i:vec4<i32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %U:ptr<uniform, vec4<i32>, read> = var @binding_point(0, 0)
   %U_str:ptr<uniform, str, read> = var @binding_point(0, 1)
   %U_arr:ptr<uniform, array<vec4<i32>, 8>, read> = var @binding_point(0, 2)
@@ -5380,30 +5380,30 @@
   %W_arr_arr:ptr<workgroup, array<array<vec4<i32>, 8>, 4>, read_write> = var
 }
 
-%fn_u = func():vec4<i32> -> %b2 {
-  %b2 = block {
+%fn_u = func():vec4<i32> {
+  $B2: {
     %14:ptr<uniform, vec4<i32>, read> = access %U
     %15:vec4<i32> = load %14
     ret %15
   }
 }
-%fn_u_1 = func():vec4<i32> -> %b3 {  # %fn_u_1: 'fn_u'
-  %b3 = block {
+%fn_u_1 = func():vec4<i32> {  # %fn_u_1: 'fn_u'
+  $B3: {
     %17:ptr<uniform, vec4<i32>, read> = access %U_str, 0u
     %18:vec4<i32> = load %17
     ret %18
   }
 }
-%fn_u_2 = func(%p_indices:array<u32, 1>):vec4<i32> -> %b4 {  # %fn_u_2: 'fn_u'
-  %b4 = block {
+%fn_u_2 = func(%p_indices:array<u32, 1>):vec4<i32> {  # %fn_u_2: 'fn_u'
+  $B4: {
     %21:u32 = access %p_indices, 0u
     %22:ptr<uniform, vec4<i32>, read> = access %U_arr, %21
     %23:vec4<i32> = load %22
     ret %23
   }
 }
-%fn_u_3 = func(%p_indices_1:array<u32, 2>):vec4<i32> -> %b5 {  # %fn_u_3: 'fn_u', %p_indices_1: 'p_indices'
-  %b5 = block {
+%fn_u_3 = func(%p_indices_1:array<u32, 2>):vec4<i32> {  # %fn_u_3: 'fn_u', %p_indices_1: 'p_indices'
+  $B5: {
     %26:u32 = access %p_indices_1, 0u
     %27:u32 = access %p_indices_1, 1u
     %28:ptr<uniform, vec4<i32>, read> = access %U_arr_arr, %26, %27
@@ -5411,30 +5411,30 @@
     ret %29
   }
 }
-%fn_s = func():vec4<i32> -> %b6 {
-  %b6 = block {
+%fn_s = func():vec4<i32> {
+  $B6: {
     %31:ptr<storage, vec4<i32>, read> = access %S
     %32:vec4<i32> = load %31
     ret %32
   }
 }
-%fn_s_1 = func():vec4<i32> -> %b7 {  # %fn_s_1: 'fn_s'
-  %b7 = block {
+%fn_s_1 = func():vec4<i32> {  # %fn_s_1: 'fn_s'
+  $B7: {
     %34:ptr<storage, vec4<i32>, read> = access %S_str, 0u
     %35:vec4<i32> = load %34
     ret %35
   }
 }
-%fn_s_2 = func(%p_indices_2:array<u32, 1>):vec4<i32> -> %b8 {  # %fn_s_2: 'fn_s', %p_indices_2: 'p_indices'
-  %b8 = block {
+%fn_s_2 = func(%p_indices_2:array<u32, 1>):vec4<i32> {  # %fn_s_2: 'fn_s', %p_indices_2: 'p_indices'
+  $B8: {
     %38:u32 = access %p_indices_2, 0u
     %39:ptr<storage, vec4<i32>, read> = access %S_arr, %38
     %40:vec4<i32> = load %39
     ret %40
   }
 }
-%fn_s_3 = func(%p_indices_3:array<u32, 2>):vec4<i32> -> %b9 {  # %fn_s_3: 'fn_s', %p_indices_3: 'p_indices'
-  %b9 = block {
+%fn_s_3 = func(%p_indices_3:array<u32, 2>):vec4<i32> {  # %fn_s_3: 'fn_s', %p_indices_3: 'p_indices'
+  $B9: {
     %43:u32 = access %p_indices_3, 0u
     %44:u32 = access %p_indices_3, 1u
     %45:ptr<storage, vec4<i32>, read> = access %S_arr_arr, %43, %44
@@ -5442,30 +5442,30 @@
     ret %46
   }
 }
-%fn_w = func():vec4<i32> -> %b10 {
-  %b10 = block {
+%fn_w = func():vec4<i32> {
+  $B10: {
     %48:ptr<workgroup, vec4<i32>, read_write> = access %W
     %49:vec4<i32> = load %48
     ret %49
   }
 }
-%fn_w_1 = func():vec4<i32> -> %b11 {  # %fn_w_1: 'fn_w'
-  %b11 = block {
+%fn_w_1 = func():vec4<i32> {  # %fn_w_1: 'fn_w'
+  $B11: {
     %51:ptr<workgroup, vec4<i32>, read_write> = access %W_str, 0u
     %52:vec4<i32> = load %51
     ret %52
   }
 }
-%fn_w_2 = func(%p_indices_4:array<u32, 1>):vec4<i32> -> %b12 {  # %fn_w_2: 'fn_w', %p_indices_4: 'p_indices'
-  %b12 = block {
+%fn_w_2 = func(%p_indices_4:array<u32, 1>):vec4<i32> {  # %fn_w_2: 'fn_w', %p_indices_4: 'p_indices'
+  $B12: {
     %55:u32 = access %p_indices_4, 0u
     %56:ptr<workgroup, vec4<i32>, read_write> = access %W_arr, %55
     %57:vec4<i32> = load %56
     ret %57
   }
 }
-%fn_w_3 = func(%p_indices_5:array<u32, 2>):vec4<i32> -> %b13 {  # %fn_w_3: 'fn_w', %p_indices_5: 'p_indices'
-  %b13 = block {
+%fn_w_3 = func(%p_indices_5:array<u32, 2>):vec4<i32> {  # %fn_w_3: 'fn_w', %p_indices_5: 'p_indices'
+  $B13: {
     %60:u32 = access %p_indices_5, 0u
     %61:u32 = access %p_indices_5, 1u
     %62:ptr<workgroup, vec4<i32>, read_write> = access %W_arr_arr, %60, %61
@@ -5473,8 +5473,8 @@
     ret %63
   }
 }
-%b = func():void -> %b14 {
-  %b14 = block {
+%b = func():void {
+  $B14: {
     %I:i32 = let 3i
     %J:i32 = let 4i
     %u:vec4<i32> = call %fn_u
@@ -5609,17 +5609,17 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<array<array<array<i32, 9>, 9>, 9>, 50>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%i:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%i:i32):i32 {
+  $B2: {
     ret %i
   }
 }
-%b = func(%p:ptr<storage, array<array<array<i32, 9>, 9>, 9>, read>):i32 -> %b3 {
-  %b3 = block {
+%b = func(%p:ptr<storage, array<array<array<i32, 9>, 9>, 9>, read>):i32 {
+  $B3: {
     %6:ptr<storage, i32, read> = access %p, 0i, 1i, 2i
     %7:i32 = load %6
     %8:i32 = call %a, %7
@@ -5636,8 +5636,8 @@
     ret %18
   }
 }
-%c = func():void -> %b4 {
-  %b4 = block {
+%c = func():void {
+  $B4: {
     %20:ptr<storage, array<array<array<i32, 9>, 9>, 9>, read> = access %S, 42i
     %v:i32 = call %b, %20
     ret
@@ -5648,17 +5648,17 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<array<array<array<i32, 9>, 9>, 9>, 50>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%i:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%i:i32):i32 {
+  $B2: {
     ret %i
   }
 }
-%b = func(%p_indices:array<u32, 1>):i32 -> %b3 {
-  %b3 = block {
+%b = func(%p_indices:array<u32, 1>):i32 {
+  $B3: {
     %6:u32 = access %p_indices, 0u
     %7:ptr<storage, array<array<array<i32, 9>, 9>, 9>, read> = access %S, %6
     %8:ptr<storage, i32, read> = access %7, 0i, 1i, 2i
@@ -5677,8 +5677,8 @@
     ret %20
   }
 }
-%c = func():void -> %b4 {
-  %b4 = block {
+%c = func():void {
+  $B4: {
     %22:u32 = convert 42i
     %23:array<u32, 1> = construct %22
     %v:i32 = call %b, %23
@@ -5738,18 +5738,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<array<array<array<i32, 9>, 9>, 9>, 50>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %i:ptr<storage, i32, read>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %i:ptr<storage, i32, read>, %post:i32):i32 {
+  $B2: {
     %6:i32 = load %i
     ret %6
   }
 }
-%b = func(%p:ptr<storage, array<array<array<i32, 9>, 9>, 9>, read>):i32 -> %b3 {
-  %b3 = block {
+%b = func(%p:ptr<storage, array<array<array<i32, 9>, 9>, 9>, read>):i32 {
+  $B3: {
     %9:ptr<storage, i32, read> = access %p, 0i, 1i, 2i
     %10:i32 = call %a, 20i, %9, 30i
     %11:ptr<storage, i32, read> = access %p, 3i, 4i, 5i
@@ -5761,8 +5761,8 @@
     ret %16
   }
 }
-%c = func():void -> %b4 {
-  %b4 = block {
+%c = func():void {
+  $B4: {
     %18:ptr<storage, array<array<array<i32, 9>, 9>, 9>, read> = access %S, 42i
     %v:i32 = call %b, %18
     ret
@@ -5773,12 +5773,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<array<array<array<i32, 9>, 9>, 9>, 50>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%pre:i32, %i_indices:array<u32, 4>, %post:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%pre:i32, %i_indices:array<u32, 4>, %post:i32):i32 {
+  $B2: {
     %6:u32 = access %i_indices, 0u
     %7:u32 = access %i_indices, 1u
     %8:u32 = access %i_indices, 2u
@@ -5788,8 +5788,8 @@
     ret %11
   }
 }
-%b = func(%p_indices:array<u32, 1>):i32 -> %b3 {
-  %b3 = block {
+%b = func(%p_indices:array<u32, 1>):i32 {
+  $B3: {
     %14:u32 = access %p_indices, 0u
     %15:u32 = convert 0i
     %16:u32 = convert 1i
@@ -5814,8 +5814,8 @@
     ret %34
   }
 }
-%c = func():void -> %b4 {
-  %b4 = block {
+%c = func():void {
+  $B4: {
     %36:u32 = convert 42i
     %37:array<u32, 1> = construct %36
     %v:i32 = call %b, %37
@@ -5872,18 +5872,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<array<array<i32, 9>, 9>, 50>, read> = var @binding_point(0, 0)
   %U:ptr<uniform, array<array<array<vec4<i32>, 9>, 9>, 50>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%i:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%i:i32):i32 {
+  $B2: {
     ret %i
   }
 }
-%b = func(%s:ptr<storage, array<array<i32, 9>, 9>, read>, %u:ptr<uniform, array<array<vec4<i32>, 9>, 9>, read>):i32 -> %b3 {
-  %b3 = block {
+%b = func(%s:ptr<storage, array<array<i32, 9>, 9>, read>, %u:ptr<uniform, array<array<vec4<i32>, 9>, 9>, read>):i32 {
+  $B3: {
     %8:ptr<uniform, vec4<i32>, read> = access %u, 0i, 1i
     %9:i32 = load_vector_element %8, 0u
     %10:i32 = call %a, %9
@@ -5896,8 +5896,8 @@
     ret %16
   }
 }
-%c = func():void -> %b4 {
-  %b4 = block {
+%c = func():void {
+  $B4: {
     %18:ptr<storage, array<array<i32, 9>, 9>, read> = access %S, 42i
     %19:ptr<uniform, array<array<vec4<i32>, 9>, 9>, read> = access %U, 24i
     %v:i32 = call %b, %18, %19
@@ -5909,18 +5909,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %S:ptr<storage, array<array<array<i32, 9>, 9>, 50>, read> = var @binding_point(0, 0)
   %U:ptr<uniform, array<array<array<vec4<i32>, 9>, 9>, 50>, read> = var @binding_point(0, 0)
 }
 
-%a = func(%i:i32):i32 -> %b2 {
-  %b2 = block {
+%a = func(%i:i32):i32 {
+  $B2: {
     ret %i
   }
 }
-%b = func(%s_indices:array<u32, 1>, %u_indices:array<u32, 1>):i32 -> %b3 {
-  %b3 = block {
+%b = func(%s_indices:array<u32, 1>, %u_indices:array<u32, 1>):i32 {
+  $B3: {
     %8:u32 = access %s_indices, 0u
     %9:ptr<storage, array<array<i32, 9>, 9>, read> = access %S, %8
     %10:u32 = access %u_indices, 0u
@@ -5937,8 +5937,8 @@
     ret %20
   }
 }
-%c = func():void -> %b4 {
-  %b4 = block {
+%c = func():void {
+  $B4: {
     %22:u32 = convert 42i
     %23:array<u32, 1> = construct %22
     %24:u32 = convert 24i
diff --git a/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc b/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc
index 8f4ea34..dadb543 100644
--- a/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc
+++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc
@@ -45,8 +45,8 @@
     func->Block()->Append(b.Return(func));
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     ret
   }
 }
@@ -68,12 +68,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     ret
   }
 }
@@ -100,14 +100,14 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     ret
   }
 }
@@ -133,12 +133,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:texture_external = load %texture
     ret
   }
@@ -166,14 +166,14 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %5:texture_2d<f32> = load %texture_plane0
     %6:texture_2d<f32> = load %texture_plane1
     %7:tint_ExternalTextureParams = load %texture_params
@@ -204,12 +204,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func():vec2<u32> -> %b2 {
-  %b2 = block {
+%foo = func():vec2<u32> {
+  $B2: {
     %3:texture_external = load %texture
     %result:vec2<u32> = textureDimensions %3
     ret %result
@@ -238,14 +238,14 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func():vec2<u32> -> %b2 {
-  %b2 = block {
+%foo = func():vec2<u32> {
+  $B2: {
     %5:texture_2d<f32> = load %texture_plane0
     %6:texture_2d<f32> = load %texture_plane1
     %7:tint_ExternalTextureParams = load %texture_params
@@ -279,12 +279,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%coords:vec2<u32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):vec4<f32> {
+  $B2: {
     %4:texture_external = load %texture
     %result:vec4<f32> = textureLoad %4, %coords
     ret %result
@@ -313,14 +313,14 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func(%coords:vec2<u32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):vec4<f32> {
+  $B2: {
     %6:texture_2d<f32> = load %texture_plane0
     %7:texture_2d<f32> = load %texture_plane1
     %8:tint_ExternalTextureParams = load %texture_params
@@ -328,20 +328,20 @@
     ret %9
   }
 }
-%tint_TextureLoadExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %coords_1:vec2<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%tint_TextureLoadExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %coords_1:vec2<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %15:u32 = access %params, 1u
     %16:mat3x4<f32> = access %params, 2u
     %17:u32 = access %params, 0u
     %18:bool = eq %17, 1u
-    %19:vec3<f32>, %20:f32 = if %18 [t: %b4, f: %b5] {  # if_1
-      %b4 = block {  # true
+    %19:vec3<f32>, %20:f32 = if %18 [t: $B4, f: $B5] {  # if_1
+      $B4: {  # true
         %21:vec4<f32> = textureLoad %plane_0, %coords_1, 0u
         %22:vec3<f32> = swizzle %21, xyz
         %23:f32 = access %21, 3u
         exit_if %22, %23  # if_1
       }
-      %b5 = block {  # false
+      $B5: {  # false
         %24:vec4<f32> = textureLoad %plane_0, %coords_1, 0u
         %25:f32 = access %24, 0u
         %26:vec2<u32> = shr %coords_1, vec2<u32>(1u)
@@ -353,8 +353,8 @@
       }
     }
     %31:bool = eq %15, 0u
-    %32:vec3<f32> = if %31 [t: %b6, f: %b7] {  # if_2
-      %b6 = block {  # true
+    %32:vec3<f32> = if %31 [t: $B6, f: $B7] {  # if_2
+      $B6: {  # true
         %33:tint_GammaTransferParams = access %params, 3u
         %34:tint_GammaTransferParams = access %params, 4u
         %35:mat3x3<f32> = access %params, 5u
@@ -363,7 +363,7 @@
         %39:vec3<f32> = call %tint_GammaCorrection, %38, %34
         exit_if %39  # if_2
       }
-      %b7 = block {  # false
+      $B7: {  # false
         exit_if %19  # if_2
       }
     }
@@ -371,8 +371,8 @@
     ret %40
   }
 }
-%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> -> %b8 {  # %params_1: 'params'
-  %b8 = block {
+%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> {  # %params_1: 'params'
+  $B8: {
     %43:f32 = access %params_1, 0u
     %44:f32 = access %params_1, 1u
     %45:f32 = access %params_1, 2u
@@ -423,12 +423,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%coords:vec2<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<i32>):vec4<f32> {
+  $B2: {
     %4:texture_external = load %texture
     %result:vec4<f32> = textureLoad %4, %coords
     ret %result
@@ -457,14 +457,14 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func(%coords:vec2<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<i32>):vec4<f32> {
+  $B2: {
     %6:texture_2d<f32> = load %texture_plane0
     %7:texture_2d<f32> = load %texture_plane1
     %8:tint_ExternalTextureParams = load %texture_params
@@ -473,20 +473,20 @@
     ret %10
   }
 }
-%tint_TextureLoadExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %coords_1:vec2<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%tint_TextureLoadExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %coords_1:vec2<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %16:u32 = access %params, 1u
     %17:mat3x4<f32> = access %params, 2u
     %18:u32 = access %params, 0u
     %19:bool = eq %18, 1u
-    %20:vec3<f32>, %21:f32 = if %19 [t: %b4, f: %b5] {  # if_1
-      %b4 = block {  # true
+    %20:vec3<f32>, %21:f32 = if %19 [t: $B4, f: $B5] {  # if_1
+      $B4: {  # true
         %22:vec4<f32> = textureLoad %plane_0, %coords_1, 0u
         %23:vec3<f32> = swizzle %22, xyz
         %24:f32 = access %22, 3u
         exit_if %23, %24  # if_1
       }
-      %b5 = block {  # false
+      $B5: {  # false
         %25:vec4<f32> = textureLoad %plane_0, %coords_1, 0u
         %26:f32 = access %25, 0u
         %27:vec2<u32> = shr %coords_1, vec2<u32>(1u)
@@ -498,8 +498,8 @@
       }
     }
     %32:bool = eq %16, 0u
-    %33:vec3<f32> = if %32 [t: %b6, f: %b7] {  # if_2
-      %b6 = block {  # true
+    %33:vec3<f32> = if %32 [t: $B6, f: $B7] {  # if_2
+      $B6: {  # true
         %34:tint_GammaTransferParams = access %params, 3u
         %35:tint_GammaTransferParams = access %params, 4u
         %36:mat3x3<f32> = access %params, 5u
@@ -508,7 +508,7 @@
         %40:vec3<f32> = call %tint_GammaCorrection, %39, %35
         exit_if %40  # if_2
       }
-      %b7 = block {  # false
+      $B7: {  # false
         exit_if %20  # if_2
       }
     }
@@ -516,8 +516,8 @@
     ret %41
   }
 }
-%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> -> %b8 {  # %params_1: 'params'
-  %b8 = block {
+%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> {  # %params_1: 'params'
+  $B8: {
     %44:f32 = access %params_1, 0u
     %45:f32 = access %params_1, 1u
     %46:f32 = access %params_1, 2u
@@ -570,12 +570,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%sampler:sampler, %coords:vec2<f32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%sampler:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B2: {
     %5:texture_external = load %texture
     %result:vec4<f32> = textureSampleBaseClampToEdge %5, %sampler, %coords
     ret %result
@@ -604,14 +604,14 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func(%sampler:sampler, %coords:vec2<f32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%foo = func(%sampler:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B2: {
     %7:texture_2d<f32> = load %texture_plane0
     %8:texture_2d<f32> = load %texture_plane1
     %9:tint_ExternalTextureParams = load %texture_params
@@ -619,8 +619,8 @@
     ret %10
   }
 }
-%tint_TextureSampleExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> -> %b3 {  # %sampler_1: 'sampler', %coords_1: 'coords'
-  %b3 = block {
+%tint_TextureSampleExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> {  # %sampler_1: 'sampler', %coords_1: 'coords'
+  $B3: {
     %17:u32 = access %params, 1u
     %18:mat3x4<f32> = access %params, 2u
     %19:mat3x2<f32> = access %params, 6u
@@ -638,14 +638,14 @@
     %31:vec2<f32> = clamp %21, %29, %30
     %32:u32 = access %params, 0u
     %33:bool = eq %32, 1u
-    %34:vec3<f32>, %35:f32 = if %33 [t: %b4, f: %b5] {  # if_1
-      %b4 = block {  # true
+    %34:vec3<f32>, %35:f32 = if %33 [t: $B4, f: $B5] {  # if_1
+      $B4: {  # true
         %36:vec4<f32> = textureSampleLevel %plane_0, %sampler_1, %26, 0.0f
         %37:vec3<f32> = swizzle %36, xyz
         %38:f32 = access %36, 3u
         exit_if %37, %38  # if_1
       }
-      %b5 = block {  # false
+      $B5: {  # false
         %39:vec4<f32> = textureSampleLevel %plane_0, %sampler_1, %26, 0.0f
         %40:f32 = access %39, 0u
         %41:vec4<f32> = textureSampleLevel %plane_1, %sampler_1, %31, 0.0f
@@ -656,8 +656,8 @@
       }
     }
     %45:bool = eq %17, 0u
-    %46:vec3<f32> = if %45 [t: %b6, f: %b7] {  # if_2
-      %b6 = block {  # true
+    %46:vec3<f32> = if %45 [t: $B6, f: $B7] {  # if_2
+      $B6: {  # true
         %47:tint_GammaTransferParams = access %params, 3u
         %48:tint_GammaTransferParams = access %params, 4u
         %49:mat3x3<f32> = access %params, 5u
@@ -666,7 +666,7 @@
         %53:vec3<f32> = call %tint_GammaCorrection, %52, %48
         exit_if %53  # if_2
       }
-      %b7 = block {  # false
+      $B7: {  # false
         exit_if %34  # if_2
       }
     }
@@ -674,8 +674,8 @@
     ret %54
   }
 }
-%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> -> %b8 {  # %params_1: 'params'
-  %b8 = block {
+%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> {  # %params_1: 'params'
+  $B8: {
     %57:f32 = access %params_1, 0u
     %58:f32 = access %params_1, 1u
     %59:f32 = access %params_1, 2u
@@ -743,18 +743,18 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%texture_1:texture_external, %sampler:sampler, %coords:vec2<f32>):vec4<f32> -> %b2 {  # %texture_1: 'texture'
-  %b2 = block {
+%foo = func(%texture_1:texture_external, %sampler:sampler, %coords:vec2<f32>):vec4<f32> {  # %texture_1: 'texture'
+  $B2: {
     %result:vec4<f32> = textureSampleBaseClampToEdge %texture_1, %sampler, %coords
     ret %result
   }
 }
-%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> -> %b3 {  # %sampler_1: 'sampler', %coords_1: 'coords'
-  %b3 = block {
+%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> {  # %sampler_1: 'sampler', %coords_1: 'coords'
+  $B3: {
     %10:texture_external = load %texture
     %result_1:vec4<f32> = call %foo, %10, %sampler_1, %coords_1  # %result_1: 'result'
     ret %result_1
@@ -783,20 +783,20 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func(%texture_plane0_1:texture_2d<f32>, %texture_plane1_1:texture_2d<f32>, %texture_params_1:tint_ExternalTextureParams, %sampler:sampler, %coords:vec2<f32>):vec4<f32> -> %b2 {  # %texture_plane0_1: 'texture_plane0', %texture_plane1_1: 'texture_plane1', %texture_params_1: 'texture_params'
-  %b2 = block {
+%foo = func(%texture_plane0_1:texture_2d<f32>, %texture_plane1_1:texture_2d<f32>, %texture_params_1:tint_ExternalTextureParams, %sampler:sampler, %coords:vec2<f32>):vec4<f32> {  # %texture_plane0_1: 'texture_plane0', %texture_plane1_1: 'texture_plane1', %texture_params_1: 'texture_params'
+  $B2: {
     %10:vec4<f32> = call %tint_TextureSampleExternal, %texture_plane0_1, %texture_plane1_1, %texture_params_1, %sampler, %coords
     ret %10
   }
 }
-%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> -> %b3 {  # %sampler_1: 'sampler', %coords_1: 'coords'
-  %b3 = block {
+%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> {  # %sampler_1: 'sampler', %coords_1: 'coords'
+  $B3: {
     %15:texture_2d<f32> = load %texture_plane0
     %16:texture_2d<f32> = load %texture_plane1
     %17:tint_ExternalTextureParams = load %texture_params
@@ -804,8 +804,8 @@
     ret %result
   }
 }
-%tint_TextureSampleExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %sampler_2:sampler, %coords_2:vec2<f32>):vec4<f32> -> %b4 {  # %sampler_2: 'sampler', %coords_2: 'coords'
-  %b4 = block {
+%tint_TextureSampleExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %sampler_2:sampler, %coords_2:vec2<f32>):vec4<f32> {  # %sampler_2: 'sampler', %coords_2: 'coords'
+  $B4: {
     %24:u32 = access %params, 1u
     %25:mat3x4<f32> = access %params, 2u
     %26:mat3x2<f32> = access %params, 6u
@@ -823,14 +823,14 @@
     %38:vec2<f32> = clamp %28, %36, %37
     %39:u32 = access %params, 0u
     %40:bool = eq %39, 1u
-    %41:vec3<f32>, %42:f32 = if %40 [t: %b5, f: %b6] {  # if_1
-      %b5 = block {  # true
+    %41:vec3<f32>, %42:f32 = if %40 [t: $B5, f: $B6] {  # if_1
+      $B5: {  # true
         %43:vec4<f32> = textureSampleLevel %plane_0, %sampler_2, %33, 0.0f
         %44:vec3<f32> = swizzle %43, xyz
         %45:f32 = access %43, 3u
         exit_if %44, %45  # if_1
       }
-      %b6 = block {  # false
+      $B6: {  # false
         %46:vec4<f32> = textureSampleLevel %plane_0, %sampler_2, %33, 0.0f
         %47:f32 = access %46, 0u
         %48:vec4<f32> = textureSampleLevel %plane_1, %sampler_2, %38, 0.0f
@@ -841,8 +841,8 @@
       }
     }
     %52:bool = eq %24, 0u
-    %53:vec3<f32> = if %52 [t: %b7, f: %b8] {  # if_2
-      %b7 = block {  # true
+    %53:vec3<f32> = if %52 [t: $B7, f: $B8] {  # if_2
+      $B7: {  # true
         %54:tint_GammaTransferParams = access %params, 3u
         %55:tint_GammaTransferParams = access %params, 4u
         %56:mat3x3<f32> = access %params, 5u
@@ -851,7 +851,7 @@
         %60:vec3<f32> = call %tint_GammaCorrection, %59, %55
         exit_if %60  # if_2
       }
-      %b8 = block {  # false
+      $B8: {  # false
         exit_if %41  # if_2
       }
     }
@@ -859,8 +859,8 @@
     ret %61
   }
 }
-%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> -> %b9 {  # %params_1: 'params'
-  %b9 = block {
+%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> {  # %params_1: 'params'
+  $B9: {
     %64:f32 = access %params_1, 0u
     %65:f32 = access %params_1, 1u
     %66:f32 = access %params_1, 2u
@@ -938,18 +938,18 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(1, 2)
 }
 
-%foo = func(%texture_1:texture_external, %sampler:sampler, %coords:vec2<f32>):vec4<f32> -> %b2 {  # %texture_1: 'texture'
-  %b2 = block {
+%foo = func(%texture_1:texture_external, %sampler:sampler, %coords:vec2<f32>):vec4<f32> {  # %texture_1: 'texture'
+  $B2: {
     %result:vec4<f32> = textureSampleBaseClampToEdge %texture_1, %sampler, %coords
     ret %result
   }
 }
-%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> -> %b3 {  # %sampler_1: 'sampler', %coords_1: 'coords'
-  %b3 = block {
+%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> {  # %sampler_1: 'sampler', %coords_1: 'coords'
+  $B3: {
     %10:texture_external = load %texture
     %11:vec2<u32> = textureDimensions %10
     %12:texture_external = load %texture
@@ -986,20 +986,20 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
 }
 
-%foo = func(%texture_plane0_1:texture_2d<f32>, %texture_plane1_1:texture_2d<f32>, %texture_params_1:tint_ExternalTextureParams, %sampler:sampler, %coords:vec2<f32>):vec4<f32> -> %b2 {  # %texture_plane0_1: 'texture_plane0', %texture_plane1_1: 'texture_plane1', %texture_params_1: 'texture_params'
-  %b2 = block {
+%foo = func(%texture_plane0_1:texture_2d<f32>, %texture_plane1_1:texture_2d<f32>, %texture_params_1:tint_ExternalTextureParams, %sampler:sampler, %coords:vec2<f32>):vec4<f32> {  # %texture_plane0_1: 'texture_plane0', %texture_plane1_1: 'texture_plane1', %texture_params_1: 'texture_params'
+  $B2: {
     %10:vec4<f32> = call %tint_TextureSampleExternal, %texture_plane0_1, %texture_plane1_1, %texture_params_1, %sampler, %coords
     ret %10
   }
 }
-%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> -> %b3 {  # %sampler_1: 'sampler', %coords_1: 'coords'
-  %b3 = block {
+%bar = func(%sampler_1:sampler, %coords_1:vec2<f32>):vec4<f32> {  # %sampler_1: 'sampler', %coords_1: 'coords'
+  $B3: {
     %15:texture_2d<f32> = load %texture_plane0
     %16:texture_2d<f32> = load %texture_plane1
     %17:tint_ExternalTextureParams = load %texture_params
@@ -1021,8 +1021,8 @@
     ret %32
   }
 }
-%tint_TextureSampleExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %sampler_2:sampler, %coords_2:vec2<f32>):vec4<f32> -> %b4 {  # %sampler_2: 'sampler', %coords_2: 'coords'
-  %b4 = block {
+%tint_TextureSampleExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %sampler_2:sampler, %coords_2:vec2<f32>):vec4<f32> {  # %sampler_2: 'sampler', %coords_2: 'coords'
+  $B4: {
     %38:u32 = access %params, 1u
     %39:mat3x4<f32> = access %params, 2u
     %40:mat3x2<f32> = access %params, 6u
@@ -1040,14 +1040,14 @@
     %52:vec2<f32> = clamp %42, %50, %51
     %53:u32 = access %params, 0u
     %54:bool = eq %53, 1u
-    %55:vec3<f32>, %56:f32 = if %54 [t: %b5, f: %b6] {  # if_1
-      %b5 = block {  # true
+    %55:vec3<f32>, %56:f32 = if %54 [t: $B5, f: $B6] {  # if_1
+      $B5: {  # true
         %57:vec4<f32> = textureSampleLevel %plane_0, %sampler_2, %47, 0.0f
         %58:vec3<f32> = swizzle %57, xyz
         %59:f32 = access %57, 3u
         exit_if %58, %59  # if_1
       }
-      %b6 = block {  # false
+      $B6: {  # false
         %60:vec4<f32> = textureSampleLevel %plane_0, %sampler_2, %47, 0.0f
         %61:f32 = access %60, 0u
         %62:vec4<f32> = textureSampleLevel %plane_1, %sampler_2, %52, 0.0f
@@ -1058,8 +1058,8 @@
       }
     }
     %66:bool = eq %38, 0u
-    %67:vec3<f32> = if %66 [t: %b7, f: %b8] {  # if_2
-      %b7 = block {  # true
+    %67:vec3<f32> = if %66 [t: $B7, f: $B8] {  # if_2
+      $B7: {  # true
         %68:tint_GammaTransferParams = access %params, 3u
         %69:tint_GammaTransferParams = access %params, 4u
         %70:mat3x3<f32> = access %params, 5u
@@ -1068,7 +1068,7 @@
         %74:vec3<f32> = call %tint_GammaCorrection, %73, %69
         exit_if %74  # if_2
       }
-      %b8 = block {  # false
+      $B8: {  # false
         exit_if %55  # if_2
       }
     }
@@ -1076,8 +1076,8 @@
     ret %75
   }
 }
-%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> -> %b9 {  # %params_1: 'params'
-  %b9 = block {
+%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> {  # %params_1: 'params'
+  $B9: {
     %78:f32 = access %params_1, 0u
     %79:f32 = access %params_1, 1u
     %80:f32 = access %params_1, 2u
@@ -1139,14 +1139,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture_a:ptr<handle, texture_external, read> = var @binding_point(1, 2)
   %texture_b:ptr<handle, texture_external, read> = var @binding_point(2, 2)
   %texture_c:ptr<handle, texture_external, read> = var @binding_point(3, 2)
 }
 
-%foo = func(%coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):void {
+  $B2: {
     %6:texture_external = load %texture_a
     %7:vec4<f32> = textureLoad %6, %coords
     %8:texture_external = load %texture_b
@@ -1179,7 +1179,7 @@
   coordTransformationMatrix:mat3x2<f32> @offset(176)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %texture_a_plane0:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 2)
   %texture_a_plane1:ptr<handle, texture_2d<f32>, read> = var @binding_point(1, 3)
   %texture_a_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(1, 4)
@@ -1191,8 +1191,8 @@
   %texture_c_params:ptr<uniform, tint_ExternalTextureParams, read> = var @binding_point(3, 4)
 }
 
-%foo = func(%coords:vec2<u32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%coords:vec2<u32>):void {
+  $B2: {
     %12:texture_2d<f32> = load %texture_a_plane0
     %13:texture_2d<f32> = load %texture_a_plane1
     %14:tint_ExternalTextureParams = load %texture_a_params
@@ -1208,20 +1208,20 @@
     ret
   }
 }
-%tint_TextureLoadExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %coords_1:vec2<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%tint_TextureLoadExternal = func(%plane_0:texture_2d<f32>, %plane_1:texture_2d<f32>, %params:tint_ExternalTextureParams, %coords_1:vec2<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %29:u32 = access %params, 1u
     %30:mat3x4<f32> = access %params, 2u
     %31:u32 = access %params, 0u
     %32:bool = eq %31, 1u
-    %33:vec3<f32>, %34:f32 = if %32 [t: %b4, f: %b5] {  # if_1
-      %b4 = block {  # true
+    %33:vec3<f32>, %34:f32 = if %32 [t: $B4, f: $B5] {  # if_1
+      $B4: {  # true
         %35:vec4<f32> = textureLoad %plane_0, %coords_1, 0u
         %36:vec3<f32> = swizzle %35, xyz
         %37:f32 = access %35, 3u
         exit_if %36, %37  # if_1
       }
-      %b5 = block {  # false
+      $B5: {  # false
         %38:vec4<f32> = textureLoad %plane_0, %coords_1, 0u
         %39:f32 = access %38, 0u
         %40:vec2<u32> = shr %coords_1, vec2<u32>(1u)
@@ -1233,8 +1233,8 @@
       }
     }
     %45:bool = eq %29, 0u
-    %46:vec3<f32> = if %45 [t: %b6, f: %b7] {  # if_2
-      %b6 = block {  # true
+    %46:vec3<f32> = if %45 [t: $B6, f: $B7] {  # if_2
+      $B6: {  # true
         %47:tint_GammaTransferParams = access %params, 3u
         %48:tint_GammaTransferParams = access %params, 4u
         %49:mat3x3<f32> = access %params, 5u
@@ -1243,7 +1243,7 @@
         %53:vec3<f32> = call %tint_GammaCorrection, %52, %48
         exit_if %53  # if_2
       }
-      %b7 = block {  # false
+      $B7: {  # false
         exit_if %33  # if_2
       }
     }
@@ -1251,8 +1251,8 @@
     ret %54
   }
 }
-%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> -> %b8 {  # %params_1: 'params'
-  %b8 = block {
+%tint_GammaCorrection = func(%v:vec3<f32>, %params_1:tint_GammaTransferParams):vec3<f32> {  # %params_1: 'params'
+  $B8: {
     %57:f32 = access %params_1, 0u
     %58:f32 = access %params_1, 1u
     %59:f32 = access %params_1, 2u
diff --git a/src/tint/lang/core/ir/transform/preserve_padding_test.cc b/src/tint/lang/core/ir/transform/preserve_padding_test.cc
index 82a4ade..83f5942 100644
--- a/src/tint/lang/core/ir/transform/preserve_padding_test.cc
+++ b/src/tint/lang/core/ir/transform/preserve_padding_test.cc
@@ -92,12 +92,12 @@
   b:u32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<workgroup, MyStruct, read_write> = var
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -131,12 +131,12 @@
   b:u32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<private, MyStruct, read_write> = var
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -169,8 +169,8 @@
   b:u32 @offset(16)
 }
 
-%foo = func(%value:MyStruct):void -> %b1 {
-  %b1 = block {
+%foo = func(%value:MyStruct):void {
+  $B1: {
     %buffer:ptr<function, MyStruct, read_write> = var
     store %buffer, %value
     ret
@@ -207,12 +207,12 @@
   c:vec4<u32> @offset(32)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -242,12 +242,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, mat4x4<f32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:mat4x4<f32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:mat4x4<f32>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -277,12 +277,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<vec4<f32>>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<vec4<f32>>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<vec4<f32>>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -311,12 +311,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, vec3<f32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:vec3<f32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:vec3<f32>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -350,12 +350,12 @@
   b:u32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():MyStruct -> %b2 {
-  %b2 = block {
+%foo = func():MyStruct {
+  $B2: {
     %3:MyStruct = load %buffer
     ret %3
   }
@@ -391,12 +391,12 @@
   b:u32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -410,18 +410,18 @@
   b:u32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, MyStruct, read_write>, %value_param:MyStruct):void -> %b3 {
-  %b3 = block {
+%tint_store_and_preserve_padding = func(%target:ptr<storage, MyStruct, read_write>, %value_param:MyStruct):void {
+  $B3: {
     %8:ptr<storage, vec4<u32>, read_write> = access %target, 0u
     %9:vec4<u32> = access %value_param, 0u
     store %8, %9
@@ -460,12 +460,12 @@
   c:vec4<u32> @offset(32)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -480,18 +480,18 @@
   c:vec4<u32> @offset(32)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, MyStruct, read_write>, %value_param:MyStruct):void -> %b3 {
-  %b3 = block {
+%tint_store_and_preserve_padding = func(%target:ptr<storage, MyStruct, read_write>, %value_param:MyStruct):void {
+  $B3: {
     %8:ptr<storage, vec4<u32>, read_write> = access %target, 0u
     %9:vec4<u32> = access %value_param, 0u
     store %8, %9
@@ -540,12 +540,12 @@
   inner:MyStruct @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, Outer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:Outer):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:Outer):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -564,26 +564,26 @@
   inner:MyStruct @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, Outer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:Outer):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:Outer):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, Outer, read_write>, %value_param:Outer):void -> %b3 {
-  %b3 = block {
+%tint_store_and_preserve_padding = func(%target:ptr<storage, Outer, read_write>, %value_param:Outer):void {
+  $B3: {
     %8:ptr<storage, MyStruct, read_write> = access %target, 0u
     %9:MyStruct = access %value_param, 0u
     %10:void = call %tint_store_and_preserve_padding_1, %8, %9
     ret
   }
 }
-%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, MyStruct, read_write>, %value_param_1:MyStruct):void -> %b4 {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
-  %b4 = block {
+%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, MyStruct, read_write>, %value_param_1:MyStruct):void {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
+  $B4: {
     %14:ptr<storage, vec4<u32>, read_write> = access %target_1, 0u
     %15:vec4<u32> = access %value_param_1, 0u
     store %14, %15
@@ -625,12 +625,12 @@
   b:u32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<MyStruct, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<MyStruct, 4>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<MyStruct, 4>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -644,44 +644,44 @@
   b:u32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<MyStruct, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<MyStruct, 4>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<MyStruct, 4>):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, array<MyStruct, 4>, read_write>, %value_param:array<MyStruct, 4>):void -> %b3 {
-  %b3 = block {
-    loop [i: %b4, b: %b5, c: %b6] {  # loop_1
-      %b4 = block {  # initializer
-        next_iteration %b5 0u
+%tint_store_and_preserve_padding = func(%target:ptr<storage, array<MyStruct, 4>, read_write>, %value_param:array<MyStruct, 4>):void {
+  $B3: {
+    loop [i: $B4, b: $B5, c: $B6] {  # loop_1
+      $B4: {  # initializer
+        next_iteration 0u  # -> $B5
       }
-      %b5 = block (%idx:u32) {  # body
+      $B5 (%idx:u32): {  # body
         %9:bool = gte %idx:u32, 4u
-        if %9 [t: %b7] {  # if_1
-          %b7 = block {  # true
+        if %9 [t: $B7] {  # if_1
+          $B7: {  # true
             exit_loop  # loop_1
           }
         }
         %10:ptr<storage, MyStruct, read_write> = access %target, %idx:u32
         %11:MyStruct = access %value_param, %idx:u32
         %12:void = call %tint_store_and_preserve_padding_1, %10, %11
-        continue %b6
+        continue  # -> $B6
       }
-      %b6 = block {  # continuing
+      $B6: {  # continuing
         %14:u32 = add %idx:u32, 1u
-        next_iteration %b5 %14
+        next_iteration %14  # -> $B5
       }
     }
     ret
   }
 }
-%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, MyStruct, read_write>, %value_param_1:MyStruct):void -> %b8 {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
-  %b8 = block {
+%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, MyStruct, read_write>, %value_param_1:MyStruct):void {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
+  $B8: {
     %17:ptr<storage, vec4<u32>, read_write> = access %target_1, 0u
     %18:vec4<u32> = access %value_param_1, 0u
     store %17, %18
@@ -714,12 +714,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, mat3x3<f32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:mat3x3<f32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:mat3x3<f32>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -728,18 +728,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, mat3x3<f32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:mat3x3<f32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:mat3x3<f32>):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, mat3x3<f32>, read_write>, %value_param:mat3x3<f32>):void -> %b3 {
-  %b3 = block {
+%tint_store_and_preserve_padding = func(%target:ptr<storage, mat3x3<f32>, read_write>, %value_param:mat3x3<f32>):void {
+  $B3: {
     %8:ptr<storage, vec3<f32>, read_write> = access %target, 0u
     %9:vec3<f32> = access %value_param, 0u
     store %8, %9
@@ -784,12 +784,12 @@
   b:mat3x3<f32> @offset(48)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -803,18 +803,18 @@
   b:mat3x3<f32> @offset(48)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:MyStruct):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:MyStruct):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, MyStruct, read_write>, %value_param:MyStruct):void -> %b3 {
-  %b3 = block {
+%tint_store_and_preserve_padding = func(%target:ptr<storage, MyStruct, read_write>, %value_param:MyStruct):void {
+  $B3: {
     %8:ptr<storage, mat3x3<f32>, read_write> = access %target, 0u
     %9:mat3x3<f32> = access %value_param, 0u
     %10:void = call %tint_store_and_preserve_padding_1, %8, %9
@@ -824,8 +824,8 @@
     ret
   }
 }
-%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, mat3x3<f32>, read_write>, %value_param_1:mat3x3<f32>):void -> %b4 {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
-  %b4 = block {
+%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, mat3x3<f32>, read_write>, %value_param_1:mat3x3<f32>):void {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
+  $B4: {
     %17:ptr<storage, vec3<f32>, read_write> = access %target_1, 0u
     %18:vec3<f32> = access %value_param_1, 0u
     store %17, %18
@@ -862,12 +862,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<mat3x3<f32>, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<mat3x3<f32>, 4>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<mat3x3<f32>, 4>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -876,44 +876,44 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<mat3x3<f32>, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<mat3x3<f32>, 4>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<mat3x3<f32>, 4>):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, array<mat3x3<f32>, 4>, read_write>, %value_param:array<mat3x3<f32>, 4>):void -> %b3 {
-  %b3 = block {
-    loop [i: %b4, b: %b5, c: %b6] {  # loop_1
-      %b4 = block {  # initializer
-        next_iteration %b5 0u
+%tint_store_and_preserve_padding = func(%target:ptr<storage, array<mat3x3<f32>, 4>, read_write>, %value_param:array<mat3x3<f32>, 4>):void {
+  $B3: {
+    loop [i: $B4, b: $B5, c: $B6] {  # loop_1
+      $B4: {  # initializer
+        next_iteration 0u  # -> $B5
       }
-      %b5 = block (%idx:u32) {  # body
+      $B5 (%idx:u32): {  # body
         %9:bool = gte %idx:u32, 4u
-        if %9 [t: %b7] {  # if_1
-          %b7 = block {  # true
+        if %9 [t: $B7] {  # if_1
+          $B7: {  # true
             exit_loop  # loop_1
           }
         }
         %10:ptr<storage, mat3x3<f32>, read_write> = access %target, %idx:u32
         %11:mat3x3<f32> = access %value_param, %idx:u32
         %12:void = call %tint_store_and_preserve_padding_1, %10, %11
-        continue %b6
+        continue  # -> $B6
       }
-      %b6 = block {  # continuing
+      $B6: {  # continuing
         %14:u32 = add %idx:u32, 1u
-        next_iteration %b5 %14
+        next_iteration %14  # -> $B5
       }
     }
     ret
   }
 }
-%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, mat3x3<f32>, read_write>, %value_param_1:mat3x3<f32>):void -> %b8 {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
-  %b8 = block {
+%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, mat3x3<f32>, read_write>, %value_param_1:mat3x3<f32>):void {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
+  $B8: {
     %17:ptr<storage, vec3<f32>, read_write> = access %target_1, 0u
     %18:vec3<f32> = access %value_param_1, 0u
     store %17, %18
@@ -949,12 +949,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<vec3<f32>, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<vec3<f32>, 4>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<vec3<f32>, 4>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -963,37 +963,37 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<vec3<f32>, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<vec3<f32>, 4>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<vec3<f32>, 4>):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, array<vec3<f32>, 4>, read_write>, %value_param:array<vec3<f32>, 4>):void -> %b3 {
-  %b3 = block {
-    loop [i: %b4, b: %b5, c: %b6] {  # loop_1
-      %b4 = block {  # initializer
-        next_iteration %b5 0u
+%tint_store_and_preserve_padding = func(%target:ptr<storage, array<vec3<f32>, 4>, read_write>, %value_param:array<vec3<f32>, 4>):void {
+  $B3: {
+    loop [i: $B4, b: $B5, c: $B6] {  # loop_1
+      $B4: {  # initializer
+        next_iteration 0u  # -> $B5
       }
-      %b5 = block (%idx:u32) {  # body
+      $B5 (%idx:u32): {  # body
         %9:bool = gte %idx:u32, 4u
-        if %9 [t: %b7] {  # if_1
-          %b7 = block {  # true
+        if %9 [t: $B7] {  # if_1
+          $B7: {  # true
             exit_loop  # loop_1
           }
         }
         %10:ptr<storage, vec3<f32>, read_write> = access %target, %idx:u32
         %11:vec3<f32> = access %value_param, %idx:u32
         store %10, %11
-        continue %b6
+        continue  # -> $B6
       }
-      %b6 = block {  # continuing
+      $B6: {  # continuing
         %12:u32 = add %idx:u32, 1u
-        next_iteration %b5 %12
+        next_iteration %12  # -> $B5
       }
     }
     ret
@@ -1050,12 +1050,12 @@
   b_1:u32 @offset(736)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<Outer, 3>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<Outer, 3>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<Outer, 3>):void {
+  $B2: {
     store %buffer, %value
     ret
   }
@@ -1078,44 +1078,44 @@
   b_1:u32 @offset(736)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<Outer, 3>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:array<Outer, 3>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:array<Outer, 3>):void {
+  $B2: {
     %4:void = call %tint_store_and_preserve_padding, %buffer, %value
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, array<Outer, 3>, read_write>, %value_param:array<Outer, 3>):void -> %b3 {
-  %b3 = block {
-    loop [i: %b4, b: %b5, c: %b6] {  # loop_1
-      %b4 = block {  # initializer
-        next_iteration %b5 0u
+%tint_store_and_preserve_padding = func(%target:ptr<storage, array<Outer, 3>, read_write>, %value_param:array<Outer, 3>):void {
+  $B3: {
+    loop [i: $B4, b: $B5, c: $B6] {  # loop_1
+      $B4: {  # initializer
+        next_iteration 0u  # -> $B5
       }
-      %b5 = block (%idx:u32) {  # body
+      $B5 (%idx:u32): {  # body
         %9:bool = gte %idx:u32, 3u
-        if %9 [t: %b7] {  # if_1
-          %b7 = block {  # true
+        if %9 [t: $B7] {  # if_1
+          $B7: {  # true
             exit_loop  # loop_1
           }
         }
         %10:ptr<storage, Outer, read_write> = access %target, %idx:u32
         %11:Outer = access %value_param, %idx:u32
         %12:void = call %tint_store_and_preserve_padding_1, %10, %11
-        continue %b6
+        continue  # -> $B6
       }
-      %b6 = block {  # continuing
+      $B6: {  # continuing
         %14:u32 = add %idx:u32, 1u
-        next_iteration %b5 %14
+        next_iteration %14  # -> $B5
       }
     }
     ret
   }
 }
-%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, Outer, read_write>, %value_param_1:Outer):void -> %b8 {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
-  %b8 = block {
+%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, Outer, read_write>, %value_param_1:Outer):void {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
+  $B8: {
     %17:ptr<storage, u32, read_write> = access %target_1, 0u
     %18:u32 = access %value_param_1, 0u
     store %17, %18
@@ -1131,8 +1131,8 @@
     ret
   }
 }
-%tint_store_and_preserve_padding_2 = func(%target_2:ptr<storage, Inner, read_write>, %value_param_2:Inner):void -> %b9 {  # %tint_store_and_preserve_padding_2: 'tint_store_and_preserve_padding', %target_2: 'target', %value_param_2: 'value_param'
-  %b9 = block {
+%tint_store_and_preserve_padding_2 = func(%target_2:ptr<storage, Inner, read_write>, %value_param_2:Inner):void {  # %tint_store_and_preserve_padding_2: 'tint_store_and_preserve_padding', %target_2: 'target', %value_param_2: 'value_param'
+  $B9: {
     %31:ptr<storage, u32, read_write> = access %target_2, 0u
     %32:u32 = access %value_param_2, 0u
     store %31, %32
@@ -1148,34 +1148,34 @@
     ret
   }
 }
-%tint_store_and_preserve_padding_4 = func(%target_3:ptr<storage, array<vec3<f32>, 4>, read_write>, %value_param_3:array<vec3<f32>, 4>):void -> %b10 {  # %tint_store_and_preserve_padding_4: 'tint_store_and_preserve_padding', %target_3: 'target', %value_param_3: 'value_param'
-  %b10 = block {
-    loop [i: %b11, b: %b12, c: %b13] {  # loop_2
-      %b11 = block {  # initializer
-        next_iteration %b12 0u
+%tint_store_and_preserve_padding_4 = func(%target_3:ptr<storage, array<vec3<f32>, 4>, read_write>, %value_param_3:array<vec3<f32>, 4>):void {  # %tint_store_and_preserve_padding_4: 'tint_store_and_preserve_padding', %target_3: 'target', %value_param_3: 'value_param'
+  $B10: {
+    loop [i: $B11, b: $B12, c: $B13] {  # loop_2
+      $B11: {  # initializer
+        next_iteration 0u  # -> $B12
       }
-      %b12 = block (%idx_1:u32) {  # body
+      $B12 (%idx_1:u32): {  # body
         %46:bool = gte %idx_1:u32, 4u
-        if %46 [t: %b14] {  # if_2
-          %b14 = block {  # true
+        if %46 [t: $B14] {  # if_2
+          $B14: {  # true
             exit_loop  # loop_2
           }
         }
         %47:ptr<storage, vec3<f32>, read_write> = access %target_3, %idx_1:u32
         %48:vec3<f32> = access %value_param_3, %idx_1:u32
         store %47, %48
-        continue %b13
+        continue  # -> $B13
       }
-      %b13 = block {  # continuing
+      $B13: {  # continuing
         %49:u32 = add %idx_1:u32, 1u
-        next_iteration %b12 %49
+        next_iteration %49  # -> $B12
       }
     }
     ret
   }
 }
-%tint_store_and_preserve_padding_5 = func(%target_4:ptr<storage, mat3x3<f32>, read_write>, %value_param_4:mat3x3<f32>):void -> %b15 {  # %tint_store_and_preserve_padding_5: 'tint_store_and_preserve_padding', %target_4: 'target', %value_param_4: 'value_param'
-  %b15 = block {
+%tint_store_and_preserve_padding_5 = func(%target_4:ptr<storage, mat3x3<f32>, read_write>, %value_param_4:mat3x3<f32>):void {  # %tint_store_and_preserve_padding_5: 'tint_store_and_preserve_padding', %target_4: 'target', %value_param_4: 'value_param'
+  $B15: {
     %52:ptr<storage, vec3<f32>, read_write> = access %target_4, 0u
     %53:vec3<f32> = access %value_param_4, 0u
     store %52, %53
@@ -1188,27 +1188,27 @@
     ret
   }
 }
-%tint_store_and_preserve_padding_3 = func(%target_5:ptr<storage, array<Inner, 4>, read_write>, %value_param_5:array<Inner, 4>):void -> %b16 {  # %tint_store_and_preserve_padding_3: 'tint_store_and_preserve_padding', %target_5: 'target', %value_param_5: 'value_param'
-  %b16 = block {
-    loop [i: %b17, b: %b18, c: %b19] {  # loop_3
-      %b17 = block {  # initializer
-        next_iteration %b18 0u
+%tint_store_and_preserve_padding_3 = func(%target_5:ptr<storage, array<Inner, 4>, read_write>, %value_param_5:array<Inner, 4>):void {  # %tint_store_and_preserve_padding_3: 'tint_store_and_preserve_padding', %target_5: 'target', %value_param_5: 'value_param'
+  $B16: {
+    loop [i: $B17, b: $B18, c: $B19] {  # loop_3
+      $B17: {  # initializer
+        next_iteration 0u  # -> $B18
       }
-      %b18 = block (%idx_2:u32) {  # body
+      $B18 (%idx_2:u32): {  # body
         %61:bool = gte %idx_2:u32, 4u
-        if %61 [t: %b20] {  # if_3
-          %b20 = block {  # true
+        if %61 [t: $B20] {  # if_3
+          $B20: {  # true
             exit_loop  # loop_3
           }
         }
         %62:ptr<storage, Inner, read_write> = access %target_5, %idx_2:u32
         %63:Inner = access %value_param_5, %idx_2:u32
         %64:void = call %tint_store_and_preserve_padding_2, %62, %63
-        continue %b19
+        continue  # -> $B19
       }
-      %b19 = block {  # continuing
+      $B19: {  # continuing
         %65:u32 = add %idx_2:u32, 1u
-        next_iteration %b18 %65
+        next_iteration %65  # -> $B18
       }
     }
     ret
@@ -1241,12 +1241,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<mat3x3<f32>, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:mat3x3<f32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:mat3x3<f32>):void {
+  $B2: {
     %4:ptr<storage, mat3x3<f32>, read_write> = access %buffer, 0u
     store %4, %value
     %5:ptr<storage, mat3x3<f32>, read_write> = access %buffer, 1u
@@ -1262,12 +1262,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, array<mat3x3<f32>, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%value:mat3x3<f32>):void -> %b2 {
-  %b2 = block {
+%foo = func(%value:mat3x3<f32>):void {
+  $B2: {
     %4:ptr<storage, mat3x3<f32>, read_write> = access %buffer, 0u
     %5:void = call %tint_store_and_preserve_padding, %4, %value
     %7:ptr<storage, mat3x3<f32>, read_write> = access %buffer, 1u
@@ -1279,8 +1279,8 @@
     ret
   }
 }
-%tint_store_and_preserve_padding = func(%target:ptr<storage, mat3x3<f32>, read_write>, %value_param:mat3x3<f32>):void -> %b3 {
-  %b3 = block {
+%tint_store_and_preserve_padding = func(%target:ptr<storage, mat3x3<f32>, read_write>, %value_param:mat3x3<f32>):void {
+  $B3: {
     %15:ptr<storage, vec3<f32>, read_write> = access %target, 0u
     %16:vec3<f32> = access %value_param, 0u
     store %15, %16
diff --git a/src/tint/lang/core/ir/transform/robustness_test.cc b/src/tint/lang/core/ir/transform/robustness_test.cc
index 5865509..1829c79 100644
--- a/src/tint/lang/core/ir/transform/robustness_test.cc
+++ b/src/tint/lang/core/ir/transform/robustness_test.cc
@@ -66,8 +66,8 @@
     });
 
     auto* src = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:u32 = load_vector_element %vec, 5u
     ret %3
@@ -77,8 +77,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:u32 = load_vector_element %vec, 3u
     ret %3
@@ -103,8 +103,8 @@
     });
 
     auto* src = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %idx:u32 = let 5u
     %4:u32 = load_vector_element %vec, %idx
@@ -115,8 +115,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %idx:u32 = let 5u
     %4:u32 = min %idx, 3u
@@ -144,8 +144,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %4:u32 = load_vector_element %vec, %idx
     ret %4
@@ -155,8 +155,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %4:u32 = min %idx, 3u
     %5:u32 = load_vector_element %vec, %4
@@ -183,8 +183,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:i32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %4:u32 = load_vector_element %vec, %idx
     ret %4
@@ -194,8 +194,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:i32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %4:u32 = convert %idx
     %5:u32 = min %4, 3u
@@ -221,8 +221,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     store_vector_element %vec, 5u, 0u
     ret
@@ -232,8 +232,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     store_vector_element %vec, 3u, 0u
     ret
@@ -258,8 +258,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %idx:u32 = let 5u
     store_vector_element %vec, %idx, 0u
@@ -270,8 +270,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %idx:u32 = let 5u
     %4:u32 = min %idx, 3u
@@ -299,8 +299,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:u32):void -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     store_vector_element %vec, %idx, 0u
     ret
@@ -310,8 +310,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:u32):void -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %4:u32 = min %idx, 3u
     store_vector_element %vec, %4, 0u
@@ -338,8 +338,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:i32):void -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     store_vector_element %vec, %idx, 0u
     ret
@@ -349,8 +349,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:i32):void -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %4:u32 = convert %idx
     %5:u32 = min %4, 3u
@@ -377,8 +377,8 @@
     });
 
     auto* src = R"(
-%foo = func():vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func():vec4<f32> {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %mat, 2u
     %4:vec4<f32> = load %3
@@ -408,8 +408,8 @@
     });
 
     auto* src = R"(
-%foo = func():vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func():vec4<f32> {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %idx:u32 = let 2u
     %4:ptr<function, vec4<f32>, read_write> = access %mat, %idx
@@ -421,8 +421,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func():vec4<f32> {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %idx:u32 = let 2u
     %4:u32 = min %idx, 3u
@@ -452,8 +452,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:u32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):vec4<f32> {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %4:ptr<function, vec4<f32>, read_write> = access %mat, %idx
     %5:vec4<f32> = load %4
@@ -464,8 +464,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:u32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):vec4<f32> {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %4:u32 = min %idx, 3u
     %5:ptr<function, vec4<f32>, read_write> = access %mat, %4
@@ -494,8 +494,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):vec4<f32> {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %4:ptr<function, vec4<f32>, read_write> = access %mat, %idx
     %5:vec4<f32> = load %4
@@ -506,8 +506,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):vec4<f32> {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %4:u32 = convert %idx
     %5:u32 = min %4, 3u
@@ -535,8 +535,8 @@
     });
 
     auto* src = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %arr:ptr<function, array<u32, 4>, read_write> = var
     %3:ptr<function, u32, read_write> = access %arr, 2u
     %4:u32 = load %3
@@ -566,8 +566,8 @@
     });
 
     auto* src = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %arr:ptr<function, array<u32, 4>, read_write> = var
     %idx:u32 = let 2u
     %4:ptr<function, u32, read_write> = access %arr, %idx
@@ -579,8 +579,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %arr:ptr<function, array<u32, 4>, read_write> = var
     %idx:u32 = let 2u
     %4:u32 = min %idx, 3u
@@ -610,8 +610,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %arr:ptr<function, array<u32, 4>, read_write> = var
     %4:ptr<function, u32, read_write> = access %arr, %idx
     %5:u32 = load %4
@@ -622,8 +622,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %arr:ptr<function, array<u32, 4>, read_write> = var
     %4:u32 = min %idx, 3u
     %5:ptr<function, u32, read_write> = access %arr, %4
@@ -652,8 +652,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:i32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):u32 {
+  $B1: {
     %arr:ptr<function, array<u32, 4>, read_write> = var
     %4:ptr<function, u32, read_write> = access %arr, %idx
     %5:u32 = load %4
@@ -664,8 +664,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:i32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:i32):u32 {
+  $B1: {
     %arr:ptr<function, array<u32, 4>, read_write> = var
     %4:u32 = convert %idx
     %5:u32 = min %4, 3u
@@ -699,8 +699,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx1:u32, %idx2:u32, %idx3:u32, %idx4:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx1:u32, %idx2:u32, %idx3:u32, %idx4:u32):u32 {
+  $B1: {
     %arr:ptr<function, array<array<array<array<u32, 4>, 5>, 6>, 7>, read_write> = var
     %7:ptr<function, u32, read_write> = access %arr, %idx1, %idx2, %idx3, %idx4
     %8:u32 = load %7
@@ -711,8 +711,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx1:u32, %idx2:u32, %idx3:u32, %idx4:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx1:u32, %idx2:u32, %idx3:u32, %idx4:u32):u32 {
+  $B1: {
     %arr:ptr<function, array<array<array<array<u32, 4>, 5>, 6>, 7>, read_write> = var
     %7:u32 = min %idx1, 6u
     %8:u32 = min %idx2, 5u
@@ -755,8 +755,8 @@
   arr:array<mat3x4<f32>, 4> @offset(0)
 }
 
-%foo = func(%idx1:u32, %idx2:u32, %idx3:u32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%idx1:u32, %idx2:u32, %idx3:u32):vec4<f32> {
+  $B1: {
     %arr:ptr<function, array<structure, 8>, read_write> = var
     %6:ptr<function, vec4<f32>, read_write> = access %arr, %idx1, 0u, %idx2, %idx3
     %7:vec4<f32> = load %6
@@ -771,8 +771,8 @@
   arr:array<mat3x4<f32>, 4> @offset(0)
 }
 
-%foo = func(%idx1:u32, %idx2:u32, %idx3:u32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%idx1:u32, %idx2:u32, %idx3:u32):vec4<f32> {
+  $B1: {
     %arr:ptr<function, array<structure, 8>, read_write> = var
     %6:u32 = min %idx1, 7u
     %7:u32 = min %idx2, 3u
@@ -808,12 +808,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<private, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = load_vector_element %vec, %idx
     ret %4
   }
@@ -822,12 +822,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<private, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:u32 = load_vector_element %vec, %4
     ret %5
@@ -855,12 +855,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<private, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     store_vector_element %vec, %idx, 0u
     ret
   }
@@ -869,12 +869,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<private, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     %4:u32 = min %idx, 3u
     store_vector_element %vec, %4, 0u
     ret
@@ -903,12 +903,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<private, array<u32, 4>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<private, u32, read_write> = access %arr, %idx
     %5:u32 = load %4
     ret %5
@@ -918,12 +918,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<private, array<u32, 4>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:ptr<private, u32, read_write> = access %arr, %4
     %6:u32 = load %5
@@ -952,12 +952,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<push_constant, vec4<u32>, read> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = load_vector_element %vec, %idx
     ret %4
   }
@@ -966,12 +966,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<push_constant, vec4<u32>, read> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:u32 = load_vector_element %vec, %4
     ret %5
@@ -999,12 +999,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<push_constant, vec4<u32>, read> = var
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     store_vector_element %vec, %idx, 0u
     ret
   }
@@ -1013,12 +1013,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<push_constant, vec4<u32>, read> = var
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     %4:u32 = min %idx, 3u
     store_vector_element %vec, %4, 0u
     ret
@@ -1047,12 +1047,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<push_constant, array<u32, 4>, read> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<push_constant, u32, read> = access %arr, %idx
     %5:u32 = load %4
     ret %5
@@ -1062,12 +1062,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<push_constant, array<u32, 4>, read> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:ptr<push_constant, u32, read> = access %arr, %4
     %6:u32 = load %5
@@ -1097,12 +1097,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<storage, vec4<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = load_vector_element %vec, %idx
     ret %4
   }
@@ -1111,12 +1111,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<storage, vec4<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:u32 = load_vector_element %vec, %4
     ret %5
@@ -1145,12 +1145,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<storage, vec4<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     store_vector_element %vec, %idx, 0u
     ret
   }
@@ -1159,12 +1159,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<storage, vec4<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     %4:u32 = min %idx, 3u
     store_vector_element %vec, %4, 0u
     ret
@@ -1194,12 +1194,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<storage, u32, read_write> = access %arr, %idx
     %5:u32 = load %4
     ret %5
@@ -1209,12 +1209,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32, 4>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:ptr<storage, u32, read_write> = access %arr, %4
     %6:u32 = load %5
@@ -1244,12 +1244,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<uniform, vec4<u32>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = load_vector_element %vec, %idx
     ret %4
   }
@@ -1258,12 +1258,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<uniform, vec4<u32>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:u32 = load_vector_element %vec, %4
     ret %5
@@ -1292,12 +1292,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<uniform, vec4<u32>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     store_vector_element %vec, %idx, 0u
     ret
   }
@@ -1306,12 +1306,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<uniform, vec4<u32>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     %4:u32 = min %idx, 3u
     store_vector_element %vec, %4, 0u
     ret
@@ -1341,12 +1341,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<uniform, array<u32, 4>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<uniform, u32, read> = access %arr, %idx
     %5:u32 = load %4
     ret %5
@@ -1356,12 +1356,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<uniform, array<u32, 4>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:ptr<uniform, u32, read> = access %arr, %4
     %6:u32 = load %5
@@ -1390,12 +1390,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<workgroup, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = load_vector_element %vec, %idx
     ret %4
   }
@@ -1404,12 +1404,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<workgroup, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:u32 = load_vector_element %vec, %4
     ret %5
@@ -1437,12 +1437,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<workgroup, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     store_vector_element %vec, %idx, 0u
     ret
   }
@@ -1451,12 +1451,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %vec:ptr<workgroup, vec4<u32>, read_write> = var
 }
 
-%foo = func(%idx:u32):void -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):void {
+  $B2: {
     %4:u32 = min %idx, 3u
     store_vector_element %vec, %4, 0u
     ret
@@ -1485,12 +1485,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<workgroup, array<u32, 4>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<workgroup, u32, read_write> = access %arr, %idx
     %5:u32 = load %4
     ret %5
@@ -1500,12 +1500,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<workgroup, array<u32, 4>, read_write> = var
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = min %idx, 3u
     %5:ptr<workgroup, u32, read_write> = access %arr, %4
     %6:u32 = load %5
@@ -1541,8 +1541,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %3:u32 = access vec4<u32>(1u, 2u, 3u, 4u), %idx
     ret %3
   }
@@ -1551,8 +1551,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %3:u32 = min %idx, 3u
     %4:u32 = access vec4<u32>(1u, 2u, 3u, 4u), %3
     ret %4
@@ -1584,8 +1584,8 @@
     });
 
     auto* src = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %3:u32 = access array<u32, 4>(1u, 2u, 3u, 4u), %idx
     ret %3
   }
@@ -1594,8 +1594,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%idx:u32):u32 {
+  $B1: {
     %3:u32 = min %idx, 3u
     %4:u32 = access array<u32, 4>(1u, 2u, 3u, 4u), %3
     ret %4
@@ -1621,8 +1621,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arr:array<u32, 4>, %idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arr:array<u32, 4>, %idx:u32):u32 {
+  $B1: {
     %4:u32 = access %arr, %idx
     ret %4
   }
@@ -1631,8 +1631,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arr:array<u32, 4>, %idx:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arr:array<u32, 4>, %idx:u32):u32 {
+  $B1: {
     %4:u32 = min %idx, 3u
     %5:u32 = access %arr, %4
     ret %5
@@ -1666,12 +1666,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:ptr<storage, u32, read_write> = access %arr, 42u
     %4:u32 = load %3
     ret %4
@@ -1681,12 +1681,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:u32 = arrayLength %arr
     %4:u32 = sub %3, 1u
     %5:u32 = min 42u, %4
@@ -1719,12 +1719,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<storage, u32, read_write> = access %arr, %idx
     %5:u32 = load %4
     ret %5
@@ -1734,12 +1734,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = arrayLength %arr
     %5:u32 = sub %4, 1u
     %6:u32 = min %idx, %5
@@ -1779,12 +1779,12 @@
   arr:array<u32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, structure, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:ptr<storage, u32, read_write> = access %buffer, 0u, 42u
     %4:u32 = load %3
     ret %4
@@ -1798,12 +1798,12 @@
   arr:array<u32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, structure, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:ptr<storage, array<u32>, read_write> = access %buffer, 0u
     %4:u32 = arrayLength %3
     %5:u32 = sub %4, 1u
@@ -1846,12 +1846,12 @@
   arr:array<u32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, structure, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<storage, u32, read_write> = access %buffer, 0u, %idx
     %5:u32 = load %4
     ret %5
@@ -1865,12 +1865,12 @@
   arr:array<u32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, structure, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<storage, array<u32>, read_write> = access %buffer, 0u
     %5:u32 = arrayLength %4
     %6:u32 = sub %5, 1u
@@ -1904,12 +1904,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:ptr<storage, u32, read_write> = access %arr, %idx
     %5:u32 = load %4
     ret %5
@@ -1919,12 +1919,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %arr:ptr<storage, array<u32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%idx:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%idx:u32):u32 {
+  $B2: {
     %4:u32 = arrayLength %arr
     %5:u32 = sub %4, 1u
     %6:u32 = min %idx, %5
@@ -1962,12 +1962,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 0)
 }
 
-%foo = func():vec2<u32> -> %b2 {
-  %b2 = block {
+%foo = func():vec2<u32> {
+  $B2: {
     %3:texture_2d<f32> = load %texture
     %4:vec2<u32> = textureDimensions %3
     ret %4
@@ -2002,12 +2002,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%level:u32):vec2<u32> -> %b2 {
-  %b2 = block {
+%foo = func(%level:u32):vec2<u32> {
+  $B2: {
     %4:texture_2d<f32> = load %texture
     %5:vec2<u32> = textureDimensions %4, %level
     ret %5
@@ -2017,12 +2017,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%level:u32):vec2<u32> -> %b2 {
-  %b2 = block {
+%foo = func(%level:u32):vec2<u32> {
+  $B2: {
     %4:texture_2d<f32> = load %texture
     %5:u32 = textureNumLevels %4
     %6:u32 = sub %5, 1u
@@ -2074,19 +2074,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_1d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:i32, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:i32, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_1d<f32> = load %texture
     %6:vec4<f32> = textureLoad %5, %coords, %level
     ret %6
   }
 }
-%load_unsigned = func(%coords_1:u32, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:u32, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %10:texture_1d<f32> = load %texture
     %11:vec4<f32> = textureLoad %10, %coords_1, %level_1
     ret %11
@@ -2096,12 +2096,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_1d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:i32, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:i32, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_1d<f32> = load %texture
     %6:u32 = textureDimensions %5
     %7:u32 = sub %6, 1u
@@ -2115,8 +2115,8 @@
     ret %14
   }
 }
-%load_unsigned = func(%coords_1:u32, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:u32, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %18:texture_1d<f32> = load %texture
     %19:u32 = textureDimensions %18
     %20:u32 = sub %19, 1u
@@ -2171,19 +2171,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_2d<f32> = load %texture
     %6:vec4<f32> = textureLoad %5, %coords, %level
     ret %6
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %10:texture_2d<f32> = load %texture
     %11:vec4<f32> = textureLoad %10, %coords_1, %level_1
     ret %11
@@ -2193,12 +2193,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_2d<f32> = load %texture
     %6:vec2<u32> = textureDimensions %5
     %7:vec2<u32> = sub %6, vec2<u32>(1u)
@@ -2212,8 +2212,8 @@
     ret %14
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %18:texture_2d<f32> = load %texture
     %19:vec2<u32> = textureDimensions %18
     %20:vec2<u32> = sub %19, vec2<u32>(1u)
@@ -2271,19 +2271,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_2d_array<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):vec4<f32> {
+  $B2: {
     %6:texture_2d_array<f32> = load %texture
     %7:vec4<f32> = textureLoad %6, %coords, %layer, %level
     ret %7
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
+  $B3: {
     %12:texture_2d_array<f32> = load %texture
     %13:vec4<f32> = textureLoad %12, %coords_1, %layer_1, %level_1
     ret %13
@@ -2293,12 +2293,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_2d_array<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):vec4<f32> {
+  $B2: {
     %6:texture_2d_array<f32> = load %texture
     %7:vec2<u32> = textureDimensions %6
     %8:vec2<u32> = sub %7, vec2<u32>(1u)
@@ -2316,8 +2316,8 @@
     ret %19
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
+  $B3: {
     %24:texture_2d_array<f32> = load %texture
     %25:vec2<u32> = textureDimensions %24
     %26:vec2<u32> = sub %25, vec2<u32>(1u)
@@ -2375,19 +2375,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_3d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec3<i32>, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec3<i32>, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_3d<f32> = load %texture
     %6:vec4<f32> = textureLoad %5, %coords, %level
     ret %6
   }
 }
-%load_unsigned = func(%coords_1:vec3<u32>, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec3<u32>, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %10:texture_3d<f32> = load %texture
     %11:vec4<f32> = textureLoad %10, %coords_1, %level_1
     ret %11
@@ -2397,12 +2397,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_3d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec3<i32>, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec3<i32>, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_3d<f32> = load %texture
     %6:vec3<u32> = textureDimensions %5
     %7:vec3<u32> = sub %6, vec3<u32>(1u)
@@ -2416,8 +2416,8 @@
     ret %14
   }
 }
-%load_unsigned = func(%coords_1:vec3<u32>, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec3<u32>, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %18:texture_3d<f32> = load %texture
     %19:vec3<u32> = textureDimensions %18
     %20:vec3<u32> = sub %19, vec3<u32>(1u)
@@ -2473,19 +2473,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_multisampled_2d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_multisampled_2d<f32> = load %texture
     %6:vec4<f32> = textureLoad %5, %coords, %level
     ret %6
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %10:texture_multisampled_2d<f32> = load %texture
     %11:vec4<f32> = textureLoad %10, %coords_1, %level_1
     ret %11
@@ -2495,12 +2495,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_multisampled_2d<f32>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %level:i32):vec4<f32> {
+  $B2: {
     %5:texture_multisampled_2d<f32> = load %texture
     %6:vec2<u32> = textureDimensions %5
     %7:vec2<u32> = sub %6, vec2<u32>(1u)
@@ -2510,8 +2510,8 @@
     ret %10
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):vec4<f32> {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %14:texture_multisampled_2d<f32> = load %texture
     %15:vec2<u32> = textureDimensions %14
     %16:vec2<u32> = sub %15, vec2<u32>(1u)
@@ -2560,19 +2560,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_depth_2d, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %level:i32):f32 -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %level:i32):f32 {
+  $B2: {
     %5:texture_depth_2d = load %texture
     %6:f32 = textureLoad %5, %coords, %level
     ret %6
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):f32 -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):f32 {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %10:texture_depth_2d = load %texture
     %11:f32 = textureLoad %10, %coords_1, %level_1
     ret %11
@@ -2582,12 +2582,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_depth_2d, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %level:i32):f32 -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %level:i32):f32 {
+  $B2: {
     %5:texture_depth_2d = load %texture
     %6:vec2<u32> = textureDimensions %5
     %7:vec2<u32> = sub %6, vec2<u32>(1u)
@@ -2601,8 +2601,8 @@
     ret %14
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):f32 -> %b3 {  # %coords_1: 'coords', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %level_1:u32):f32 {  # %coords_1: 'coords', %level_1: 'level'
+  $B3: {
     %18:texture_depth_2d = load %texture
     %19:vec2<u32> = textureDimensions %18
     %20:vec2<u32> = sub %19, vec2<u32>(1u)
@@ -2659,19 +2659,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_depth_2d_array, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):f32 -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):f32 {
+  $B2: {
     %6:texture_depth_2d_array = load %texture
     %7:f32 = textureLoad %6, %coords, %layer, %level
     ret %7
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):f32 -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):f32 {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
+  $B3: {
     %12:texture_depth_2d_array = load %texture
     %13:f32 = textureLoad %12, %coords_1, %layer_1, %level_1
     ret %13
@@ -2681,12 +2681,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_depth_2d_array, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):f32 -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32, %level:i32):f32 {
+  $B2: {
     %6:texture_depth_2d_array = load %texture
     %7:vec2<u32> = textureDimensions %6
     %8:vec2<u32> = sub %7, vec2<u32>(1u)
@@ -2704,8 +2704,8 @@
     ret %19
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):f32 -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %level_1:u32):f32 {  # %coords_1: 'coords', %layer_1: 'layer', %level_1: 'level'
+  $B3: {
     %24:texture_depth_2d_array = load %texture
     %25:vec2<u32> = textureDimensions %24
     %26:vec2<u32> = sub %25, vec2<u32>(1u)
@@ -2761,19 +2761,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_depth_multisampled_2d, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %index:i32):f32 -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %index:i32):f32 {
+  $B2: {
     %5:texture_depth_multisampled_2d = load %texture
     %6:f32 = textureLoad %5, %coords, %index
     ret %6
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %index_1:u32):f32 -> %b3 {  # %coords_1: 'coords', %index_1: 'index'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %index_1:u32):f32 {  # %coords_1: 'coords', %index_1: 'index'
+  $B3: {
     %10:texture_depth_multisampled_2d = load %texture
     %11:f32 = textureLoad %10, %coords_1, %index_1
     ret %11
@@ -2783,12 +2783,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_depth_multisampled_2d, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %index:i32):f32 -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %index:i32):f32 {
+  $B2: {
     %5:texture_depth_multisampled_2d = load %texture
     %6:vec2<u32> = textureDimensions %5
     %7:vec2<u32> = sub %6, vec2<u32>(1u)
@@ -2798,8 +2798,8 @@
     ret %10
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %index_1:u32):f32 -> %b3 {  # %coords_1: 'coords', %index_1: 'index'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %index_1:u32):f32 {  # %coords_1: 'coords', %index_1: 'index'
+  $B3: {
     %14:texture_depth_multisampled_2d = load %texture
     %15:vec2<u32> = textureDimensions %14
     %16:vec2<u32> = sub %15, vec2<u32>(1u)
@@ -2845,19 +2845,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>):vec4<f32> {
+  $B2: {
     %4:texture_external = load %texture
     %5:vec4<f32> = textureLoad %4, %coords
     ret %5
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %8:texture_external = load %texture
     %9:vec4<f32> = textureLoad %8, %coords_1
     ret %9
@@ -2867,12 +2867,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_external, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>):vec4<f32> {
+  $B2: {
     %4:texture_external = load %texture
     %5:vec2<u32> = textureDimensions %4
     %6:vec2<u32> = sub %5, vec2<u32>(1u)
@@ -2882,8 +2882,8 @@
     ret %9
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %12:texture_external = load %texture
     %13:vec2<u32> = textureDimensions %12
     %14:vec2<u32> = sub %13, vec2<u32>(1u)
@@ -2935,19 +2935,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_1d<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:i32):vec4<f32> {
+  $B2: {
     %4:texture_storage_1d<rgba8unorm, read_write> = load %texture
     %5:vec4<f32> = textureLoad %4, %coords
     ret %5
   }
 }
-%load_unsigned = func(%coords_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:u32):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %8:texture_storage_1d<rgba8unorm, read_write> = load %texture
     %9:vec4<f32> = textureLoad %8, %coords_1
     ret %9
@@ -2957,12 +2957,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_1d<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:i32):vec4<f32> {
+  $B2: {
     %4:texture_storage_1d<rgba8unorm, read_write> = load %texture
     %5:u32 = textureDimensions %4
     %6:u32 = sub %5, 1u
@@ -2972,8 +2972,8 @@
     ret %9
   }
 }
-%load_unsigned = func(%coords_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:u32):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %12:texture_storage_1d<rgba8unorm, read_write> = load %texture
     %13:u32 = textureDimensions %12
     %14:u32 = sub %13, 1u
@@ -3025,19 +3025,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>):vec4<f32> {
+  $B2: {
     %4:texture_storage_2d<rgba8unorm, read_write> = load %texture
     %5:vec4<f32> = textureLoad %4, %coords
     ret %5
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %8:texture_storage_2d<rgba8unorm, read_write> = load %texture
     %9:vec4<f32> = textureLoad %8, %coords_1
     ret %9
@@ -3047,12 +3047,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>):vec4<f32> {
+  $B2: {
     %4:texture_storage_2d<rgba8unorm, read_write> = load %texture
     %5:vec2<u32> = textureDimensions %4
     %6:vec2<u32> = sub %5, vec2<u32>(1u)
@@ -3062,8 +3062,8 @@
     ret %9
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %12:texture_storage_2d<rgba8unorm, read_write> = load %texture
     %13:vec2<u32> = textureDimensions %12
     %14:vec2<u32> = sub %13, vec2<u32>(1u)
@@ -3119,19 +3119,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d_array<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32):vec4<f32> {
+  $B2: {
     %5:texture_storage_2d_array<rgba8unorm, read_write> = load %texture
     %6:vec4<f32> = textureLoad %5, %coords, %layer
     ret %6
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32):vec4<f32> {  # %coords_1: 'coords', %layer_1: 'layer'
+  $B3: {
     %10:texture_storage_2d_array<rgba8unorm, read_write> = load %texture
     %11:vec4<f32> = textureLoad %10, %coords_1, %layer_1
     ret %11
@@ -3141,12 +3141,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d_array<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32):vec4<f32> {
+  $B2: {
     %5:texture_storage_2d_array<rgba8unorm, read_write> = load %texture
     %6:vec2<u32> = textureDimensions %5
     %7:vec2<u32> = sub %6, vec2<u32>(1u)
@@ -3160,8 +3160,8 @@
     ret %14
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32):vec4<f32> -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32):vec4<f32> {  # %coords_1: 'coords', %layer_1: 'layer'
+  $B3: {
     %18:texture_storage_2d_array<rgba8unorm, read_write> = load %texture
     %19:vec2<u32> = textureDimensions %18
     %20:vec2<u32> = sub %19, vec2<u32>(1u)
@@ -3216,19 +3216,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_3d<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec3<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec3<i32>):vec4<f32> {
+  $B2: {
     %4:texture_storage_3d<rgba8unorm, read_write> = load %texture
     %5:vec4<f32> = textureLoad %4, %coords
     ret %5
   }
 }
-%load_unsigned = func(%coords_1:vec3<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec3<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %8:texture_storage_3d<rgba8unorm, read_write> = load %texture
     %9:vec4<f32> = textureLoad %8, %coords_1
     ret %9
@@ -3238,12 +3238,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_3d<rgba8unorm, read_write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec3<i32>):vec4<f32> -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec3<i32>):vec4<f32> {
+  $B2: {
     %4:texture_storage_3d<rgba8unorm, read_write> = load %texture
     %5:vec3<u32> = textureDimensions %4
     %6:vec3<u32> = sub %5, vec3<u32>(1u)
@@ -3253,8 +3253,8 @@
     ret %9
   }
 }
-%load_unsigned = func(%coords_1:vec3<u32>):vec4<f32> -> %b3 {  # %coords_1: 'coords'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec3<u32>):vec4<f32> {  # %coords_1: 'coords'
+  $B3: {
     %12:texture_storage_3d<rgba8unorm, read_write> = load %texture
     %13:vec3<u32> = textureDimensions %12
     %14:vec3<u32> = sub %13, vec3<u32>(1u)
@@ -3308,19 +3308,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_1d<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:i32, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:i32, %value:vec4<f32>):void {
+  $B2: {
     %5:texture_storage_1d<rgba8unorm, write> = load %texture
     %6:void = textureStore %5, %coords, %value
     ret
   }
 }
-%load_unsigned = func(%coords_1:u32, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:u32, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %10:texture_storage_1d<rgba8unorm, write> = load %texture
     %11:void = textureStore %10, %coords_1, %value_1
     ret
@@ -3330,12 +3330,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_1d<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:i32, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:i32, %value:vec4<f32>):void {
+  $B2: {
     %5:texture_storage_1d<rgba8unorm, write> = load %texture
     %6:u32 = textureDimensions %5
     %7:u32 = sub %6, 1u
@@ -3345,8 +3345,8 @@
     ret
   }
 }
-%load_unsigned = func(%coords_1:u32, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:u32, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %14:texture_storage_1d<rgba8unorm, write> = load %texture
     %15:u32 = textureDimensions %14
     %16:u32 = sub %15, 1u
@@ -3400,19 +3400,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %value:vec4<f32>):void {
+  $B2: {
     %5:texture_storage_2d<rgba8unorm, write> = load %texture
     %6:void = textureStore %5, %coords, %value
     ret
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %10:texture_storage_2d<rgba8unorm, write> = load %texture
     %11:void = textureStore %10, %coords_1, %value_1
     ret
@@ -3422,12 +3422,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %value:vec4<f32>):void {
+  $B2: {
     %5:texture_storage_2d<rgba8unorm, write> = load %texture
     %6:vec2<u32> = textureDimensions %5
     %7:vec2<u32> = sub %6, vec2<u32>(1u)
@@ -3437,8 +3437,8 @@
     ret
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %14:texture_storage_2d<rgba8unorm, write> = load %texture
     %15:vec2<u32> = textureDimensions %14
     %16:vec2<u32> = sub %15, vec2<u32>(1u)
@@ -3494,19 +3494,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d_array<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32, %value:vec4<f32>):void {
+  $B2: {
     %6:texture_storage_2d_array<rgba8unorm, write> = load %texture
     %7:void = textureStore %6, %coords, %layer, %value
     ret
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %layer_1: 'layer', %value_1: 'value'
+  $B3: {
     %12:texture_storage_2d_array<rgba8unorm, write> = load %texture
     %13:void = textureStore %12, %coords_1, %layer_1, %value_1
     ret
@@ -3516,12 +3516,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_2d_array<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec2<i32>, %layer:i32, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec2<i32>, %layer:i32, %value:vec4<f32>):void {
+  $B2: {
     %6:texture_storage_2d_array<rgba8unorm, write> = load %texture
     %7:vec2<u32> = textureDimensions %6
     %8:vec2<u32> = sub %7, vec2<u32>(1u)
@@ -3535,8 +3535,8 @@
     ret
   }
 }
-%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %layer_1: 'layer', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec2<u32>, %layer_1:u32, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %layer_1: 'layer', %value_1: 'value'
+  $B3: {
     %20:texture_storage_2d_array<rgba8unorm, write> = load %texture
     %21:vec2<u32> = textureDimensions %20
     %22:vec2<u32> = sub %21, vec2<u32>(1u)
@@ -3593,19 +3593,19 @@
     }
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_3d<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec3<i32>, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec3<i32>, %value:vec4<f32>):void {
+  $B2: {
     %5:texture_storage_3d<rgba8unorm, write> = load %texture
     %6:void = textureStore %5, %coords, %value
     ret
   }
 }
-%load_unsigned = func(%coords_1:vec3<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec3<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %10:texture_storage_3d<rgba8unorm, write> = load %texture
     %11:void = textureStore %10, %coords_1, %value_1
     ret
@@ -3615,12 +3615,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %texture:ptr<handle, texture_storage_3d<rgba8unorm, write>, read> = var @binding_point(0, 0)
 }
 
-%load_signed = func(%coords:vec3<i32>, %value:vec4<f32>):void -> %b2 {
-  %b2 = block {
+%load_signed = func(%coords:vec3<i32>, %value:vec4<f32>):void {
+  $B2: {
     %5:texture_storage_3d<rgba8unorm, write> = load %texture
     %6:vec3<u32> = textureDimensions %5
     %7:vec3<u32> = sub %6, vec3<u32>(1u)
@@ -3630,8 +3630,8 @@
     ret
   }
 }
-%load_unsigned = func(%coords_1:vec3<u32>, %value_1:vec4<f32>):void -> %b3 {  # %coords_1: 'coords', %value_1: 'value'
-  %b3 = block {
+%load_unsigned = func(%coords_1:vec3<u32>, %value_1:vec4<f32>):void {  # %coords_1: 'coords', %value_1: 'value'
+  $B3: {
     %14:texture_storage_3d<rgba8unorm, write> = load %texture
     %15:vec3<u32> = textureDimensions %14
     %16:vec3<u32> = sub %15, vec3<u32>(1u)
diff --git a/src/tint/lang/core/ir/transform/std140_test.cc b/src/tint/lang/core/ir/transform/std140_test.cc
index b12a51d..4b819bb 100644
--- a/src/tint/lang/core/ir/transform/std140_test.cc
+++ b/src/tint/lang/core/ir/transform/std140_test.cc
@@ -48,8 +48,8 @@
     func->Block()->Append(b.Return(func));
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     ret
   }
 }
@@ -83,12 +83,12 @@
   a:mat2x4<f32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():mat2x4<f32> -> %b2 {
-  %b2 = block {
+%foo = func():mat2x4<f32> {
+  $B2: {
     %3:ptr<uniform, mat2x4<f32>, read> = access %buffer, 0u
     %4:mat2x4<f32> = load %3
     ret %4
@@ -127,12 +127,12 @@
   a:mat2x4<f32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<storage, MyStruct, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():mat2x4<f32> -> %b2 {
-  %b2 = block {
+%foo = func():mat2x4<f32> {
+  $B2: {
     %3:ptr<storage, mat2x4<f32>, read_write> = access %buffer, 0u
     %4:mat2x4<f32> = load %3
     ret %4
@@ -172,12 +172,12 @@
   arr:array<mat2x2<f32>, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():mat2x2<f32> -> %b2 {
-  %b2 = block {
+%foo = func():mat2x2<f32> {
+  $B2: {
     %3:ptr<uniform, mat2x2<f32>, read> = access %buffer, 0u, 2u
     %4:mat2x2<f32> = load %3
     ret %4
@@ -216,12 +216,12 @@
   a:mat3x2<f32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():mat3x2<f32> -> %b2 {
-  %b2 = block {
+%foo = func():mat3x2<f32> {
+  $B2: {
     %3:ptr<uniform, mat3x2<f32>, read> = access %buffer, 0u
     %4:mat3x2<f32> = load %3
     ret %4
@@ -241,12 +241,12 @@
   a_col2:vec2<f32> @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():mat3x2<f32> -> %b2 {
-  %b2 = block {
+%foo = func():mat3x2<f32> {
+  $B2: {
     %3:ptr<uniform, vec2<f32>, read> = access %buffer, 0u
     %4:vec2<f32> = load %3
     %5:ptr<uniform, vec2<f32>, read> = access %buffer, 1u
@@ -287,12 +287,12 @@
   a:mat3x2<f32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():vec2<f32> -> %b2 {
-  %b2 = block {
+%foo = func():vec2<f32> {
+  $B2: {
     %3:ptr<uniform, vec2<f32>, read> = access %buffer, 0u, 1u
     %4:vec2<f32> = load %3
     ret %4
@@ -312,12 +312,12 @@
   a_col2:vec2<f32> @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():vec2<f32> -> %b2 {
-  %b2 = block {
+%foo = func():vec2<f32> {
+  $B2: {
     %3:ptr<uniform, vec2<f32>, read> = access %buffer, 0u
     %4:vec2<f32> = load %3
     %5:ptr<uniform, vec2<f32>, read> = access %buffer, 1u
@@ -359,12 +359,12 @@
   a:mat3x2<f32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():f32 -> %b2 {
-  %b2 = block {
+%foo = func():f32 {
+  $B2: {
     %3:ptr<uniform, vec2<f32>, read> = access %buffer, 0u, 1u
     %4:f32 = load_vector_element %3, 1u
     ret %4
@@ -384,12 +384,12 @@
   a_col2:vec2<f32> @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():f32 -> %b2 {
-  %b2 = block {
+%foo = func():f32 {
+  $B2: {
     %3:ptr<uniform, vec2<f32>, read> = access %buffer, 0u
     %4:vec2<f32> = load %3
     %5:ptr<uniform, vec2<f32>, read> = access %buffer, 1u
@@ -431,12 +431,12 @@
   a:mat3x2<f32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():MyStruct -> %b2 {
-  %b2 = block {
+%foo = func():MyStruct {
+  $B2: {
     %3:MyStruct = load %buffer
     ret %3
   }
@@ -455,19 +455,19 @@
   a_col2:vec2<f32> @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():MyStruct -> %b2 {
-  %b2 = block {
+%foo = func():MyStruct {
+  $B2: {
     %3:MyStruct_std140 = load %buffer
     %4:MyStruct = call %convert_MyStruct, %3
     ret %4
   }
 }
-%convert_MyStruct = func(%input:MyStruct_std140):MyStruct -> %b3 {
-  %b3 = block {
+%convert_MyStruct = func(%input:MyStruct_std140):MyStruct {
+  $B3: {
     %7:vec2<f32> = access %input, 0u
     %8:vec2<f32> = access %input, 1u
     %9:vec2<f32> = access %input, 2u
@@ -513,12 +513,12 @@
   arr:array<Inner, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%foo = func():Outer -> %b2 {
-  %b2 = block {
+%foo = func():Outer {
+  $B2: {
     %3:Outer = load %buffer
     ret %3
   }
@@ -545,29 +545,29 @@
   arr:array<Inner_std140, 4> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():Outer -> %b2 {
-  %b2 = block {
+%foo = func():Outer {
+  $B2: {
     %3:Outer_std140 = load %buffer
     %4:Outer = call %convert_Outer, %3
     ret %4
   }
 }
-%convert_Outer = func(%input:Outer_std140):Outer -> %b3 {
-  %b3 = block {
+%convert_Outer = func(%input:Outer_std140):Outer {
+  $B3: {
     %7:array<Inner_std140, 4> = access %input, 0u
     %8:ptr<function, array<Inner, 4>, read_write> = var
-    loop [i: %b4, b: %b5, c: %b6] {  # loop_1
-      %b4 = block {  # initializer
-        next_iteration %b5 0u
+    loop [i: $B4, b: $B5, c: $B6] {  # loop_1
+      $B4: {  # initializer
+        next_iteration 0u  # -> $B5
       }
-      %b5 = block (%idx:u32) {  # body
+      $B5 (%idx:u32): {  # body
         %10:bool = gte %idx:u32, 4u
-        if %10 [t: %b7] {  # if_1
-          %b7 = block {  # true
+        if %10 [t: $B7] {  # if_1
+          $B7: {  # true
             exit_loop  # loop_1
           }
         }
@@ -575,11 +575,11 @@
         %12:Inner_std140 = access %7, %idx:u32
         %13:Inner = call %convert_Inner, %12
         store %11, %13
-        continue %b6
+        continue  # -> $B6
       }
-      %b6 = block {  # continuing
+      $B6: {  # continuing
         %15:u32 = add %idx:u32, 1u
-        next_iteration %b5 %15
+        next_iteration %15  # -> $B5
       }
     }
     %16:array<Inner, 4> = load %8
@@ -587,8 +587,8 @@
     ret %17
   }
 }
-%convert_Inner = func(%input_1:Inner_std140):Inner -> %b8 {  # %input_1: 'input'
-  %b8 = block {
+%convert_Inner = func(%input_1:Inner_std140):Inner {  # %input_1: 'input'
+  $B8: {
     %19:vec2<f32> = access %input_1, 0u
     %20:vec2<f32> = access %input_1, 1u
     %21:vec2<f32> = access %input_1, 2u
@@ -633,12 +633,12 @@
   inner:Inner @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%foo = func():Inner -> %b2 {
-  %b2 = block {
+%foo = func():Inner {
+  $B2: {
     %3:ptr<uniform, Inner, read> = access %buffer, 0u
     %4:Inner = load %3
     ret %4
@@ -666,20 +666,20 @@
   inner:Inner_std140 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():Inner -> %b2 {
-  %b2 = block {
+%foo = func():Inner {
+  $B2: {
     %3:ptr<uniform, Inner_std140, read> = access %buffer, 0u
     %4:Inner_std140 = load %3
     %5:Inner = call %convert_Inner, %4
     ret %5
   }
 }
-%convert_Inner = func(%input:Inner_std140):Inner -> %b3 {
-  %b3 = block {
+%convert_Inner = func(%input:Inner_std140):Inner {
+  $B3: {
     %8:vec2<f32> = access %input, 0u
     %9:vec2<f32> = access %input, 1u
     %10:vec2<f32> = access %input, 2u
@@ -725,12 +725,12 @@
   inner:Inner @offset(32)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%foo = func():Outer -> %b2 {
-  %b2 = block {
+%foo = func():Outer {
+  $B2: {
     %3:Outer = load %buffer
     ret %3
   }
@@ -755,19 +755,19 @@
   inner:Inner @offset(32)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():Outer -> %b2 {
-  %b2 = block {
+%foo = func():Outer {
+  $B2: {
     %3:Outer_std140 = load %buffer
     %4:Outer = call %convert_Outer, %3
     ret %4
   }
 }
-%convert_Outer = func(%input:Outer_std140):Outer -> %b3 {
-  %b3 = block {
+%convert_Outer = func(%input:Outer_std140):Outer {
+  $B3: {
     %7:vec2<f32> = access %input, 0u
     %8:vec2<f32> = access %input, 1u
     %9:vec2<f32> = access %input, 2u
@@ -830,12 +830,12 @@
   d:i32 @offset(168)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<Inner, 4>, read> = access %buffer, 1u
     %4:ptr<uniform, Inner, read> = access %3, 2u
     %5:ptr<uniform, mat3x2<f32>, read> = access %4, 1u
@@ -883,12 +883,12 @@
   d:i32 @offset(168)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<Inner_std140, 4>, read> = access %buffer, 1u
     %4:ptr<uniform, Inner_std140, read> = access %3, 2u
     %5:ptr<uniform, vec2<f32>, read> = access %4, 1u
@@ -901,14 +901,14 @@
     %12:vec2<f32> = access %11, 2u
     %13:array<Inner_std140, 4> = load %3
     %14:ptr<function, array<Inner, 4>, read_write> = var
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 0u
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration 0u  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %16:bool = gte %idx:u32, 4u
-        if %16 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %16 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -916,11 +916,11 @@
         %18:Inner_std140 = access %13, %idx:u32
         %19:Inner = call %convert_Inner, %18
         store %17, %19
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %21:u32 = add %idx:u32, 1u
-        next_iteration %b4 %21
+        next_iteration %21  # -> $B4
       }
     }
     %22:array<Inner, 4> = load %14
@@ -935,8 +935,8 @@
     ret
   }
 }
-%convert_Inner = func(%input:Inner_std140):Inner -> %b7 {
-  %b7 = block {
+%convert_Inner = func(%input:Inner_std140):Inner {
+  $B7: {
     %32:i32 = access %input, 0u
     %33:vec2<f32> = access %input, 1u
     %34:vec2<f32> = access %input, 2u
@@ -1001,12 +1001,12 @@
   d:i32 @offset(168)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<Inner, 4>, read> = access %buffer, 1u
     %arr_ptr:ptr<uniform, array<Inner, 4>, read> = let %3
     %5:ptr<uniform, Inner, read> = access %arr_ptr, 2u
@@ -1058,12 +1058,12 @@
   d:i32 @offset(168)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, array<Inner_std140, 4>, read> = access %buffer, 1u
     %4:ptr<uniform, Inner_std140, read> = access %3, 2u
     %5:ptr<uniform, vec2<f32>, read> = access %4, 1u
@@ -1076,14 +1076,14 @@
     %12:vec2<f32> = access %11, 2u
     %13:array<Inner_std140, 4> = load %3
     %14:ptr<function, array<Inner, 4>, read_write> = var
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 0u
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration 0u  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %16:bool = gte %idx:u32, 4u
-        if %16 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %16 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -1091,11 +1091,11 @@
         %18:Inner_std140 = access %13, %idx:u32
         %19:Inner = call %convert_Inner, %18
         store %17, %19
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %21:u32 = add %idx:u32, 1u
-        next_iteration %b4 %21
+        next_iteration %21  # -> $B4
       }
     }
     %22:array<Inner, 4> = load %14
@@ -1110,8 +1110,8 @@
     ret
   }
 }
-%convert_Inner = func(%input:Inner_std140):Inner -> %b7 {
-  %b7 = block {
+%convert_Inner = func(%input:Inner_std140):Inner {
+  $B7: {
     %32:i32 = access %input, 0u
     %33:vec2<f32> = access %input, 1u
     %34:vec2<f32> = access %input, 2u
@@ -1179,12 +1179,12 @@
   d:i32 @offset(168)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%arr_idx:i32, %col_idx:i32, %el_idx:i32):void -> %b2 {
-  %b2 = block {
+%foo = func(%arr_idx:i32, %col_idx:i32, %el_idx:i32):void {
+  $B2: {
     %6:ptr<uniform, array<Inner, 4>, read> = access %buffer, 1u
     %7:ptr<uniform, Inner, read> = access %6, %arr_idx
     %8:ptr<uniform, mat3x2<f32>, read> = access %7, 1u
@@ -1232,12 +1232,12 @@
   d:i32 @offset(168)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, Outer_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func(%arr_idx:i32, %col_idx:i32, %el_idx:i32):void -> %b2 {
-  %b2 = block {
+%foo = func(%arr_idx:i32, %col_idx:i32, %el_idx:i32):void {
+  $B2: {
     %6:ptr<uniform, array<Inner_std140, 4>, read> = access %buffer, 1u
     %7:ptr<uniform, Inner_std140, read> = access %6, %arr_idx
     %8:ptr<uniform, vec2<f32>, read> = access %7, 1u
@@ -1250,14 +1250,14 @@
     %15:vec2<f32> = access %14, %col_idx
     %16:array<Inner_std140, 4> = load %6
     %17:ptr<function, array<Inner, 4>, read_write> = var
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 0u
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration 0u  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %19:bool = gte %idx:u32, 4u
-        if %19 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %19 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -1265,11 +1265,11 @@
         %21:Inner_std140 = access %16, %idx:u32
         %22:Inner = call %convert_Inner, %21
         store %20, %22
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %24:u32 = add %idx:u32, 1u
-        next_iteration %b4 %24
+        next_iteration %24  # -> $B4
       }
     }
     %25:array<Inner, 4> = load %17
@@ -1284,8 +1284,8 @@
     ret
   }
 }
-%convert_Inner = func(%input:Inner_std140):Inner -> %b7 {
-  %b7 = block {
+%convert_Inner = func(%input:Inner_std140):Inner {
+  $B7: {
     %35:i32 = access %input, 0u
     %36:vec2<f32> = access %input, 1u
     %37:vec2<f32> = access %input, 2u
@@ -1340,12 +1340,12 @@
   b:i32 @offset(128)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, i32, read> = access %buffer, 0u
     %4:i32 = load %3
     %a:i32 = let %4
@@ -1377,12 +1377,12 @@
   b:i32 @offset(128)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:ptr<uniform, i32, read> = access %buffer, 0u
     %4:i32 = load %3
     %a:i32 = let %4
@@ -1432,12 +1432,12 @@
   a:mat4x3<f32> @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():mat4x3<f32> -> %b2 {
-  %b2 = block {
+%foo = func():mat4x3<f32> {
+  $B2: {
     %3:ptr<uniform, mat4x3<f32>, read> = access %buffer, 0u
     %4:mat4x3<f32> = load %3
     ret %4
@@ -1458,12 +1458,12 @@
   a_col3:vec3<f32> @offset(48)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():mat4x3<f32> -> %b2 {
-  %b2 = block {
+%foo = func():mat4x3<f32> {
+  $B2: {
     %3:ptr<uniform, vec3<f32>, read> = access %buffer, 0u
     %4:vec3<f32> = load %3
     %5:ptr<uniform, vec3<f32>, read> = access %buffer, 1u
@@ -1578,65 +1578,65 @@
   b:mat3x2<f32> @offset(64)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%load_struct_a = func():mat4x4<f32> -> %b2 {
-  %b2 = block {
+%load_struct_a = func():mat4x4<f32> {
+  $B2: {
     %3:MyStruct = load %buffer
     %4:mat4x4<f32> = access %3, 0u
     ret %4
   }
 }
-%load_struct_b = func():mat3x2<f32> -> %b3 {
-  %b3 = block {
+%load_struct_b = func():mat3x2<f32> {
+  $B3: {
     %6:MyStruct = load %buffer
     %7:mat3x2<f32> = access %6, 1u
     ret %7
   }
 }
-%load_mat_a = func():vec4<f32> -> %b4 {
-  %b4 = block {
+%load_mat_a = func():vec4<f32> {
+  $B4: {
     %9:ptr<uniform, mat4x4<f32>, read> = access %buffer, 0u
     %10:mat4x4<f32> = load %9
     %11:vec4<f32> = access %10, 0u
     ret %11
   }
 }
-%load_mat_b = func():vec2<f32> -> %b5 {
-  %b5 = block {
+%load_mat_b = func():vec2<f32> {
+  $B5: {
     %13:ptr<uniform, mat3x2<f32>, read> = access %buffer, 1u
     %14:mat3x2<f32> = load %13
     %15:vec2<f32> = access %14, 0u
     ret %15
   }
 }
-%load_vec_a = func():f32 -> %b6 {
-  %b6 = block {
+%load_vec_a = func():f32 {
+  $B6: {
     %17:ptr<uniform, vec4<f32>, read> = access %buffer, 0u, 1u
     %18:vec4<f32> = load %17
     %19:f32 = access %18, 1u
     ret %19
   }
 }
-%load_vec_b = func():f32 -> %b7 {
-  %b7 = block {
+%load_vec_b = func():f32 {
+  $B7: {
     %21:ptr<uniform, vec2<f32>, read> = access %buffer, 1u, 1u
     %22:vec2<f32> = load %21
     %23:f32 = access %22, 1u
     ret %23
   }
 }
-%lve_a = func():f32 -> %b8 {
-  %b8 = block {
+%lve_a = func():f32 {
+  $B8: {
     %25:ptr<uniform, vec4<f32>, read> = access %buffer, 0u, 1u
     %26:f32 = load_vector_element %25, 1u
     ret %26
   }
 }
-%lve_b = func():f32 -> %b9 {
-  %b9 = block {
+%lve_b = func():f32 {
+  $B9: {
     %28:ptr<uniform, vec2<f32>, read> = access %buffer, 1u, 1u
     %29:f32 = load_vector_element %28, 1u
     ret %29
@@ -1658,36 +1658,36 @@
   b_col2:vec2<f32> @offset(80)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%load_struct_a = func():mat4x4<f32> -> %b2 {
-  %b2 = block {
+%load_struct_a = func():mat4x4<f32> {
+  $B2: {
     %3:MyStruct_std140 = load %buffer
     %4:MyStruct = call %convert_MyStruct, %3
     %6:mat4x4<f32> = access %4, 0u
     ret %6
   }
 }
-%load_struct_b = func():mat3x2<f32> -> %b3 {
-  %b3 = block {
+%load_struct_b = func():mat3x2<f32> {
+  $B3: {
     %8:MyStruct_std140 = load %buffer
     %9:MyStruct = call %convert_MyStruct, %8
     %10:mat3x2<f32> = access %9, 1u
     ret %10
   }
 }
-%load_mat_a = func():vec4<f32> -> %b4 {
-  %b4 = block {
+%load_mat_a = func():vec4<f32> {
+  $B4: {
     %12:ptr<uniform, mat4x4<f32>, read> = access %buffer, 0u
     %13:mat4x4<f32> = load %12
     %14:vec4<f32> = access %13, 0u
     ret %14
   }
 }
-%load_mat_b = func():vec2<f32> -> %b5 {
-  %b5 = block {
+%load_mat_b = func():vec2<f32> {
+  $B5: {
     %16:ptr<uniform, vec2<f32>, read> = access %buffer, 1u
     %17:vec2<f32> = load %16
     %18:ptr<uniform, vec2<f32>, read> = access %buffer, 2u
@@ -1699,16 +1699,16 @@
     ret %23
   }
 }
-%load_vec_a = func():f32 -> %b6 {
-  %b6 = block {
+%load_vec_a = func():f32 {
+  $B6: {
     %25:ptr<uniform, vec4<f32>, read> = access %buffer, 0u, 1u
     %26:vec4<f32> = load %25
     %27:f32 = access %26, 1u
     ret %27
   }
 }
-%load_vec_b = func():f32 -> %b7 {
-  %b7 = block {
+%load_vec_b = func():f32 {
+  $B7: {
     %29:ptr<uniform, vec2<f32>, read> = access %buffer, 1u
     %30:vec2<f32> = load %29
     %31:ptr<uniform, vec2<f32>, read> = access %buffer, 2u
@@ -1721,15 +1721,15 @@
     ret %37
   }
 }
-%lve_a = func():f32 -> %b8 {
-  %b8 = block {
+%lve_a = func():f32 {
+  $B8: {
     %39:ptr<uniform, vec4<f32>, read> = access %buffer, 0u, 1u
     %40:f32 = load_vector_element %39, 1u
     ret %40
   }
 }
-%lve_b = func():f32 -> %b9 {
-  %b9 = block {
+%lve_b = func():f32 {
+  $B9: {
     %42:ptr<uniform, vec2<f32>, read> = access %buffer, 1u
     %43:vec2<f32> = load %42
     %44:ptr<uniform, vec2<f32>, read> = access %buffer, 2u
@@ -1742,8 +1742,8 @@
     ret %50
   }
 }
-%convert_MyStruct = func(%input:MyStruct_std140):MyStruct -> %b10 {
-  %b10 = block {
+%convert_MyStruct = func(%input:MyStruct_std140):MyStruct {
+  $B10: {
     %52:mat4x4<f32> = access %input, 0u
     %53:vec2<f32> = access %input, 1u
     %54:vec2<f32> = access %input, 2u
@@ -1792,12 +1792,12 @@
   d:mat4x4<f16> @offset(56)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:MyStruct = load %buffer
     %struct:MyStruct = let %3
     %5:ptr<uniform, mat4x4<f16>, read> = access %buffer, 3u
@@ -1838,12 +1838,12 @@
   d_col3:vec4<f16> @offset(80)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %buffer:ptr<uniform, MyStruct_std140, read> = var @binding_point(0, 0)
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
+%foo = func():void {
+  $B2: {
     %3:MyStruct_std140 = load %buffer
     %4:MyStruct = call %convert_MyStruct, %3
     %struct:MyStruct = let %4
@@ -1879,8 +1879,8 @@
     ret
   }
 }
-%convert_MyStruct = func(%input:MyStruct_std140):MyStruct -> %b3 {
-  %b3 = block {
+%convert_MyStruct = func(%input:MyStruct_std140):MyStruct {
+  $B3: {
     %37:vec2<f16> = access %input, 0u
     %38:vec2<f16> = access %input, 1u
     %39:mat2x2<f16> = construct %37, %38
diff --git a/src/tint/lang/core/ir/transform/value_to_let_test.cc b/src/tint/lang/core/ir/transform/value_to_let_test.cc
index 91e04d9..46e1c12 100644
--- a/src/tint/lang/core/ir/transform/value_to_let_test.cc
+++ b/src/tint/lang/core/ir/transform/value_to_let_test.cc
@@ -53,8 +53,8 @@
     b.Append(func->Block(), [&] { b.Return(func); });
 
     auto* src = R"(
-%F = func():void -> %b1 {
-  %b1 = block {
+%F = func():void {
+  $B1: {
     ret
   }
 }
@@ -78,8 +78,8 @@
     });
 
     auto* src = R"(
-%F = func():i32 -> %b1 {
-  %b1 = block {
+%F = func():i32 {
+  $B1: {
     %x:i32 = let 1i
     %y:i32 = let 2i
     %4:i32 = add %x, %y
@@ -118,12 +118,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %i:ptr<private, i32, read_write> = var
 }
 
-%rmw = func(%p:i32):i32 -> %b2 {
-  %b2 = block {
+%rmw = func(%p:i32):i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, %p
     %v:i32 = let %5
@@ -131,8 +131,8 @@
     ret %v
   }
 }
-%F = func():i32 -> %b3 {
-  %b3 = block {
+%F = func():i32 {
+  $B3: {
     %x:i32 = call %rmw, 1i
     %y:i32 = select 2i, %x, false
     ret %y
@@ -170,12 +170,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %i:ptr<private, i32, read_write> = var
 }
 
-%rmw = func(%p:i32):i32 -> %b2 {
-  %b2 = block {
+%rmw = func(%p:i32):i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, %p
     %v:i32 = let %5
@@ -183,8 +183,8 @@
     ret %v
   }
 }
-%F = func():i32 -> %b3 {
-  %b3 = block {
+%F = func():i32 {
+  $B3: {
     %x:i32 = call %rmw, 1i
     %y:i32 = call %rmw, %x
     %z:i32 = call %rmw, %y
@@ -223,12 +223,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %i:ptr<private, i32, read_write> = var
 }
 
-%rmw = func(%p:i32):i32 -> %b2 {
-  %b2 = block {
+%rmw = func(%p:i32):i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, %p
     %v:i32 = let %5
@@ -236,8 +236,8 @@
     ret %v
   }
 }
-%F = func():i32 -> %b3 {
-  %b3 = block {
+%F = func():i32 {
+  $B3: {
     %8:i32 = call %rmw, 1i
     %x:i32 = let %8
     %y:i32 = add %x, %x
@@ -269,14 +269,14 @@
     });
 
     auto* src = R"(
-%g = func(%p:ptr<function, i32, read_write>):i32 -> %b1 {
-  %b1 = block {
+%g = func(%p:ptr<function, i32, read_write>):i32 {
+  $B1: {
     %3:i32 = load %p
     ret %3
   }
 }
-%F = func():i32 -> %b2 {
-  %b2 = block {
+%F = func():i32 {
+  $B2: {
     %v:ptr<function, i32, read_write> = var
     %6:i32 = call %g, %v
     %x:i32 = let %6
@@ -305,8 +305,8 @@
     });
 
     auto* src = R"(
-%F = func():i32 -> %b1 {
-  %b1 = block {
+%F = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
     %l:i32 = load %v
     %4:i32 = add %l, %l
@@ -317,8 +317,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%F = func():i32 -> %b1 {
-  %b1 = block {
+%F = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
     %3:i32 = load %v
     %l:i32 = let %3
@@ -343,8 +343,8 @@
     });
 
     auto* src = R"(
-%F = func():i32 -> %b1 {
-  %b1 = block {
+%F = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
     %l:i32 = load %v
     store %v, 1i
@@ -355,8 +355,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%F = func():i32 -> %b1 {
-  %b1 = block {
+%F = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
     %3:i32 = load %v
     %l:i32 = let %3
@@ -393,12 +393,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %i:ptr<private, i32, read_write> = var
 }
 
-%rmw = func(%p:i32):i32 -> %b2 {
-  %b2 = block {
+%rmw = func(%p:i32):i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, %p
     %v:i32 = let %5
@@ -406,8 +406,8 @@
     ret %v
   }
 }
-%F = func():i32 -> %b3 {
-  %b3 = block {
+%F = func():i32 {
+  $B3: {
     %x:i32 = call %rmw, 1i
     %y:i32 = call %rmw, 2i
     %z:i32 = add %x, %y
@@ -418,12 +418,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %i:ptr<private, i32, read_write> = var
 }
 
-%rmw = func(%p:i32):i32 -> %b2 {
-  %b2 = block {
+%rmw = func(%p:i32):i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, %p
     %v:i32 = let %5
@@ -431,8 +431,8 @@
     ret %v
   }
 }
-%F = func():i32 -> %b3 {
-  %b3 = block {
+%F = func():i32 {
+  $B3: {
     %8:i32 = call %rmw, 1i
     %x:i32 = let %8
     %y:i32 = call %rmw, 2i
@@ -475,12 +475,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %i:ptr<private, i32, read_write> = var
 }
 
-%rmw = func(%p:i32):i32 -> %b2 {
-  %b2 = block {
+%rmw = func(%p:i32):i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, %p
     %v:i32 = let %5
@@ -488,11 +488,11 @@
     ret %v
   }
 }
-%F = func():i32 -> %b3 {
-  %b3 = block {
+%F = func():i32 {
+  $B3: {
     %x:i32 = call %rmw, 1i
-    if true [t: %b4] {  # if_1
-      %b4 = block {  # true
+    if true [t: $B4] {  # if_1
+      $B4: {  # true
         ret %x
       }
     }
@@ -503,12 +503,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %i:ptr<private, i32, read_write> = var
 }
 
-%rmw = func(%p:i32):i32 -> %b2 {
-  %b2 = block {
+%rmw = func(%p:i32):i32 {
+  $B2: {
     %4:i32 = load %i
     %5:i32 = add %4, %p
     %v:i32 = let %5
@@ -516,12 +516,12 @@
     ret %v
   }
 }
-%F = func():i32 -> %b3 {
-  %b3 = block {
+%F = func():i32 {
+  $B3: {
     %8:i32 = call %rmw, 1i
     %x:i32 = let %8
-    if true [t: %b4] {  # if_1
-      %b4 = block {  # true
+    if true [t: $B4] {  # if_1
+      $B4: {  # true
         ret %x
       }
     }
@@ -550,8 +550,8 @@
     });
 
     auto* src = R"(
-%F = func():i32 -> %b1 {
-  %b1 = block {
+%F = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
     %3:i32 = load %v
     %4:i32 = add %3, 1i
@@ -563,8 +563,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%F = func():i32 -> %b1 {
-  %b1 = block {
+%F = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
     %3:i32 = load %v
     %4:i32 = add %3, 1i
@@ -597,8 +597,8 @@
     });
 
     auto* src = R"(
-%F = func():void -> %b1 {
-  %b1 = block {
+%F = func():void {
+  $B1: {
     %i:i32 = max 1i, 2i
     %v:ptr<function, i32, read_write> = var, %i
     %x:i32 = max 3i, 4i
@@ -612,8 +612,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%F = func():void -> %b1 {
-  %b1 = block {
+%F = func():void {
+  $B1: {
     %i:i32 = max 1i, 2i
     %v:ptr<function, i32, read_write> = var, %i
     %x:i32 = max 3i, 4i
diff --git a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_test.cc b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_test.cc
index 826ba54..7bca08f 100644
--- a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_test.cc
+++ b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_test.cc
@@ -49,8 +49,8 @@
     });
 
     auto* src = R"(
-%foo = func():mat3x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func():mat3x3<f32> {
+  $B1: {
     %2:mat3x3<f32> = construct
     ret %2
   }
@@ -76,8 +76,8 @@
     });
 
     auto* src = R"(
-%foo = func(%value:mat3x3<f32>):mat3x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%value:mat3x3<f32>):mat3x3<f32> {
+  $B1: {
     %3:mat3x3<f32> = construct %value
     ret %3
   }
@@ -105,8 +105,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:vec3<f32>, %v2:vec3<f32>, %v3:vec3<f32>):mat3x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:vec3<f32>, %v2:vec3<f32>, %v3:vec3<f32>):mat3x3<f32> {
+  $B1: {
     %5:mat3x3<f32> = construct %v1, %v2, %v3
     ret %5
   }
@@ -135,8 +135,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32):mat2x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32):mat2x2<f32> {
+  $B1: {
     %6:mat2x2<f32> = construct %v1, %v2, %v3, %v4
     ret %6
   }
@@ -145,8 +145,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32):mat2x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32):mat2x2<f32> {
+  $B1: {
     %6:vec2<f32> = construct %v1, %v2
     %7:vec2<f32> = construct %v3, %v4
     %8:mat2x2<f32> = construct %6, %7
@@ -176,8 +176,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat2x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat2x3<f32> {
+  $B1: {
     %8:mat2x3<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6
     ret %8
   }
@@ -186,8 +186,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat2x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat2x3<f32> {
+  $B1: {
     %8:vec3<f32> = construct %v1, %v2, %v3
     %9:vec3<f32> = construct %v4, %v5, %v6
     %10:mat2x3<f32> = construct %8, %9
@@ -219,8 +219,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat2x4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat2x4<f32> {
+  $B1: {
     %10:mat2x4<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6, %v7, %v8
     ret %10
   }
@@ -229,8 +229,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat2x4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat2x4<f32> {
+  $B1: {
     %10:vec4<f32> = construct %v1, %v2, %v3, %v4
     %11:vec4<f32> = construct %v5, %v6, %v7, %v8
     %12:mat2x4<f32> = construct %10, %11
@@ -260,8 +260,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat3x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat3x2<f32> {
+  $B1: {
     %8:mat3x2<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6
     ret %8
   }
@@ -270,8 +270,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat3x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32):mat3x2<f32> {
+  $B1: {
     %8:vec2<f32> = construct %v1, %v2
     %9:vec2<f32> = construct %v3, %v4
     %10:vec2<f32> = construct %v5, %v6
@@ -305,8 +305,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32):mat3x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32):mat3x3<f32> {
+  $B1: {
     %11:mat3x3<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6, %v7, %v8, %v9
     ret %11
   }
@@ -315,8 +315,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32):mat3x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32):mat3x3<f32> {
+  $B1: {
     %11:vec3<f32> = construct %v1, %v2, %v3
     %12:vec3<f32> = construct %v4, %v5, %v6
     %13:vec3<f32> = construct %v7, %v8, %v9
@@ -353,8 +353,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat3x4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat3x4<f32> {
+  $B1: {
     %14:mat3x4<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6, %v7, %v8, %v9, %v10, %v11, %v12
     ret %14
   }
@@ -363,8 +363,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat3x4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat3x4<f32> {
+  $B1: {
     %14:vec4<f32> = construct %v1, %v2, %v3, %v4
     %15:vec4<f32> = construct %v5, %v6, %v7, %v8
     %16:vec4<f32> = construct %v9, %v10, %v11, %v12
@@ -397,8 +397,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat4x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat4x2<f32> {
+  $B1: {
     %10:mat4x2<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6, %v7, %v8
     ret %10
   }
@@ -407,8 +407,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat4x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32):mat4x2<f32> {
+  $B1: {
     %10:vec2<f32> = construct %v1, %v2
     %11:vec2<f32> = construct %v3, %v4
     %12:vec2<f32> = construct %v5, %v6
@@ -446,8 +446,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat4x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat4x3<f32> {
+  $B1: {
     %14:mat4x3<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6, %v7, %v8, %v9, %v10, %v11, %v12
     ret %14
   }
@@ -456,8 +456,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat4x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32):mat4x3<f32> {
+  $B1: {
     %14:vec3<f32> = construct %v1, %v2, %v3
     %15:vec3<f32> = construct %v4, %v5, %v6
     %16:vec3<f32> = construct %v7, %v8, %v9
@@ -500,8 +500,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32, %v13:f32, %v14:f32, %v15:f32, %v16:f32):mat4x4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32, %v13:f32, %v14:f32, %v15:f32, %v16:f32):mat4x4<f32> {
+  $B1: {
     %18:mat4x4<f32> = construct %v1, %v2, %v3, %v4, %v5, %v6, %v7, %v8, %v9, %v10, %v11, %v12, %v13, %v14, %v15, %v16
     ret %18
   }
@@ -510,8 +510,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32, %v13:f32, %v14:f32, %v15:f32, %v16:f32):mat4x4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f32, %v2:f32, %v3:f32, %v4:f32, %v5:f32, %v6:f32, %v7:f32, %v8:f32, %v9:f32, %v10:f32, %v11:f32, %v12:f32, %v13:f32, %v14:f32, %v15:f32, %v16:f32):mat4x4<f32> {
+  $B1: {
     %18:vec4<f32> = construct %v1, %v2, %v3, %v4
     %19:vec4<f32> = construct %v5, %v6, %v7, %v8
     %20:vec4<f32> = construct %v9, %v10, %v11, %v12
@@ -546,8 +546,8 @@
     });
 
     auto* src = R"(
-%foo = func(%v1:f16, %v2:f16, %v3:f16, %v4:f16, %v5:f16, %v6:f16, %v7:f16, %v8:f16, %v9:f16):mat3x3<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f16, %v2:f16, %v3:f16, %v4:f16, %v5:f16, %v6:f16, %v7:f16, %v8:f16, %v9:f16):mat3x3<f16> {
+  $B1: {
     %11:mat3x3<f16> = construct %v1, %v2, %v3, %v4, %v5, %v6, %v7, %v8, %v9
     ret %11
   }
@@ -556,8 +556,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%v1:f16, %v2:f16, %v3:f16, %v4:f16, %v5:f16, %v6:f16, %v7:f16, %v8:f16, %v9:f16):mat3x3<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%v1:f16, %v2:f16, %v3:f16, %v4:f16, %v5:f16, %v6:f16, %v7:f16, %v8:f16, %v9:f16):mat3x3<f16> {
+  $B1: {
     %11:vec3<f16> = construct %v1, %v2, %v3
     %12:vec3<f16> = construct %v4, %v5, %v6
     %13:vec3<f16> = construct %v7, %v8, %v9
diff --git a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_test.cc b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_test.cc
index 37ba499..0e9c0b1 100644
--- a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_test.cc
+++ b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_test.cc
@@ -62,8 +62,8 @@
     });
 
     auto* expect = R"(
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     ret
   }
 }
@@ -83,12 +83,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, i32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     ret
   }
 }
@@ -112,12 +112,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:bool = load %wgvar
     ret
   }
@@ -126,15 +126,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, false
         exit_if  # if_1
       }
@@ -161,12 +161,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, i32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:i32 = load %wgvar
     ret
   }
@@ -175,15 +175,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, i32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, 0i
         exit_if  # if_1
       }
@@ -210,12 +210,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, u32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %wgvar
     ret
   }
@@ -224,15 +224,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, u32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, 0u
         exit_if  # if_1
       }
@@ -259,12 +259,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, f32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:f32 = load %wgvar
     ret
   }
@@ -273,15 +273,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, f32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, 0.0f
         exit_if  # if_1
       }
@@ -308,12 +308,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, f16, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:f16 = load %wgvar
     ret
   }
@@ -322,15 +322,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, f16, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, 0.0h
         exit_if  # if_1
       }
@@ -357,12 +357,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:i32 = atomicLoad %wgvar
     ret
   }
@@ -371,15 +371,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         %5:void = atomicStore %wgvar, 0i
         exit_if  # if_1
       }
@@ -406,12 +406,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, atomic<u32>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = atomicLoad %wgvar
     ret
   }
@@ -420,15 +420,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, atomic<u32>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         %5:void = atomicStore %wgvar, 0u
         exit_if  # if_1
       }
@@ -455,12 +455,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<i32, 4>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(11, 2, 3) func():void {
+  $B2: {
     %3:array<i32, 4> = load %wgvar
     ret
   }
@@ -469,30 +469,30 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<i32, 4>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 %tint_local_index
+%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration %tint_local_index  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %5:bool = gte %idx:u32, 4u
-        if %5 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %5 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
         %6:ptr<workgroup, i32, read_write> = access %wgvar, %idx:u32
         store %6, 0i
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %7:u32 = add %idx:u32, 66u
-        next_iteration %b4 %7
+        next_iteration %7  # -> $B4
       }
     }
     %8:void = workgroupBarrier
@@ -517,12 +517,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<u32, 5>, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(11, 2, 3) func():void {
+  $B2: {
     %3:array<array<u32, 5>, 7> = load %wgvar
     ret
   }
@@ -531,20 +531,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<u32, 5>, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 %tint_local_index
+%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration %tint_local_index  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %5:bool = gte %idx:u32, 35u
-        if %5 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %5 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -552,11 +552,11 @@
         %7:u32 = div %idx:u32, 5u
         %8:ptr<workgroup, u32, read_write> = access %wgvar, %7, %6
         store %8, 0u
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %9:u32 = add %idx:u32, 66u
-        next_iteration %b4 %9
+        next_iteration %9  # -> $B4
       }
     }
     %10:void = workgroupBarrier
@@ -581,12 +581,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 7>, 5>, 3>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:array<array<array<i32, 7>, 5>, 3> = load %wgvar
     ret
   }
@@ -595,20 +595,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 7>, 5>, 3>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 %tint_local_index
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration %tint_local_index  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %5:bool = gte %idx:u32, 105u
-        if %5 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %5 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -618,11 +618,11 @@
         %9:u32 = div %idx:u32, 35u
         %10:ptr<workgroup, i32, read_write> = access %wgvar, %9, %8, %6
         store %10, 0i
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %11:u32 = add %idx:u32, 1u
-        next_iteration %b4 %11
+        next_iteration %11  # -> $B4
       }
     }
     %12:void = workgroupBarrier
@@ -647,12 +647,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 1>, 5>, 3>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:array<array<array<i32, 1>, 5>, 3> = load %wgvar
     ret
   }
@@ -661,20 +661,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 1>, 5>, 3>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 %tint_local_index
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration %tint_local_index  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %5:bool = gte %idx:u32, 15u
-        if %5 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %5 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -682,11 +682,11 @@
         %7:u32 = div %idx:u32, 5u
         %8:ptr<workgroup, i32, read_write> = access %wgvar, %7, %6, 0u
         store %8, 0i
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %9:u32 = add %idx:u32, 1u
-        next_iteration %b4 %9
+        next_iteration %9  # -> $B4
       }
     }
     %10:void = workgroupBarrier
@@ -711,12 +711,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 3>, 1>, 5>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:array<array<array<i32, 3>, 1>, 5> = load %wgvar
     ret
   }
@@ -725,20 +725,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 3>, 1>, 5>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 %tint_local_index
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration %tint_local_index  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %5:bool = gte %idx:u32, 15u
-        if %5 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %5 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -746,11 +746,11 @@
         %7:u32 = div %idx:u32, 3u
         %8:ptr<workgroup, i32, read_write> = access %wgvar, %7, 0u, %6
         store %8, 0i
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %9:u32 = add %idx:u32, 1u
-        next_iteration %b4 %9
+        next_iteration %9  # -> $B4
       }
     }
     %10:void = workgroupBarrier
@@ -775,12 +775,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 3>, 5>, 1>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:array<array<array<i32, 3>, 5>, 1> = load %wgvar
     ret
   }
@@ -789,20 +789,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<array<i32, 3>, 5>, 1>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 %tint_local_index
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration %tint_local_index  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %5:bool = gte %idx:u32, 15u
-        if %5 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %5 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -810,11 +810,11 @@
         %7:u32 = div %idx:u32, 3u
         %8:ptr<workgroup, i32, read_write> = access %wgvar, 0u, %7, %6
         store %8, 0i
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %9:u32 = add %idx:u32, 1u
-        next_iteration %b4 %9
+        next_iteration %9  # -> $B4
       }
     }
     %10:void = workgroupBarrier
@@ -839,12 +839,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<i32, 1>, 1>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:array<array<i32, 1>, 1> = load %wgvar
     ret
   }
@@ -853,15 +853,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<array<i32, 1>, 1>, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         %5:ptr<workgroup, i32, read_write> = access %wgvar, 0u, 0u
         store %5, 0i
         exit_if  # if_1
@@ -900,12 +900,12 @@
   c:f32 @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, MyStruct, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:MyStruct = load %wgvar
     ret
   }
@@ -920,15 +920,15 @@
   c:f32 @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, MyStruct, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, MyStruct(0i, 0u, 0.0f)
         exit_if  # if_1
       }
@@ -975,12 +975,12 @@
   d:bool @offset(12)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, Outer, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:Outer = load %wgvar
     ret
   }
@@ -1000,15 +1000,15 @@
   d:bool @offset(12)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, Outer, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, Outer(0.0f, Inner(0i, 0u), false)
         exit_if  # if_1
       }
@@ -1055,12 +1055,12 @@
   d:bool @offset(12)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, Outer, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:Outer = load %wgvar
     ret
   }
@@ -1080,15 +1080,15 @@
   d:bool @offset(12)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, Outer, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         %5:ptr<workgroup, f32, read_write> = access %wgvar, 0u
         store %5, 0.0f
         %6:ptr<workgroup, i32, read_write> = access %wgvar, 1u, 0u
@@ -1143,12 +1143,12 @@
   d:bool @offset(108)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<Outer, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(7, 3, 2) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(7, 3, 2) func():void {
+  $B2: {
     %3:array<Outer, 7> = load %wgvar
     ret
   }
@@ -1168,20 +1168,20 @@
   d:bool @offset(108)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, array<Outer, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(7, 3, 2) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
-    loop [i: %b3, b: %b4, c: %b5] {  # loop_1
-      %b3 = block {  # initializer
-        next_iteration %b4 %tint_local_index
+%main = @compute @workgroup_size(7, 3, 2) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
+    loop [i: $B3, b: $B4, c: $B5] {  # loop_1
+      $B3: {  # initializer
+        next_iteration %tint_local_index  # -> $B4
       }
-      %b4 = block (%idx:u32) {  # body
+      $B4 (%idx:u32): {  # body
         %5:bool = gte %idx:u32, 7u
-        if %5 [t: %b6] {  # if_1
-          %b6 = block {  # true
+        if %5 [t: $B6] {  # if_1
+          $B6: {  # true
             exit_loop  # loop_1
           }
         }
@@ -1189,21 +1189,21 @@
         store %6, 0.0f
         %7:ptr<workgroup, bool, read_write> = access %wgvar, %idx:u32, 2u
         store %7, false
-        continue %b5
+        continue  # -> $B5
       }
-      %b5 = block {  # continuing
+      $B5: {  # continuing
         %8:u32 = add %idx:u32, 42u
-        next_iteration %b4 %8
+        next_iteration %8  # -> $B4
       }
     }
-    loop [i: %b7, b: %b8, c: %b9] {  # loop_2
-      %b7 = block {  # initializer
-        next_iteration %b8 %tint_local_index
+    loop [i: $B7, b: $B8, c: $B9] {  # loop_2
+      $B7: {  # initializer
+        next_iteration %tint_local_index  # -> $B8
       }
-      %b8 = block (%idx_1:u32) {  # body
+      $B8 (%idx_1:u32): {  # body
         %10:bool = gte %idx_1:u32, 91u
-        if %10 [t: %b10] {  # if_2
-          %b10 = block {  # true
+        if %10 [t: $B10] {  # if_2
+          $B10: {  # true
             exit_loop  # loop_2
           }
         }
@@ -1215,11 +1215,11 @@
         %15:u32 = div %idx_1:u32, 13u
         %16:ptr<workgroup, atomic<u32>, read_write> = access %wgvar, %15, 1u, %14, 1u
         %17:void = atomicStore %16, 0u
-        continue %b9
+        continue  # -> $B9
       }
-      %b9 = block {  # continuing
+      $B9: {  # continuing
         %18:u32 = add %idx_1:u32, 42u
-        next_iteration %b8 %18
+        next_iteration %18  # -> $B8
       }
     }
     %19:void = workgroupBarrier
@@ -1248,14 +1248,14 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var_a:ptr<workgroup, bool, read_write> = var
   %var_b:ptr<workgroup, array<i32, 4>, read_write> = var
   %var_c:ptr<workgroup, array<array<u32, 5>, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(11, 2, 3) func():void {
+  $B2: {
     %5:bool = load %var_a
     %6:array<i32, 4> = load %var_b
     %7:array<array<u32, 5>, 7> = load %var_c
@@ -1266,49 +1266,49 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var_a:ptr<workgroup, bool, read_write> = var
   %var_b:ptr<workgroup, array<i32, 4>, read_write> = var
   %var_c:ptr<workgroup, array<array<u32, 5>, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %6:bool = eq %tint_local_index, 0u
-    if %6 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %6 [t: $B3] {  # if_1
+      $B3: {  # true
         store %var_a, false
         exit_if  # if_1
       }
     }
-    loop [i: %b4, b: %b5, c: %b6] {  # loop_1
-      %b4 = block {  # initializer
-        next_iteration %b5 %tint_local_index
+    loop [i: $B4, b: $B5, c: $B6] {  # loop_1
+      $B4: {  # initializer
+        next_iteration %tint_local_index  # -> $B5
       }
-      %b5 = block (%idx:u32) {  # body
+      $B5 (%idx:u32): {  # body
         %8:bool = gte %idx:u32, 4u
-        if %8 [t: %b7] {  # if_2
-          %b7 = block {  # true
+        if %8 [t: $B7] {  # if_2
+          $B7: {  # true
             exit_loop  # loop_1
           }
         }
         %9:ptr<workgroup, i32, read_write> = access %var_b, %idx:u32
         store %9, 0i
-        continue %b6
+        continue  # -> $B6
       }
-      %b6 = block {  # continuing
+      $B6: {  # continuing
         %10:u32 = add %idx:u32, 66u
-        next_iteration %b5 %10
+        next_iteration %10  # -> $B5
       }
     }
-    loop [i: %b8, b: %b9, c: %b10] {  # loop_2
-      %b8 = block {  # initializer
-        next_iteration %b9 %tint_local_index
+    loop [i: $B8, b: $B9, c: $B10] {  # loop_2
+      $B8: {  # initializer
+        next_iteration %tint_local_index  # -> $B9
       }
-      %b9 = block (%idx_1:u32) {  # body
+      $B9 (%idx_1:u32): {  # body
         %12:bool = gte %idx_1:u32, 35u
-        if %12 [t: %b11] {  # if_3
-          %b11 = block {  # true
+        if %12 [t: $B11] {  # if_3
+          $B11: {  # true
             exit_loop  # loop_2
           }
         }
@@ -1316,11 +1316,11 @@
         %14:u32 = div %idx_1:u32, 5u
         %15:ptr<workgroup, u32, read_write> = access %var_c, %14, %13
         store %15, 0u
-        continue %b10
+        continue  # -> $B10
       }
-      %b10 = block {  # continuing
+      $B10: {  # continuing
         %16:u32 = add %idx_1:u32, 66u
-        next_iteration %b9 %16
+        next_iteration %16  # -> $B9
       }
     }
     %17:void = workgroupBarrier
@@ -1353,15 +1353,15 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var_a:ptr<workgroup, bool, read_write> = var
   %var_b:ptr<workgroup, i32, read_write> = var
   %var_c:ptr<workgroup, array<i32, 42>, read_write> = var
   %var_d:ptr<workgroup, array<array<u32, 6>, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(11, 2, 3) func():void {
+  $B2: {
     %6:bool = load %var_a
     %7:i32 = load %var_b
     %8:array<i32, 42> = load %var_c
@@ -1373,31 +1373,31 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var_a:ptr<workgroup, bool, read_write> = var
   %var_b:ptr<workgroup, i32, read_write> = var
   %var_c:ptr<workgroup, array<i32, 42>, read_write> = var
   %var_d:ptr<workgroup, array<array<u32, 6>, 7>, read_write> = var
 }
 
-%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(11, 2, 3) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %7:bool = eq %tint_local_index, 0u
-    if %7 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %7 [t: $B3] {  # if_1
+      $B3: {  # true
         store %var_a, false
         store %var_b, 0i
         exit_if  # if_1
       }
     }
-    loop [i: %b4, b: %b5, c: %b6] {  # loop_1
-      %b4 = block {  # initializer
-        next_iteration %b5 %tint_local_index
+    loop [i: $B4, b: $B5, c: $B6] {  # loop_1
+      $B4: {  # initializer
+        next_iteration %tint_local_index  # -> $B5
       }
-      %b5 = block (%idx:u32) {  # body
+      $B5 (%idx:u32): {  # body
         %9:bool = gte %idx:u32, 42u
-        if %9 [t: %b7] {  # if_2
-          %b7 = block {  # true
+        if %9 [t: $B7] {  # if_2
+          $B7: {  # true
             exit_loop  # loop_1
           }
         }
@@ -1407,11 +1407,11 @@
         %12:u32 = div %idx:u32, 6u
         %13:ptr<workgroup, u32, read_write> = access %var_d, %12, %11
         store %13, 0u
-        continue %b6
+        continue  # -> $B6
       }
-      %b6 = block {  # continuing
+      $B6: {  # continuing
         %14:u32 = add %idx:u32, 66u
-        next_iteration %b5 %14
+        next_iteration %14  # -> $B5
       }
     }
     %15:void = workgroupBarrier
@@ -1444,12 +1444,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%global_id:vec4<u32> [@global_invocation_id], %index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%global_id:vec4<u32> [@global_invocation_id], %index:u32 [@local_invocation_index]):void {
+  $B2: {
     %5:bool = load %wgvar
     ret
   }
@@ -1458,15 +1458,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%global_id:vec4<u32> [@global_invocation_id], %index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%global_id:vec4<u32> [@global_invocation_id], %index:u32 [@local_invocation_index]):void {
+  $B2: {
     %5:bool = eq %index, 0u
-    if %5 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %5 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, false
         exit_if  # if_1
       }
@@ -1526,12 +1526,12 @@
   index:u32 @offset(12), @builtin(local_invocation_index)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%params:MyStruct):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%params:MyStruct):void {
+  $B2: {
     %4:bool = load %wgvar
     ret
   }
@@ -1545,16 +1545,16 @@
   index:u32 @offset(12), @builtin(local_invocation_index)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%params:MyStruct):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%params:MyStruct):void {
+  $B2: {
     %4:u32 = access %params, 1u
     %5:bool = eq %4, 0u
-    if %5 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %5 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, false
         exit_if  # if_1
       }
@@ -1597,23 +1597,23 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
-    if true [t: %b3] {  # if_1
-      %b3 = block {  # true
-        switch 42i [c: (default, %b4)] {  # switch_1
-          %b4 = block {  # case
-            loop [b: %b5, c: %b6] {  # loop_1
-              %b5 = block {  # body
-                continue %b6
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
+    if true [t: $B3] {  # if_1
+      $B3: {  # true
+        switch 42i [c: (default, $B4)] {  # switch_1
+          $B4: {  # case
+            loop [b: $B5, c: $B6] {  # loop_1
+              $B5: {  # body
+                continue  # -> $B6
               }
-              %b6 = block {  # continuing
+              $B6: {  # continuing
                 %3:bool = load %wgvar
-                break_if %3 %b5
+                break_if %3  # -> [t: exit_loop loop_1, f: $B5]
               }
             }
             exit_switch  # switch_1
@@ -1629,31 +1629,31 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B2: {
     %4:bool = eq %tint_local_index, 0u
-    if %4 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_1
+      $B3: {  # true
         store %wgvar, false
         exit_if  # if_1
       }
     }
     %5:void = workgroupBarrier
-    if true [t: %b4] {  # if_2
-      %b4 = block {  # true
-        switch 42i [c: (default, %b5)] {  # switch_1
-          %b5 = block {  # case
-            loop [b: %b6, c: %b7] {  # loop_1
-              %b6 = block {  # body
-                continue %b7
+    if true [t: $B4] {  # if_2
+      $B4: {  # true
+        switch 42i [c: (default, $B5)] {  # switch_1
+          $B5: {  # case
+            loop [b: $B6, c: $B7] {  # loop_1
+              $B6: {  # body
+                continue  # -> $B7
               }
-              %b7 = block {  # continuing
+              $B7: {  # continuing
                 %6:bool = load %wgvar
-                break_if %6 %b6
+                break_if %6  # -> [t: exit_loop loop_1, f: $B6]
               }
             }
             exit_switch  # switch_1
@@ -1721,28 +1721,28 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        continue %b4
+%foo = func():void {
+  $B2: {
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %3:bool = load %wgvar
-        break_if %3 %b3
+        break_if %3  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret
   }
 }
-%foo_1 = func():void -> %b5 {  # %foo_1: 'foo'
-  %b5 = block {
-    if true [t: %b6] {  # if_1
-      %b6 = block {  # true
+%foo_1 = func():void {  # %foo_1: 'foo'
+  $B5: {
+    if true [t: $B6] {  # if_1
+      $B6: {  # true
         %5:void = call %foo
         exit_if  # if_1
       }
@@ -1750,19 +1750,19 @@
     ret
   }
 }
-%func = @compute @workgroup_size(1, 1, 1) func():void -> %b7 {
-  %b7 = block {
-    if true [t: %b8] {  # if_2
-      %b8 = block {  # true
-        switch 42i [c: (default, %b9)] {  # switch_1
-          %b9 = block {  # case
-            loop [b: %b10, c: %b11] {  # loop_2
-              %b10 = block {  # body
-                continue %b11
+%func = @compute @workgroup_size(1, 1, 1) func():void {
+  $B7: {
+    if true [t: $B8] {  # if_2
+      $B8: {  # true
+        switch 42i [c: (default, $B9)] {  # switch_1
+          $B9: {  # case
+            loop [b: $B10, c: $B11] {  # loop_2
+              $B10: {  # body
+                continue  # -> $B11
               }
-              %b11 = block {  # continuing
+              $B11: {  # continuing
                 %7:void = call %foo_1
-                break_if true %b10
+                break_if true  # -> [t: exit_loop loop_2, f: $B10]
               }
             }
             exit_switch  # switch_1
@@ -1778,28 +1778,28 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        continue %b4
+%foo = func():void {
+  $B2: {
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %3:bool = load %wgvar
-        break_if %3 %b3
+        break_if %3  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret
   }
 }
-%foo_1 = func():void -> %b5 {  # %foo_1: 'foo'
-  %b5 = block {
-    if true [t: %b6] {  # if_1
-      %b6 = block {  # true
+%foo_1 = func():void {  # %foo_1: 'foo'
+  $B5: {
+    if true [t: $B6] {  # if_1
+      $B6: {  # true
         %5:void = call %foo
         exit_if  # if_1
       }
@@ -1807,27 +1807,27 @@
     ret
   }
 }
-%func = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b7 {
-  %b7 = block {
+%func = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B7: {
     %8:bool = eq %tint_local_index, 0u
-    if %8 [t: %b8] {  # if_2
-      %b8 = block {  # true
+    if %8 [t: $B8] {  # if_2
+      $B8: {  # true
         store %wgvar, false
         exit_if  # if_2
       }
     }
     %9:void = workgroupBarrier
-    if true [t: %b9] {  # if_3
-      %b9 = block {  # true
-        switch 42i [c: (default, %b10)] {  # switch_1
-          %b10 = block {  # case
-            loop [b: %b11, c: %b12] {  # loop_2
-              %b11 = block {  # body
-                continue %b12
+    if true [t: $B9] {  # if_3
+      $B9: {  # true
+        switch 42i [c: (default, $B10)] {  # switch_1
+          $B10: {  # case
+            loop [b: $B11, c: $B12] {  # loop_2
+              $B11: {  # body
+                continue  # -> $B12
               }
-              %b12 = block {  # continuing
+              $B12: {  # continuing
                 %10:void = call %foo_1
-                break_if true %b11
+                break_if true  # -> [t: exit_loop loop_2, f: $B11]
               }
             }
             exit_switch  # switch_1
@@ -1875,32 +1875,32 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        continue %b4
+%foo = func():void {
+  $B2: {
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %3:bool = load %wgvar
-        break_if %3 %b3
+        break_if %3  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret
   }
 }
-%ep1 = @compute @workgroup_size(1, 1, 1) func():void -> %b5 {
-  %b5 = block {
+%ep1 = @compute @workgroup_size(1, 1, 1) func():void {
+  $B5: {
     %5:void = call %foo
     ret
   }
 }
-%ep2 = @compute @workgroup_size(1, 1, 1) func():void -> %b6 {
-  %b6 = block {
+%ep2 = @compute @workgroup_size(1, 1, 1) func():void {
+  $B6: {
     %7:void = call %foo
     ret
   }
@@ -1909,29 +1909,29 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, bool, read_write> = var
 }
 
-%foo = func():void -> %b2 {
-  %b2 = block {
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        continue %b4
+%foo = func():void {
+  $B2: {
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %3:bool = load %wgvar
-        break_if %3 %b3
+        break_if %3  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret
   }
 }
-%ep1 = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void -> %b5 {
-  %b5 = block {
+%ep1 = @compute @workgroup_size(1, 1, 1) func(%tint_local_index:u32 [@local_invocation_index]):void {
+  $B5: {
     %6:bool = eq %tint_local_index, 0u
-    if %6 [t: %b6] {  # if_1
-      %b6 = block {  # true
+    if %6 [t: $B6] {  # if_1
+      $B6: {  # true
         store %wgvar, false
         exit_if  # if_1
       }
@@ -1941,11 +1941,11 @@
     ret
   }
 }
-%ep2 = @compute @workgroup_size(1, 1, 1) func(%tint_local_index_1:u32 [@local_invocation_index]):void -> %b7 {  # %tint_local_index_1: 'tint_local_index'
-  %b7 = block {
+%ep2 = @compute @workgroup_size(1, 1, 1) func(%tint_local_index_1:u32 [@local_invocation_index]):void {  # %tint_local_index_1: 'tint_local_index'
+  $B7: {
     %11:bool = eq %tint_local_index_1, 0u
-    if %11 [t: %b8] {  # if_2
-      %b8 = block {  # true
+    if %11 [t: $B8] {  # if_2
+      $B8: {  # true
         store %wgvar, false
         exit_if  # if_2
       }
diff --git a/src/tint/lang/core/ir/validator_test.cc b/src/tint/lang/core/ir/validator_test.cc
index 8742f8a..16bb823 100644
--- a/src/tint/lang/core/ir/validator_test.cc
+++ b/src/tint/lang/core/ir/validator_test.cc
@@ -68,18 +68,18 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:2:3 error: loop: root block: invalid instruction: tint::core::ir::Loop
-  loop [b: %b2] {  # loop_1
+  loop [b: $B2] {  # loop_1
   ^^^^^^^^^^^^^
 
 :1:1 note: In block
-%b1 = block {  # root
-^^^^^^^^^^^
+$B1: {  # root
+^^^
 
 note: # Disassembly
-%b1 = block {  # root
-  loop [b: %b2] {  # loop_1
-    %b2 = block {  # body
-      continue %b3
+$B1: {  # root
+  loop [b: $B2] {  # loop_1
+    $B2: {  # body
+      continue  # -> $B3
     }
   }
 }
@@ -103,16 +103,16 @@
                                      ^^^
 
 :1:1 note: In block
-%b1 = block {  # root
-^^^^^^^^^^^
+$B1: {  # root
+^^^
 
 note: # Disassembly
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%f = func():void -> %b2 {
-  %b2 = block {
+%f = func():void {
+  $B2: {
     ret
   }
 }
@@ -140,17 +140,17 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:1:1 error: function 'my_func' added to module multiple times
-%my_func = func(%2:i32, %3:f32):void -> %b1 {
+%my_func = func(%2:i32, %3:f32):void {
 ^^^^^^^^
 
 note: # Disassembly
-%my_func = func(%2:i32, %3:f32):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:i32, %3:f32):void {
+  $B1: {
     ret
   }
 }
-%my_func = func(%2:i32, %3:f32):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:i32, %3:f32):void {
+  $B1: {
     ret
   }
 }
@@ -169,12 +169,12 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:1:17 error: destroyed parameter found in function parameter list
-%my_func = func(%my_param:f32):void -> %b1 {
+%my_func = func(%my_param:f32):void {
                 ^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func(%my_param:f32):void -> %b1 {
-  %b1 = block {
+%my_func = func(%my_param:f32):void {
+  $B1: {
     ret
   }
 }
@@ -193,12 +193,12 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:1:17 error: function parameter has nullptr parent function
-%my_func = func(%my_param:f32):void -> %b1 {
+%my_func = func(%my_param:f32):void {
                 ^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func(%my_param:f32):void -> %b1 {
-  %b1 = block {
+%my_func = func(%my_param:f32):void {
+  $B1: {
     ret
   }
 }
@@ -218,21 +218,21 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:1:18 error: function parameter has incorrect parent function
-%my_func1 = func(%my_param:f32):void -> %b1 {
+%my_func1 = func(%my_param:f32):void {
                  ^^^^^^^^^^^^^
 
 :6:1 note: parent function declared here
-%my_func2 = func(%my_param:f32):void -> %b2 {
+%my_func2 = func(%my_param:f32):void {
 ^^^^^^^^^
 
 note: # Disassembly
-%my_func1 = func(%my_param:f32):void -> %b1 {
-  %b1 = block {
+%my_func1 = func(%my_param:f32):void {
+  $B1: {
     ret
   }
 }
-%my_func2 = func(%my_param:f32):void -> %b2 {
-  %b2 = block {
+%my_func2 = func(%my_param:f32):void {
+  $B2: {
     ret
   }
 }
@@ -258,12 +258,12 @@
                    ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %2:void = call %g
     ret
   }
@@ -289,18 +289,18 @@
                    ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %2:void = call %g
     ret
   }
 }
-%g = @compute func():void -> %b2 {
-  %b2 = block {
+%g = @compute func():void {
+  $B2: {
     ret
   }
 }
@@ -326,17 +326,17 @@
                    ^^
 
 :7:3 note: In block
-  %b2 = block {
-  ^^^^^^^^^^^
+  $B2: {
+  ^^^
 
 note: # Disassembly
-%g = func(%2:i32, %3:i32):void -> %b1 {
-  %b1 = block {
+%g = func(%2:i32, %3:i32):void {
+  $B1: {
     ret
   }
 }
-%f = func():void -> %b2 {
-  %b2 = block {
+%f = func():void {
+  $B2: {
     %5:void = call %g, 42i
     ret
   }
@@ -363,17 +363,17 @@
                    ^^
 
 :7:3 note: In block
-  %b2 = block {
-  ^^^^^^^^^^^
+  $B2: {
+  ^^^
 
 note: # Disassembly
-%g = func(%2:i32, %3:i32):void -> %b1 {
-  %b1 = block {
+%g = func(%2:i32, %3:i32):void {
+  $B1: {
     ret
   }
 }
-%f = func():void -> %b2 {
-  %b2 = block {
+%f = func():void {
+  $B2: {
     %5:void = call %g, 1i, 2i, 3i
     ret
   }
@@ -400,17 +400,17 @@
                            ^^^^
 
 :7:3 note: In block
-  %b2 = block {
-  ^^^^^^^^^^^
+  $B2: {
+  ^^^
 
 note: # Disassembly
-%g = func(%2:i32, %3:i32, %4:i32):void -> %b1 {
-  %b1 = block {
+%g = func(%2:i32, %3:i32, %4:i32):void {
+  $B1: {
     ret
   }
 }
-%f = func():void -> %b2 {
-  %b2 = block {
+%f = func():void {
+  $B2: {
     %6:void = call %g, 1i, 2.0f, 3i
     ret
   }
@@ -425,12 +425,12 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:2:3 error: block: does not end in a terminator instruction
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
   }
 }
 )");
@@ -456,22 +456,22 @@
                                         ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     ret
   }
 }
-%g = func():void -> %b2 {
-  %b2 = block {
+%g = func():void {
+  $B2: {
     ret
   }
 }
@@ -494,15 +494,15 @@
     auto res = ir::Validate(mod);
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
-              R"(:4:20 error: destroyed parameter found in block parameter list
-      %b2 = block (%my_param:f32) {  # body
-                   ^^^^^^^^^^^^^
+              R"(:4:12 error: destroyed parameter found in block parameter list
+      $B2 (%my_param:f32): {  # body
+           ^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block (%my_param:f32) {  # body
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2 (%my_param:f32): {  # body
         exit_loop  # loop_1
       }
     }
@@ -528,15 +528,15 @@
     auto res = ir::Validate(mod);
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
-              R"(:4:20 error: block parameter has nullptr parent block
-      %b2 = block (%my_param:f32) {  # body
-                   ^^^^^^^^^^^^^
+              R"(:4:12 error: block parameter has nullptr parent block
+      $B2 (%my_param:f32): {  # body
+           ^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block (%my_param:f32) {  # body
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2 (%my_param:f32): {  # body
         exit_loop  # loop_1
       }
     }
@@ -562,23 +562,23 @@
     auto res = ir::Validate(mod);
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
-              R"(:4:20 error: block parameter has incorrect parent block
-      %b2 = block (%my_param:f32) {  # body
-                   ^^^^^^^^^^^^^
+              R"(:4:12 error: block parameter has incorrect parent block
+      $B2 (%my_param:f32): {  # body
+           ^^^^^^^^^^^^^
 
 :7:7 note: parent block declared here
-      %b3 = block (%my_param:f32) {  # continuing
-      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+      $B3 (%my_param:f32): {  # continuing
+      ^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block (%my_param:f32) {  # body
-        continue %b3 %my_param:f32
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2 (%my_param:f32): {  # body
+        continue %my_param:f32  # -> $B3
       }
-      %b3 = block (%my_param:f32) {  # continuing
-        next_iteration %b2 %my_param:f32
+      $B3 (%my_param:f32): {  # continuing
+        next_iteration %my_param:f32  # -> $B2
       }
     }
     ret
@@ -605,12 +605,12 @@
                         ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:vec3<f32>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:vec3<f32>):void {
+  $B1: {
     %3:f32 = access %2, -1i
     ret
   }
@@ -636,16 +636,16 @@
                             ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 :3:29 note: acceptable range: [0..1]
     %3:f32 = access %2, 1u, 3u
                             ^^
 
 note: # Disassembly
-%my_func = func(%2:mat3x2<f32>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:mat3x2<f32>):void {
+  $B1: {
     %3:f32 = access %2, 1u, 3u
     ret
   }
@@ -672,16 +672,16 @@
                                                       ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 :3:55 note: acceptable range: [0..1]
     %3:ptr<private, f32, read_write> = access %2, 1u, 3u
                                                       ^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<private, array<array<f32, 2>, 3>, read_write>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<private, array<array<f32, 2>, 3>, read_write>):void {
+  $B1: {
     %3:ptr<private, f32, read_write> = access %2, 1u, 3u
     ret
   }
@@ -706,12 +706,12 @@
                         ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:f32):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:f32):void {
+  $B1: {
     %3:f32 = access %2, 1u
     ret
   }
@@ -737,12 +737,12 @@
                                                   ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<private, f32, read_write>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<private, f32, read_write>):void {
+  $B1: {
     %3:ptr<private, f32, read_write> = access %2, 1u
     ret
   }
@@ -774,8 +774,8 @@
                         ^^
 
 :7:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
 MyStruct = struct @align(4) {
@@ -783,8 +783,8 @@
   b:i32 @offset(4)
 }
 
-%my_func = func(%2:MyStruct, %3:i32):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:MyStruct, %3:i32):void {
+  $B1: {
     %4:i32 = access %2, %3
     ret
   }
@@ -817,8 +817,8 @@
                         ^^
 
 :7:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
 MyStruct = struct @align(4) {
@@ -826,8 +826,8 @@
   b:i32 @offset(4)
 }
 
-%my_func = func(%2:ptr<private, MyStruct, read_write>, %3:i32):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<private, MyStruct, read_write>, %3:i32):void {
+  $B1: {
     %4:i32 = access %2, %3
     ret
   }
@@ -853,12 +853,12 @@
              ^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:mat3x2<f32>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:mat3x2<f32>):void {
+  $B1: {
     %3:i32 = access %2, 1u, 1u
     ret
   }
@@ -885,12 +885,12 @@
                                        ^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<private, array<array<f32, 2>, 3>, read_write>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<private, array<array<f32, 2>, 3>, read_write>):void {
+  $B1: {
     %3:ptr<private, i32, read_write> = access %2, 1u, 1u
     ret
   }
@@ -917,12 +917,12 @@
              ^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<private, array<array<f32, 2>, 3>, read_write>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<private, array<array<f32, 2>, 3>, read_write>):void {
+  $B1: {
     %3:f32 = access %2, 1u, 1u
     ret
   }
@@ -948,12 +948,12 @@
                         ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<private, vec3<f32>, read_write>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<private, vec3<f32>, read_write>):void {
+  $B1: {
     %3:f32 = access %2, 1u
     ret
   }
@@ -993,12 +993,12 @@
                             ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<private, mat3x2<f32>, read_write>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<private, mat3x2<f32>, read_write>):void {
+  $B1: {
     %3:f32 = access %2, 1u, 1u
     ret
   }
@@ -1039,12 +1039,12 @@
                                  ^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<storage, array<f32, 2>, read>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<storage, array<f32, 2>, read>):void {
+  $B1: {
     %3:ptr<uniform, f32, read> = access %2, 1u
     ret
   }
@@ -1071,12 +1071,12 @@
                                        ^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func(%2:ptr<storage, array<f32, 2>, read>):void -> %b1 {
-  %b1 = block {
+%my_func = func(%2:ptr<storage, array<f32, 2>, read>):void {
+  $B1: {
     %3:ptr<storage, f32, read_write> = access %2, 1u
     ret
   }
@@ -1128,12 +1128,12 @@
     ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     ret
     ret
   }
@@ -1166,16 +1166,16 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:4:7 error: block: does not end in a terminator instruction
-      %b2 = block {  # true
-      ^^^^^^^^^^^
+      $B2: {  # true
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    if true [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -1198,21 +1198,21 @@
     auto res = ir::Validate(mod);
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(), R"(:3:8 error: if: condition must be a `bool` type
-    if 1i [t: %b2, f: %b3] {  # if_1
+    if 1i [t: $B2, f: $B3] {  # if_1
        ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if 1i [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    if 1i [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -1235,21 +1235,21 @@
     auto res = ir::Validate(mod);
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(), R"(:3:8 error: if: operand is undefined
-    if undef [t: %b2, f: %b3] {  # if_1
+    if undef [t: $B2, f: $B3] {  # if_1
        ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if undef [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    if undef [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -1274,21 +1274,21 @@
     auto res = ir::Validate(mod);
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(), R"(:3:5 error: if: result is undefined
-    undef = if true [t: %b2, f: %b3] {  # if_1
+    undef = if true [t: $B2, f: $B3] {  # if_1
     ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    undef = if true [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    undef = if true [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -1322,14 +1322,14 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(),
               R"(:4:7 error: block: does not end in a terminator instruction
-      %b2 = block {  # body
-      ^^^^^^^^^^^
+      $B2: {  # body
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
       }
     }
     ret
@@ -1349,11 +1349,11 @@
   ^^^^^
 
 :1:1 note: In block
-%b1 = block {  # root
-^^^^^^^^^^^
+$B1: {  # root
+^^^
 
 note: # Disassembly
-%b1 = block {  # root
+$B1: {  # root
   undef = var
 }
 
@@ -1376,12 +1376,12 @@
     ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     undef = var
     ret
   }
@@ -1406,12 +1406,12 @@
                                         ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, f32, read_write> = var, %3
     ret
   }
@@ -1435,12 +1435,12 @@
     ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     undef = let 1i
     ret
   }
@@ -1464,12 +1464,12 @@
                  ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:f32 = let undef
     ret
   }
@@ -1494,12 +1494,12 @@
              ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:f32 = let 1i
     ret
   }
@@ -1525,12 +1525,12 @@
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^$ARROWS^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     <destroyed tint::core::ir::Var $ADDRESS>
     ret
   }
@@ -1562,12 +1562,12 @@
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, f32, read_write> = var
     ret
   }
@@ -1593,12 +1593,12 @@
                                              ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, f32, read_write> = var, %3
     ret
   }
@@ -1624,12 +1624,12 @@
                                              ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, f32, read_write> = var, %3
     ret
   }
@@ -1651,8 +1651,8 @@
     ASSERT_NE(res, Success);
     EXPECT_EQ(res.Failure().reason.Str(), R"(error: load: orphaned instruction: load
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, f32, read_write> = var
     ret
   }
@@ -1674,12 +1674,12 @@
                  ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:i32 = add undef, 2i
     ret
   }
@@ -1701,12 +1701,12 @@
                      ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:i32 = add 2i, undef
     ret
   }
@@ -1731,12 +1731,12 @@
     ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     undef = add 3i, 2i
     ret
   }
@@ -1758,12 +1758,12 @@
                       ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:i32 = negation undef
     ret
   }
@@ -1788,12 +1788,12 @@
     ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     undef = negation 2i
     ret
   }
@@ -1819,12 +1819,12 @@
     ^^^^^^^^^^^^^^^^^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:f32 = complement 2i
     ret
   }
@@ -1860,14 +1860,14 @@
         ^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # true
-      ^^^^^^^^^^^
+      $B2: {  # true
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         exit_if  # undef
       }
     }
@@ -1899,18 +1899,18 @@
         ^^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # true
-      ^^^^^^^^^^^
+      $B2: {  # true
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = if true [t: %b2] {  # if_1
+    %2:i32, %3:f32 = if true [t: $B2] {  # if_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = if true [t: $B2] {  # if_1
+      $B2: {  # true
         exit_if 1i  # if_1
       }
       # implicit false block: exit_if undef, undef
@@ -1943,18 +1943,18 @@
         ^^^^^^^^^^^^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # true
-      ^^^^^^^^^^^
+      $B2: {  # true
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = if true [t: %b2] {  # if_1
+    %2:i32, %3:f32 = if true [t: $B2] {  # if_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = if true [t: $B2] {  # if_1
+      $B2: {  # true
         exit_if 1i, 2.0f, 3i  # if_1
       }
       # implicit false block: exit_if undef, undef
@@ -2004,18 +2004,18 @@
                     ^^
 
 :4:7 note: In block
-      %b2 = block {  # true
-      ^^^^^^^^^^^
+      $B2: {  # true
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = if true [t: %b2] {  # if_1
+    %2:i32, %3:f32 = if true [t: $B2] {  # if_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = if true [t: $B2] {  # if_1
+      $B2: {  # true
         exit_if 1i, 2i  # if_1
       }
       # implicit false block: exit_if undef, undef
@@ -2044,14 +2044,14 @@
     ^^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+%my_func = func():void {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         ret
       }
     }
@@ -2087,20 +2087,20 @@
             ^^^^^^^
 
 :6:11 note: In block
-          %b3 = block {  # true
-          ^^^^^^^^^^^
+          $B3: {  # true
+          ^^^
 
 :5:9 note: first control instruction jumped
-        if true [t: %b3] {  # if_2
+        if true [t: $B3] {  # if_2
         ^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
-        if true [t: %b3] {  # if_2
-          %b3 = block {  # true
+%my_func = func():void {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
+        if true [t: $B3] {  # if_2
+          $B3: {  # true
             exit_if  # if_1
           }
         }
@@ -2140,20 +2140,20 @@
             ^^^^^^^
 
 :6:11 note: In block
-          %b3 = block {  # case
-          ^^^^^^^^^^^
+          $B3: {  # case
+          ^^^
 
 :5:9 note: first control instruction jumped
-        switch 1i [c: (1i, %b3)] {  # switch_1
+        switch 1i [c: (1i, $B3)] {  # switch_1
         ^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
-        switch 1i [c: (1i, %b3)] {  # switch_1
-          %b3 = block {  # case
+%my_func = func():void {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
+        switch 1i [c: (1i, $B3)] {  # switch_1
+          $B3: {  # case
             exit_if  # if_1
           }
         }
@@ -2192,20 +2192,20 @@
             ^^^^^^^
 
 :6:11 note: In block
-          %b3 = block {  # body
-          ^^^^^^^^^^^
+          $B3: {  # body
+          ^^^
 
 :5:9 note: first control instruction jumped
-        loop [b: %b3] {  # loop_1
+        loop [b: $B3] {  # loop_1
         ^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
-        loop [b: %b3] {  # loop_1
-          %b3 = block {  # body
+%my_func = func():void {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
+        loop [b: $B3] {  # loop_1
+          $B3: {  # body
             exit_if  # if_1
           }
         }
@@ -2251,14 +2251,14 @@
         ^^^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # case
-      ^^^^^^^^^^^
+      $B2: {  # case
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    switch true [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+%my_func = func():void {
+  $B1: {
+    switch true [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         exit_switch  # undef
       }
     }
@@ -2292,18 +2292,18 @@
         ^^^^^^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # case
-      ^^^^^^^^^^^
+      $B2: {  # case
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = switch true [c: (default, %b2)] {  # switch_1
+    %2:i32, %3:f32 = switch true [c: (default, $B2)] {  # switch_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = switch true [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = switch true [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         exit_switch 1i  # switch_1
       }
     }
@@ -2336,18 +2336,18 @@
         ^^^^^^^^^^^^^^^^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # case
-      ^^^^^^^^^^^
+      $B2: {  # case
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = switch true [c: (default, %b2)] {  # switch_1
+    %2:i32, %3:f32 = switch true [c: (default, $B2)] {  # switch_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = switch true [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = switch true [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         exit_switch 1i, 2.0f, 3i  # switch_1
       }
     }
@@ -2398,18 +2398,18 @@
                         ^^
 
 :4:7 note: In block
-      %b2 = block {  # case
-      ^^^^^^^^^^^
+      $B2: {  # case
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = switch true [c: (default, %b2)] {  # switch_1
+    %2:i32, %3:f32 = switch true [c: (default, $B2)] {  # switch_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = switch true [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = switch true [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         exit_switch 1i, 2i  # switch_1
       }
     }
@@ -2442,19 +2442,19 @@
         ^^^^^^^^^^^
 
 :9:7 note: In block
-      %b3 = block {  # true
-      ^^^^^^^^^^^
+      $B3: {  # true
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    switch true [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+%my_func = func():void {
+  $B1: {
+    switch true [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret
       }
     }
-    if true [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if true [t: $B3] {  # if_1
+      $B3: {  # true
         exit_switch  # switch_1
       }
     }
@@ -2523,20 +2523,20 @@
             ^^^^^^^^^^^
 
 :6:11 note: In block
-          %b3 = block {  # case
-          ^^^^^^^^^^^
+          $B3: {  # case
+          ^^^
 
 :5:9 note: first control instruction jumped
-        switch false [c: (default, %b3)] {  # switch_2
+        switch false [c: (default, $B3)] {  # switch_2
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    switch true [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
-        switch false [c: (default, %b3)] {  # switch_2
-          %b3 = block {  # case
+%my_func = func():void {
+  $B1: {
+    switch true [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
+        switch false [c: (default, $B3)] {  # switch_2
+          $B3: {  # case
             exit_switch  # switch_1
           }
         }
@@ -2574,20 +2574,20 @@
             ^^^^^^^^^^^
 
 :6:11 note: In block
-          %b3 = block {  # body
-          ^^^^^^^^^^^
+          $B3: {  # body
+          ^^^
 
 :5:9 note: first control instruction jumped
-        loop [b: %b3] {  # loop_1
+        loop [b: $B3] {  # loop_1
         ^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    switch true [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
-        loop [b: %b3] {  # loop_1
-          %b3 = block {  # body
+%my_func = func():void {
+  $B1: {
+    switch true [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
+        loop [b: $B3] {  # loop_1
+          $B3: {  # body
             exit_switch  # switch_1
           }
         }
@@ -2631,18 +2631,18 @@
         ^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # body
-      ^^^^^^^^^^^
+      $B2: {  # body
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         exit_loop  # undef
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -2674,22 +2674,22 @@
         ^^^^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # body
-      ^^^^^^^^^^^
+      $B2: {  # body
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = loop [b: %b2, c: %b3] {  # loop_1
+    %2:i32, %3:f32 = loop [b: $B2, c: $B3] {  # loop_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         exit_loop 1i  # loop_1
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -2721,22 +2721,22 @@
         ^^^^^^^^^^^^^^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # body
-      ^^^^^^^^^^^
+      $B2: {  # body
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = loop [b: %b2, c: %b3] {  # loop_1
+    %2:i32, %3:f32 = loop [b: $B2, c: $B3] {  # loop_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         exit_loop 1i, 2.0f, 3i  # loop_1
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -2786,22 +2786,22 @@
                       ^^
 
 :4:7 note: In block
-      %b2 = block {  # body
-      ^^^^^^^^^^^
+      $B2: {  # body
+      ^^^
 
 :3:5 note: control instruction
-    %2:i32, %3:f32 = loop [b: %b2, c: %b3] {  # loop_1
+    %2:i32, %3:f32 = loop [b: $B2, c: $B3] {  # loop_1
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    %2:i32, %3:f32 = loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+%my_func = func():void {
+  $B1: {
+    %2:i32, %3:f32 = loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         exit_loop 1i, 2i  # loop_1
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -2832,22 +2832,22 @@
         ^^^^^^^^^
 
 :12:7 note: In block
-      %b4 = block {  # true
-      ^^^^^^^^^^^
+      $B4: {  # true
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         ret
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
-    if true [t: %b4] {  # if_1
-      %b4 = block {  # true
+    if true [t: $B4] {  # if_1
+      $B4: {  # true
         exit_loop  # loop_1
       }
     }
@@ -2915,27 +2915,27 @@
             ^^^^^^^^^
 
 :6:11 note: In block
-          %b4 = block {  # case
-          ^^^^^^^^^^^
+          $B4: {  # case
+          ^^^
 
 :5:9 note: first control instruction jumped
-        switch false [c: (default, %b4)] {  # switch_1
+        switch false [c: (default, $B4)] {  # switch_1
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        switch false [c: (default, %b4)] {  # switch_1
-          %b4 = block {  # case
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        switch false [c: (default, $B4)] {  # switch_1
+          $B4: {  # case
             exit_loop  # loop_1
           }
         }
         exit_loop  # loop_1
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -2970,27 +2970,27 @@
             ^^^^^^^^^
 
 :6:11 note: In block
-          %b4 = block {  # body
-          ^^^^^^^^^^^
+          $B4: {  # body
+          ^^^
 
 :5:9 note: first control instruction jumped
-        loop [b: %b4] {  # loop_2
+        loop [b: $B4] {  # loop_2
         ^^^^^^^^^^^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        loop [b: %b4] {  # loop_2
-          %b4 = block {  # body
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        loop [b: $B4] {  # loop_2
+          $B4: {  # body
             exit_loop  # loop_1
           }
         }
         exit_loop  # loop_1
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -3020,17 +3020,17 @@
         ^^^^^^^^^
 
 :7:7 note: In block
-      %b3 = block {  # continuing
-      ^^^^^^^^^^^
+      $B3: {  # continuing
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         exit_loop  # loop_1
       }
     }
@@ -3066,27 +3066,27 @@
             ^^^^^^^^^
 
 :9:11 note: In block
-          %b4 = block {  # true
-          ^^^^^^^^^^^
+          $B4: {  # true
+          ^^^
 
 :7:7 note: in continuing block
-      %b3 = block {  # continuing
-      ^^^^^^^^^^^
+      $B3: {  # continuing
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+%my_func = func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        if true [t: %b4] {  # if_1
-          %b4 = block {  # true
+      $B3: {  # continuing
+        if true [t: $B4] {  # if_1
+          $B4: {  # true
             exit_loop  # loop_1
           }
         }
-        next_iteration %b2
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -3118,21 +3118,21 @@
         ^^^^^^^^^
 
 :4:7 note: In block
-      %b2 = block {  # initializer
-      ^^^^^^^^^^^
+      $B2: {  # initializer
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
+%my_func = func():void {
+  $B1: {
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
         exit_loop  # loop_1
       }
-      %b3 = block {  # body
-        continue %b4
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
-        next_iteration %b3
+      $B4: {  # continuing
+        next_iteration  # -> $B3
       }
     }
     ret
@@ -3168,30 +3168,30 @@
             ^^^^^^^^^
 
 :6:11 note: In block
-          %b5 = block {  # true
-          ^^^^^^^^^^^
+          $B5: {  # true
+          ^^^
 
 :4:7 note: in initializer block
-      %b2 = block {  # initializer
-      ^^^^^^^^^^^
+      $B2: {  # initializer
+      ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
-        if true [t: %b5] {  # if_1
-          %b5 = block {  # true
+%my_func = func():void {
+  $B1: {
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
+        if true [t: $B5] {  # if_1
+          $B5: {  # true
             exit_loop  # loop_1
           }
         }
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
-        continue %b4
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
-        next_iteration %b3
+      $B4: {  # continuing
+        next_iteration  # -> $B3
       }
     }
     ret
@@ -3231,12 +3231,12 @@
     ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     ret
   }
 }
@@ -3256,12 +3256,12 @@
     ^^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     ret 42i
   }
 }
@@ -3281,12 +3281,12 @@
     ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():i32 -> %b1 {
-  %b1 = block {
+%my_func = func():i32 {
+  $B1: {
     ret
   }
 }
@@ -3307,12 +3307,12 @@
     ^^^^^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():i32 -> %b1 {
-  %b1 = block {
+%my_func = func():i32 {
+  $B1: {
     ret 42.0f
   }
 }
@@ -3335,12 +3335,12 @@
                   ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:i32 = load undef
     ret
   }
@@ -3366,12 +3366,12 @@
                   ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %l:i32 = let 1i
     %3:f32 = load %l
     ret
@@ -3398,12 +3398,12 @@
                   ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:f32 = load %2
     ret
@@ -3427,12 +3427,12 @@
           ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     store undef, 42i
     ret
   }
@@ -3456,12 +3456,12 @@
               ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, undef
     ret
@@ -3487,12 +3487,12 @@
               ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %l:i32 = let 1i
     store %l, 42u
     ret
@@ -3518,12 +3518,12 @@
               ^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 42u
     ret
@@ -3550,12 +3550,12 @@
     ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, vec3<f32>, read_write> = var
     undef = load_vector_element %2, 1i
     ret
@@ -3580,12 +3580,12 @@
                                  ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:f32 = load_vector_element undef, 1i
     ret
   }
@@ -3610,12 +3610,12 @@
                                      ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, vec3<f32>, read_write> = var
     %3:f32 = load_vector_element %2, undef
     ret
@@ -3640,12 +3640,12 @@
                          ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     store_vector_element undef, 1i, 2i
     ret
   }
@@ -3670,20 +3670,20 @@
                              ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 :4:37 error: store_vector_element: value type does not match vector pointer element type
     store_vector_element %2, undef, 2i
                                     ^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, vec3<f32>, read_write> = var
     store_vector_element %2, undef, 2i
     ret
@@ -3709,12 +3709,12 @@
                                  ^^^^^
 
 :2:3 note: In block
-  %b1 = block {
-  ^^^^^^^^^^^
+  $B1: {
+  ^^^
 
 note: # Disassembly
-%my_func = func():void -> %b1 {
-  %b1 = block {
+%my_func = func():void {
+  $B1: {
     %2:ptr<function, vec3<f32>, read_write> = var
     store_vector_element %2, 1i, undef
     ret
diff --git a/src/tint/lang/glsl/writer/writer_ast_fuzz.cc b/src/tint/lang/glsl/writer/writer_ast_fuzz.cc
index 577f4f2..839e466 100644
--- a/src/tint/lang/glsl/writer/writer_ast_fuzz.cc
+++ b/src/tint/lang/glsl/writer/writer_ast_fuzz.cc
@@ -35,13 +35,31 @@
 namespace tint::glsl::writer {
 namespace {
 
-void ASTFuzzer(const tint::Program& program, Options options) {
+bool CanRun(const tint::Program& program, const Options& options) {
     if (program.AST().HasOverrides()) {
-        return;
+        return false;  // Overrides are not supported.
     }
 
-    if (options.first_instance_offset > 0x10000) {
-        return;  // Excessive values can cause OOM.
+    // Excessive values can cause OOM / timeouts in the PadStructs transform.
+    static constexpr uint32_t kMaxOffset = 0x1000;
+
+    if (options.first_instance_offset > kMaxOffset) {
+        return false;
+    }
+
+    if (options.depth_range_offsets) {
+        if (options.depth_range_offsets->max > kMaxOffset ||
+            options.depth_range_offsets->min > kMaxOffset) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+void ASTFuzzer(const tint::Program& program, const Options& options) {
+    if (!CanRun(program, options)) {
+        return;
     }
 
     auto inspector = tint::inspector::Inspector(program);
diff --git a/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc
index b61a9a0..915307b 100644
--- a/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/msl/writer/raise/builtin_polyfill_test.cc
@@ -52,8 +52,8 @@
     });
 
     auto* src = R"(
-%foo = @compute func():void -> %b1 {
-  %b1 = block {
+%foo = @compute func():void {
+  $B1: {
     %2:void = workgroupBarrier
     ret
   }
@@ -62,8 +62,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = @compute func():void -> %b1 {
-  %b1 = block {
+%foo = @compute func():void {
+  $B1: {
     %2:void = msl.threadgroup_barrier 4u
     ret
   }
@@ -84,8 +84,8 @@
     });
 
     auto* src = R"(
-%foo = @compute func():void -> %b1 {
-  %b1 = block {
+%foo = @compute func():void {
+  $B1: {
     %2:void = storageBarrier
     ret
   }
@@ -94,8 +94,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = @compute func():void -> %b1 {
-  %b1 = block {
+%foo = @compute func():void {
+  $B1: {
     %2:void = msl.threadgroup_barrier 1u
     ret
   }
@@ -116,8 +116,8 @@
     });
 
     auto* src = R"(
-%foo = @compute func():void -> %b1 {
-  %b1 = block {
+%foo = @compute func():void {
+  $B1: {
     %2:void = textureBarrier
     ret
   }
@@ -126,8 +126,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = @compute func():void -> %b1 {
-  %b1 = block {
+%foo = @compute func():void {
+  $B1: {
     %2:void = msl.threadgroup_barrier 2u
     ret
   }
diff --git a/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc b/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc
index e7160a5..ade391c 100644
--- a/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc
+++ b/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc
@@ -48,8 +48,8 @@
     });
 
     auto* src = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %2:u32 = access %vec, 2u
     ret %2
   }
@@ -73,8 +73,8 @@
     });
 
     auto* src = R"(
-%foo = func():vec4<u32> -> %b1 {
-  %b1 = block {
+%foo = func():vec4<u32> {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, vec4<u32>, read_write> = access %vec
     %4:vec4<u32> = load %3
@@ -102,8 +102,8 @@
     });
 
     auto* src = R"(
-%foo = func():vec4<u32> -> %b1 {
-  %b1 = block {
+%foo = func():vec4<u32> {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, vec4<u32>, read_write> = access %vec
     %4:ptr<function, vec4<u32>, read_write> = access %3
@@ -131,8 +131,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, u32, read_write> = access %vec, 2u
     ret
@@ -142,8 +142,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     ret
   }
@@ -165,8 +165,8 @@
     });
 
     auto* src = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, u32, read_write> = access %vec, 2u
     %4:u32 = load %3
@@ -177,8 +177,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():u32 -> %b1 {
-  %b1 = block {
+%foo = func():u32 {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:u32 = load_vector_element %vec, 2u
     ret %3
@@ -201,8 +201,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, u32, read_write> = access %vec, 2u
     store %3, 42u
@@ -213,8 +213,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     store_vector_element %vec, 2u, 42u
     ret
@@ -238,8 +238,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, u32, read_write> = access %vec, 2u
     %4:ptr<function, u32, read_write> = access %3
@@ -251,8 +251,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     store_vector_element %vec, 2u, 42u
     ret
@@ -277,8 +277,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, u32, read_write> = access %vec, 2u
     %4:u32 = load %3
@@ -291,8 +291,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %vec:ptr<function, vec4<u32>, read_write> = var
     %3:u32 = load_vector_element %vec, 2u
     %4:u32 = add %3, 1u
@@ -317,8 +317,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %3:ptr<function, f32, read_write> = access %mat, 1u, 2u
     store %3, 42.0f
@@ -329,8 +329,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %mat:ptr<function, mat4x4<f32>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %mat, 1u
     store_vector_element %3, 2u, 42.0f
@@ -354,8 +354,8 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %arr:ptr<function, array<vec4<f32>, 4>, read_write> = var
     %3:ptr<function, f32, read_write> = access %arr, 1u, 2u
     store %3, 42.0f
@@ -366,8 +366,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %arr:ptr<function, array<vec4<f32>, 4>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %arr, 1u
     store_vector_element %3, 2u, 42.0f
@@ -400,8 +400,8 @@
   vec:vec4<f32> @offset(0)
 }
 
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %str:ptr<function, str, read_write> = var
     %3:ptr<function, f32, read_write> = access %str, 0u, 2u
     store %3, 42.0f
@@ -416,8 +416,8 @@
   vec:vec4<f32> @offset(0)
 }
 
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %str:ptr<function, str, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %str, 0u
     store_vector_element %3, 2u, 42.0f
@@ -452,8 +452,8 @@
   inner:array<mat4x4<f32>, 4> @offset(0)
 }
 
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %arr:ptr<function, array<str, 4>, read_write> = var
     %3:ptr<function, f32, read_write> = access %arr, 1u, 0u, 3u, 2u, 1u
     store %3, 42.0f
@@ -468,8 +468,8 @@
   inner:array<mat4x4<f32>, 4> @offset(0)
 }
 
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %arr:ptr<function, array<str, 4>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %arr, 1u, 0u, 3u, 2u
     store_vector_element %3, 1u, 42.0f
diff --git a/src/tint/lang/spirv/reader/parser/composite_test.cc b/src/tint/lang/spirv/reader/parser/composite_test.cc
index 6a0ce9f..463e33b 100644
--- a/src/tint/lang/spirv/reader/parser/composite_test.cc
+++ b/src/tint/lang/spirv/reader/parser/composite_test.cc
@@ -57,7 +57,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b2 = block {
+%2 = func():vec4<u32> {
+  $B2: {
     %3:vec4<u32> = construct 1u, 2u, 3u, 4u
     ret %3
   }
@@ -95,7 +96,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b2 = block {
+%2 = func():mat4x3<f32> {
+  $B2: {
     %3:vec3<f32> = construct 1.0f, 2.0f, 3.0f
     %4:vec3<f32> = construct 2.0f, 3.0f, 1.0f
     %5:vec3<f32> = construct 3.0f, 2.0f, 1.0f
@@ -133,7 +135,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b2 = block {
+%2 = func():array<u32, 4> {
+  $B2: {
     %3:array<u32, 4> = construct 1u, 2u, 3u, 4u
     ret %3
   }
@@ -172,7 +175,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b2 = block {
+%2 = func():array<vec4<u32>, 4> {
+  $B2: {
     %3:vec4<u32> = construct 1u, 2u, 3u, 4u
     %4:vec4<u32> = construct 2u, 3u, 4u, 1u
     %5:vec4<u32> = construct 3u, 4u, 1u, 2u
@@ -222,13 +226,13 @@
   tint_symbol_2:array<vec4<u32>, 2> @offset(32)
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     ret
   }
 }
-%2 = func():tint_symbol_3 -> %b2 {
-  %b2 = block {
+%2 = func():tint_symbol_3 {
+  $B2: {
     %3:vec4<u32> = construct 1u, 2u, 3u, 4u
     %4:vec4<u32> = construct 2u, 3u, 4u, 1u
     %5:vec4<u32> = construct 3u, 4u, 1u, 2u
@@ -264,8 +268,8 @@
                OpFunctionEnd
 )",
               R"(
-%2 = func(%3:vec4<u32>):u32 -> %b2 {
-  %b2 = block {
+%2 = func(%3:vec4<u32>):u32 {
+  $B2: {
     %4:u32 = access %3, 2u
     ret %4
   }
@@ -299,8 +303,8 @@
                OpFunctionEnd
 )",
               R"(
-%2 = func(%3:mat4x3<f32>):vec3<f32> -> %b2 {
-  %b2 = block {
+%2 = func(%3:mat4x3<f32>):vec3<f32> {
+  $B2: {
     %4:vec3<f32> = access %3, 2u
     ret %4
   }
@@ -334,8 +338,8 @@
                OpFunctionEnd
 )",
               R"(
-%2 = func(%3:mat4x3<f32>):f32 -> %b2 {
-  %b2 = block {
+%2 = func(%3:mat4x3<f32>):f32 {
+  $B2: {
     %4:f32 = access %3, 2u, 1u
     ret %4
   }
@@ -368,8 +372,8 @@
                OpFunctionEnd
 )",
               R"(
-%2 = func(%3:array<u32, 4>):u32 -> %b2 {
-  %b2 = block {
+%2 = func(%3:array<u32, 4>):u32 {
+  $B2: {
     %4:u32 = access %3, 2u
     ret %4
   }
@@ -403,8 +407,8 @@
                OpFunctionEnd
 )",
               R"(
-%2 = func(%3:array<vec3<u32>, 4>):u32 -> %b2 {
-  %b2 = block {
+%2 = func(%3:array<vec3<u32>, 4>):u32 {
+  $B2: {
     %4:u32 = access %3, 1u, 2u
     ret %4
   }
@@ -441,13 +445,13 @@
   tint_symbol_1:u32 @offset(4)
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     ret
   }
 }
-%2 = func(%3:tint_symbol_2):u32 -> %b2 {
-  %b2 = block {
+%2 = func(%3:tint_symbol_2):u32 {
+  $B2: {
     %4:u32 = access %3, 1u
     ret %4
   }
diff --git a/src/tint/lang/spirv/reader/parser/constant_test.cc b/src/tint/lang/spirv/reader/parser/constant_test.cc
index 862db10..b509dc0 100644
--- a/src/tint/lang/spirv/reader/parser/constant_test.cc
+++ b/src/tint/lang/spirv/reader/parser/constant_test.cc
@@ -64,8 +64,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:void = call %2, true
     %6:void = call %2, false
     %7:void = call %2, false
@@ -115,8 +115,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:void = call %2, 0i
     %6:void = call %2, 1i
     %7:void = call %2, -1i
@@ -165,8 +165,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:void = call %2, 0u
     %6:void = call %2, 1u
     %7:void = call %2, 4294967295u
@@ -218,8 +218,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:void = call %2, 0.0h
     %6:void = call %2, 1.0h
     %7:void = call %2, 65504.0h
@@ -272,8 +272,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:void = call %2, 0.0f
     %6:void = call %2, 1.0f
     %7:void = call %2, 340282346638528859811704183484516925440.0f
@@ -321,8 +321,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:vec2<bool> = call %2, vec2<bool>(true, false)
     %6:vec2<bool> = call %2, vec2<bool>(false)
     ret
@@ -367,8 +367,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:vec3<i32> = call %2, vec3<i32>(0i, 1i, -1i)
     %6:vec3<i32> = call %2, vec3<i32>(0i)
     ret
@@ -414,8 +414,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:vec4<f32> = call %2, vec4<f32>(0.0f, 1.0f, 340282346638528859811704183484516925440.0f, -340282346638528859811704183484516925440.0f)
     %6:vec4<f32> = call %2, vec4<f32>(0.0f)
     ret
@@ -462,8 +462,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:mat2x4<f32> = call %2, mat2x4<f32>(vec4<f32>(0.0f), vec4<f32>(1.0f))
     %6:mat2x4<f32> = call %2, mat2x4<f32>(vec4<f32>(0.0f))
     ret
@@ -513,8 +513,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:mat3x2<f16> = call %2, mat3x2<f16>(vec2<f16>(0.0h), vec2<f16>(1.0h), vec2<f16>(65504.0h))
     %6:mat3x2<f16> = call %2, mat3x2<f16>(vec2<f16>(0.0h))
     ret
@@ -561,8 +561,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:array<i32, 4> = call %2, array<i32, 4>(0i, 1i, -1i, 2147483647i)
     %6:array<i32, 4> = call %2, array<i32, 4>(0i)
     ret
@@ -614,8 +614,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:array<array<f32, 4>, 2> = call %2, array<array<f32, 4>, 2>(array<f32, 4>(0.0f, 1.0f, 340282346638528859811704183484516925440.0f, -340282346638528859811704183484516925440.0f), array<f32, 4>(-340282346638528859811704183484516925440.0f, 340282346638528859811704183484516925440.0f, 1.0f, 0.0f))
     %6:array<array<f32, 4>, 2> = call %2, array<array<f32, 4>, 2>(array<f32, 4>(0.0f))
     ret
@@ -660,8 +660,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:tint_symbol_2 = call %2, tint_symbol_2(42i, -1.0f)
     %6:tint_symbol_2 = call %2, tint_symbol_2(0i, 0.0f)
     ret
@@ -715,8 +715,8 @@
                OpFunctionEnd
 )",
               R"(
-%4 = func():void -> %b3 {
-  %b3 = block {
+%4 = func():void {
+  $B3: {
     %5:tint_symbol_5 = call %2, tint_symbol_5(array<tint_symbol_2, 2>(tint_symbol_2(42i, -1.0f), tint_symbol_2(-1i, 42.0f)), array<tint_symbol_2, 2>(tint_symbol_2(-1i, 42.0f), tint_symbol_2(42i, -1.0f)))
     %6:tint_symbol_5 = call %2, tint_symbol_5(array<tint_symbol_2, 2>(tint_symbol_2(0i, 0.0f)))
     ret
diff --git a/src/tint/lang/spirv/reader/parser/function_test.cc b/src/tint/lang/spirv/reader/parser/function_test.cc
index a66b1e0..d268ebb 100644
--- a/src/tint/lang/spirv/reader/parser/function_test.cc
+++ b/src/tint/lang/spirv/reader/parser/function_test.cc
@@ -44,8 +44,8 @@
                OpFunctionEnd
 )",
               R"(
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     ret
   }
 }
@@ -66,8 +66,8 @@
                OpFunctionEnd
 )",
               R"(
-%main = @compute @workgroup_size(3, 4, 5) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(3, 4, 5) func():void {
+  $B1: {
     ret
   }
 }
@@ -88,8 +88,8 @@
                OpFunctionEnd
 )",
               R"(
-%main = @fragment func():void -> %b1 {
-  %b1 = block {
+%main = @fragment func():void {
+  $B1: {
     ret
   }
 }
@@ -109,8 +109,8 @@
                OpFunctionEnd
 )",
               R"(
-%main = @vertex func():void -> %b1 {
-  %b1 = block {
+%main = @vertex func():void {
+  $B1: {
     ret
   }
 }
@@ -139,13 +139,13 @@
                OpFunctionEnd
 )",
               R"(
-%foo = @compute @workgroup_size(3, 4, 5) func():void -> %b1 {
-  %b1 = block {
+%foo = @compute @workgroup_size(3, 4, 5) func():void {
+  $B1: {
     ret
   }
 }
-%bar = @compute @workgroup_size(6, 7, 8) func():void -> %b2 {
-  %b2 = block {
+%bar = @compute @workgroup_size(6, 7, 8) func():void {
+  $B2: {
     ret
   }
 }
@@ -173,13 +173,13 @@
                OpFunctionEnd
 )",
               R"(
-%1 = func():void -> %b1 {
-  %b1 = block {
+%1 = func():void {
+  $B1: {
     ret
   }
 }
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:void = call %1
     ret
   }
@@ -208,14 +208,14 @@
                OpFunctionEnd
 )",
               R"(
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:void = call %3
     ret
   }
 }
-%3 = func():void -> %b2 {
-  %b2 = block {
+%3 = func():void {
+  $B2: {
     ret
   }
 }
@@ -249,13 +249,13 @@
                OpFunctionEnd
 )",
               R"(
-%1 = func(%2:bool):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:bool):void {
+  $B1: {
     ret
   }
 }
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %4:void = call %1, true
     %5:void = call %1, false
     ret
@@ -298,19 +298,19 @@
                OpFunctionEnd
 )",
               R"(
-%1 = func(%2:bool):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:bool):void {
+  $B1: {
     ret
   }
 }
-%3 = func(%4:bool):void -> %b2 {
-  %b2 = block {
+%3 = func(%4:bool):void {
+  $B2: {
     %5:void = call %1, %4
     ret
   }
 }
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b3 {
-  %b3 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B3: {
     %7:void = call %3, true
     %8:void = call %3, false
     ret
@@ -346,13 +346,13 @@
                OpFunctionEnd
 )",
               R"(
-%1 = func(%2:bool, %3:bool):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:bool, %3:bool):void {
+  $B1: {
     ret
   }
 }
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %5:void = call %1, true, false
     ret
   }
@@ -384,13 +384,13 @@
                OpFunctionEnd
 )",
               R"(
-%1 = func():bool -> %b1 {
-  %b1 = block {
+%1 = func():bool {
+  $B1: {
     ret true
   }
 }
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:bool = call %1
     ret
   }
@@ -428,19 +428,19 @@
                OpFunctionEnd
 )",
               R"(
-%1 = func():bool -> %b1 {
-  %b1 = block {
+%1 = func():bool {
+  $B1: {
     ret true
   }
 }
-%2 = func():bool -> %b2 {
-  %b2 = block {
+%2 = func():bool {
+  $B2: {
     %3:bool = call %2
     ret %3
   }
 }
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b3 {
-  %b3 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B3: {
     %5:bool = call %1
     ret
   }
@@ -473,13 +473,13 @@
                OpFunctionEnd
 )",
               R"(
-%1 = func(%2:bool):bool -> %b1 {
-  %b1 = block {
+%1 = func(%2:bool):bool {
+  $B1: {
     ret %2
   }
 }
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %4:bool = call %1, true
     ret
   }
diff --git a/src/tint/lang/spirv/reader/parser/memory_test.cc b/src/tint/lang/spirv/reader/parser/memory_test.cc
index acb3972..90e4945 100644
--- a/src/tint/lang/spirv/reader/parser/memory_test.cc
+++ b/src/tint/lang/spirv/reader/parser/memory_test.cc
@@ -48,7 +48,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, u32, read_write> = var
     %3:u32 = load %2
     ret
@@ -75,7 +76,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, vec4<u32>, read_write> = var
     %3:vec4<u32> = load %2
     ret
@@ -105,7 +107,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 2u
     %4:u32 = load %3
@@ -135,7 +138,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, mat3x4<f32>, read_write> = var
     %3:mat3x4<f32> = load %2
     ret
@@ -167,7 +171,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, mat3x4<f32>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %2, 2u
     %4:vec4<f32> = load %3
@@ -196,7 +201,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<u32, 4>, read_write> = var
     %3:array<u32, 4> = load %2
     ret
@@ -227,7 +233,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<u32, 4>, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 2u
     %4:u32 = load %3
@@ -255,7 +262,13 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+tint_symbol_2 = struct @align(4) {
+  tint_symbol:u32 @offset(0)
+  tint_symbol_1:u32 @offset(4)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, tint_symbol_2, read_write> = var
     %3:tint_symbol_2 = load %2
     ret
@@ -285,7 +298,13 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+tint_symbol_2 = struct @align(4) {
+  tint_symbol:u32 @offset(0)
+  tint_symbol_1:u32 @offset(4)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, tint_symbol_2, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 1u
     %4:u32 = load %3
@@ -313,7 +332,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, u32, read_write> = var
     store %2, 42u
     ret
@@ -341,7 +361,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, vec4<u32>, read_write> = var
     store %2, vec4<u32>(0u)
     ret
@@ -372,7 +393,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, vec4<u32>, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 2u
     store %3, 42u
@@ -403,7 +425,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, mat3x4<f32>, read_write> = var
     store %2, mat3x4<f32>(vec4<f32>(0.0f))
     ret
@@ -436,7 +459,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, mat3x4<f32>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %2, 2u
     store %3, vec4<f32>(0.0f)
@@ -466,7 +490,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<u32, 4>, read_write> = var
     store %2, array<u32, 4>(0u)
     ret
@@ -498,7 +523,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<u32, 4>, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 2u
     store %3, 42u
@@ -527,7 +553,13 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+tint_symbol_2 = struct @align(4) {
+  tint_symbol:u32 @offset(0)
+  tint_symbol_1:u32 @offset(4)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, tint_symbol_2, read_write> = var
     store %2, tint_symbol_2(0u)
     ret
@@ -558,7 +590,13 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+tint_symbol_2 = struct @align(4) {
+  tint_symbol:u32 @offset(0)
+  tint_symbol_1:u32 @offset(4)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, tint_symbol_2, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 1u
     store %3, 42u
@@ -596,7 +634,14 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+  tint_symbol:array<u32, 4> @offset(0)
+  tint_symbol_1:array<u32, 4> @offset(16)
+  tint_symbol_2:array<u32, 4> @offset(32)
+  tint_symbol_3:array<u32, 4> @offset(48)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<tint_symbol_4, 4>, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 1u, 2u, 3u
     %4:u32 = load %3
@@ -639,7 +684,14 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+  tint_symbol:array<u32, 4> @offset(0)
+  tint_symbol_1:array<u32, 4> @offset(16)
+  tint_symbol_2:array<u32, 4> @offset(32)
+  tint_symbol_3:array<u32, 4> @offset(48)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<tint_symbol_4, 4>, read_write> = var
     %3:ptr<function, tint_symbol_4, read_write> = access %2, 1u
     %4:ptr<function, array<u32, 4>, read_write> = access %3, 2u
@@ -671,7 +723,8 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, u32, read_write> = var
     %3:ptr<function, u32, read_write> = access %2
     %4:ptr<function, u32, read_write> = access %3
@@ -711,7 +764,14 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+  tint_symbol:array<u32, 4> @offset(0)
+  tint_symbol_1:array<u32, 4> @offset(16)
+  tint_symbol_2:array<u32, 4> @offset(32)
+  tint_symbol_3:array<u32, 4> @offset(48)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<tint_symbol_4, 4>, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 1i, 2u, 3i
     %4:u32 = load %3
@@ -750,7 +810,14 @@
                OpFunctionEnd
 )",
               R"(
-  %b1 = block {
+  tint_symbol:array<u32, 4> @offset(0)
+  tint_symbol_1:array<u32, 4> @offset(16)
+  tint_symbol_2:array<u32, 4> @offset(32)
+  tint_symbol_3:array<u32, 4> @offset(48)
+}
+
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, array<tint_symbol_4, 4>, read_write> = var
     %3:ptr<function, u32, read_write> = access %2, 1u, 2u, 3u
     %4:u32 = load %3
@@ -797,13 +864,13 @@
   tint_symbol:u32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read> = var @binding_point(1, 2)
   %2:ptr<storage, tint_symbol_1, read_write> = var @binding_point(1, 3)
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %4:ptr<storage, u32, read> = access %1, 0u
     %5:ptr<storage, u32, read_write> = access %2, 0u
     %6:u32 = load %4
diff --git a/src/tint/lang/spirv/reader/parser/struct_test.cc b/src/tint/lang/spirv/reader/parser/struct_test.cc
index bedb4e2..88d7349 100644
--- a/src/tint/lang/spirv/reader/parser/struct_test.cc
+++ b/src/tint/lang/spirv/reader/parser/struct_test.cc
@@ -90,8 +90,8 @@
   tint_symbol_1:i32 @offset(4)
 }
 
-%1 = func(%2:tint_symbol_2):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:tint_symbol_2):void {
+  $B1: {
     ret
   }
 }
@@ -128,8 +128,8 @@
   tint_symbol_1:i32 @offset(4)
 }
 
-%1 = func(%2:tint_symbol_2, %3:tint_symbol_2):tint_symbol_2 -> %b1 {
-  %b1 = block {
+%1 = func(%2:tint_symbol_2, %3:tint_symbol_2):tint_symbol_2 {
+  $B1: {
     ret %2
   }
 }
@@ -178,8 +178,8 @@
   tint_symbol_8:tint_symbol_2 @offset(24)
 }
 
-%1 = func(%2:tint_symbol_9):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:tint_symbol_9):void {
+  $B1: {
     ret
   }
 }
@@ -221,8 +221,8 @@
   tint_symbol_3:i32 @offset(64)
 }
 
-%1 = func(%2:tint_symbol_4):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:tint_symbol_4):void {
+  $B1: {
     ret
   }
 }
diff --git a/src/tint/lang/spirv/reader/parser/var_test.cc b/src/tint/lang/spirv/reader/parser/var_test.cc
index f524b23..f7bbc1b 100644
--- a/src/tint/lang/spirv/reader/parser/var_test.cc
+++ b/src/tint/lang/spirv/reader/parser/var_test.cc
@@ -47,8 +47,8 @@
                OpFunctionEnd
 )",
               R"(
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, u32, read_write> = var
     ret
   }
@@ -74,8 +74,8 @@
                OpFunctionEnd
 )",
               R"(
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, u32, read_write> = var, 42u
     ret
   }
@@ -100,12 +100,12 @@
                OpFunctionEnd
 )",
               R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, u32, read_write> = var
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     ret
   }
 }
@@ -130,12 +130,12 @@
                OpFunctionEnd
 )",
               R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, u32, read_write> = var, 42u
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     ret
   }
 }
@@ -170,12 +170,12 @@
   tint_symbol:u32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read> = var @binding_point(1, 2)
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     ret
   }
 }
@@ -209,12 +209,12 @@
   tint_symbol:u32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read_write> = var @binding_point(1, 2)
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     ret
   }
 }
@@ -252,13 +252,13 @@
   tint_symbol:u32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, tint_symbol_1, read> = var @binding_point(1, 2)
   %2:ptr<storage, tint_symbol_1, read_write> = var @binding_point(1, 3)
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     ret
   }
 }
@@ -292,12 +292,12 @@
   tint_symbol:u32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<uniform, tint_symbol_1, read> = var @binding_point(1, 2)
 }
 
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     ret
   }
 }
diff --git a/src/tint/lang/spirv/reader/reader_test.cc b/src/tint/lang/spirv/reader/reader_test.cc
index 40c07da..20a0ebb 100644
--- a/src/tint/lang/spirv/reader/reader_test.cc
+++ b/src/tint/lang/spirv/reader/reader_test.cc
@@ -110,8 +110,8 @@
 )");
     ASSERT_EQ(got, Success);
     EXPECT_EQ(got, R"(
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, vec4<u32>, read_write> = var
     %3:u32 = load_vector_element %2, 2u
     ret
@@ -144,8 +144,8 @@
 )");
     ASSERT_EQ(got, Success);
     EXPECT_EQ(got, R"(
-%main = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%main = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %2:ptr<function, vec4<u32>, read_write> = var
     store_vector_element %2, 2u, 42u
     ret
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
index 29b11d0..1049aac 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
@@ -71,12 +71,12 @@
   arr:array<i32> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<storage, Buffer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:ptr<storage, array<i32>, read_write> = access %var, 2u
     %4:u32 = arrayLength %3
     ret %4
@@ -92,12 +92,12 @@
   arr:array<i32> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<storage, Buffer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:ptr<storage, array<i32>, read_write> = access %var, 2u
     %4:u32 = spirv.array_length %var, 2u
     ret %4
@@ -137,12 +137,12 @@
   arr:array<i32> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<storage, Buffer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %a:ptr<storage, Buffer, read_write> = let %var
     %b:ptr<storage, Buffer, read_write> = let %a
     %5:ptr<storage, array<i32>, read_write> = access %b, 2u
@@ -160,12 +160,12 @@
   arr:array<i32> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<storage, Buffer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %a:ptr<storage, Buffer, read_write> = let %var
     %b:ptr<storage, Buffer, read_write> = let %a
     %5:ptr<storage, array<i32>, read_write> = access %b, 2u
@@ -207,12 +207,12 @@
   arr:array<i32> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<storage, Buffer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:ptr<storage, array<i32>, read_write> = access %var, 2u
     %a:ptr<storage, array<i32>, read_write> = let %3
     %b:ptr<storage, array<i32>, read_write> = let %a
@@ -230,12 +230,12 @@
   arr:array<i32> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<storage, Buffer, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func():u32 -> %b2 {
-  %b2 = block {
+%foo = func():u32 {
+  $B2: {
     %3:ptr<storage, array<i32>, read_write> = access %var, 2u
     %a:ptr<storage, array<i32>, read_write> = let %3
     %b:ptr<storage, array<i32>, read_write> = let %a
@@ -265,12 +265,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicAdd %1, %arg1
     ret %4
   }
@@ -279,12 +279,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, atomic<i32>, read_write> = var @binding_point(0, 0)
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_iadd %1, 1u, 0u, %arg1
     ret %4
   }
@@ -309,12 +309,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicAdd %1, %arg1
     ret %4
   }
@@ -323,12 +323,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_iadd %1, 2u, 0u, %arg1
     ret %4
   }
@@ -353,12 +353,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicAnd %1, %arg1
     ret %4
   }
@@ -367,12 +367,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_and %1, 2u, 0u, %arg1
     ret %4
   }
@@ -405,12 +405,12 @@
   exchanged:bool @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%cmp:i32, %val:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%cmp:i32, %val:i32):i32 {
+  $B2: {
     %5:__atomic_compare_exchange_result_i32 = atomicCompareExchangeWeak %1, %cmp, %val
     %6:i32 = access %5, 0u
     ret %6
@@ -425,12 +425,12 @@
   exchanged:bool @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%cmp:i32, %val:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%cmp:i32, %val:i32):i32 {
+  $B2: {
     %5:i32 = spirv.atomic_compare_exchange %1, 2u, 0u, 0u, %val, %cmp
     %6:bool = eq %5, %cmp
     %7:__atomic_compare_exchange_result_i32 = construct %5, %6
@@ -458,12 +458,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicExchange %1, %arg1
     ret %4
   }
@@ -472,12 +472,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_exchange %1, 2u, 0u, %arg1
     ret %4
   }
@@ -500,12 +500,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func():i32 -> %b2 {
-  %b2 = block {
+%foo = func():i32 {
+  $B2: {
     %3:i32 = atomicLoad %1
     ret %3
   }
@@ -514,12 +514,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func():i32 -> %b2 {
-  %b2 = block {
+%foo = func():i32 {
+  $B2: {
     %3:i32 = spirv.atomic_load %1, 2u, 0u
     ret %3
   }
@@ -544,12 +544,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicMax %1, %arg1
     ret %4
   }
@@ -558,12 +558,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_smax %1, 2u, 0u, %arg1
     ret %4
   }
@@ -588,12 +588,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<u32>, read_write> = var
 }
 
-%foo = func(%arg1:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:u32):u32 {
+  $B2: {
     %4:u32 = atomicMax %1, %arg1
     ret %4
   }
@@ -602,12 +602,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<u32>, read_write> = var
 }
 
-%foo = func(%arg1:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:u32):u32 {
+  $B2: {
     %4:u32 = spirv.atomic_umax %1, 2u, 0u, %arg1
     ret %4
   }
@@ -632,12 +632,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicMin %1, %arg1
     ret %4
   }
@@ -646,12 +646,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_smin %1, 2u, 0u, %arg1
     ret %4
   }
@@ -676,12 +676,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<u32>, read_write> = var
 }
 
-%foo = func(%arg1:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:u32):u32 {
+  $B2: {
     %4:u32 = atomicMin %1, %arg1
     ret %4
   }
@@ -690,12 +690,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<u32>, read_write> = var
 }
 
-%foo = func(%arg1:u32):u32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:u32):u32 {
+  $B2: {
     %4:u32 = spirv.atomic_umin %1, 2u, 0u, %arg1
     ret %4
   }
@@ -720,12 +720,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicOr %1, %arg1
     ret %4
   }
@@ -734,12 +734,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_or %1, 2u, 0u, %arg1
     ret %4
   }
@@ -764,12 +764,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):void -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):void {
+  $B2: {
     %4:void = atomicStore %1, %arg1
     ret
   }
@@ -778,12 +778,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):void -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):void {
+  $B2: {
     %4:void = spirv.atomic_store %1, 2u, 0u, %arg1
     ret
   }
@@ -808,12 +808,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicSub %1, %arg1
     ret %4
   }
@@ -822,12 +822,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_isub %1, 2u, 0u, %arg1
     ret %4
   }
@@ -852,12 +852,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = atomicXor %1, %arg1
     ret %4
   }
@@ -866,12 +866,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<workgroup, atomic<i32>, read_write> = var
 }
 
-%foo = func(%arg1:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%arg1:i32):i32 {
+  $B2: {
     %4:i32 = spirv.atomic_xor %1, 2u, 0u, %arg1
     ret %4
   }
@@ -895,8 +895,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>):f32 {
+  $B1: {
     %4:f32 = dot %arg1, %arg2
     ret %4
   }
@@ -905,8 +905,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>):f32 {
+  $B1: {
     %4:f32 = spirv.dot %arg1, %arg2
     ret %4
   }
@@ -930,8 +930,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:vec2<i32>, %arg2:vec2<i32>):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec2<i32>, %arg2:vec2<i32>):i32 {
+  $B1: {
     %4:i32 = dot %arg1, %arg2
     ret %4
   }
@@ -940,8 +940,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:vec2<i32>, %arg2:vec2<i32>):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec2<i32>, %arg2:vec2<i32>):i32 {
+  $B1: {
     %4:i32 = access %arg1, 0u
     %5:i32 = access %arg2, 0u
     %6:i32 = mul %4, %5
@@ -971,8 +971,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:vec4<u32>, %arg2:vec4<u32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec4<u32>, %arg2:vec4<u32>):u32 {
+  $B1: {
     %4:u32 = dot %arg1, %arg2
     ret %4
   }
@@ -981,8 +981,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:vec4<u32>, %arg2:vec4<u32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec4<u32>, %arg2:vec4<u32>):u32 {
+  $B1: {
     %4:u32 = access %arg1, 0u
     %5:u32 = access %arg2, 0u
     %6:u32 = mul %4, %5
@@ -1020,8 +1020,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:u32, %arg2:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:u32, %arg2:u32):i32 {
+  $B1: {
     %4:i32 = dot4I8Packed %arg1, %arg2
     ret %4
   }
@@ -1030,8 +1030,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:u32, %arg2:u32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:u32, %arg2:u32):i32 {
+  $B1: {
     %4:i32 = spirv.sdot %arg1, %arg2, 0u
     ret %4
   }
@@ -1055,8 +1055,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:u32, %arg2:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:u32, %arg2:u32):u32 {
+  $B1: {
     %4:u32 = dot4U8Packed %arg1, %arg2
     ret %4
   }
@@ -1065,8 +1065,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:u32, %arg2:u32):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:u32, %arg2:u32):u32 {
+  $B1: {
     %4:u32 = spirv.udot %arg1, %arg2, 0u
     ret %4
   }
@@ -1091,8 +1091,8 @@
     });
 
     auto* src = R"(
-%foo = func(%argf:i32, %argt:i32, %cond:bool):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%argf:i32, %argt:i32, %cond:bool):i32 {
+  $B1: {
     %5:i32 = select %argf, %argt, %cond
     ret %5
   }
@@ -1101,8 +1101,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%argf:i32, %argt:i32, %cond:bool):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%argf:i32, %argt:i32, %cond:bool):i32 {
+  $B1: {
     %5:i32 = spirv.select %cond, %argt, %argf
     ret %5
   }
@@ -1127,8 +1127,8 @@
     });
 
     auto* src = R"(
-%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:vec4<bool>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:vec4<bool>):vec4<i32> {
+  $B1: {
     %5:vec4<i32> = select %argf, %argt, %cond
     ret %5
   }
@@ -1137,8 +1137,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:vec4<bool>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:vec4<bool>):vec4<i32> {
+  $B1: {
     %5:vec4<i32> = spirv.select %cond, %argt, %argf
     ret %5
   }
@@ -1163,8 +1163,8 @@
     });
 
     auto* src = R"(
-%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:bool):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:bool):vec4<i32> {
+  $B1: {
     %5:vec4<i32> = select %argf, %argt, %cond
     ret %5
   }
@@ -1173,8 +1173,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:bool):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%argf:vec4<i32>, %argt:vec4<i32>, %cond:bool):vec4<i32> {
+  $B1: {
     %5:vec4<bool> = construct %cond, %cond, %cond, %cond
     %6:vec4<i32> = spirv.select %5, %argt, %argf
     ret %6
@@ -1201,8 +1201,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %coords:vec2<i32>, %lod:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %coords:vec2<i32>, %lod:i32):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = textureLoad %t, %coords, %lod
     ret %5
   }
@@ -1211,8 +1211,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %coords:vec2<i32>, %lod:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %coords:vec2<i32>, %lod:i32):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = spirv.image_fetch %t, %coords, 2u, %lod
     ret %5
   }
@@ -1240,8 +1240,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:i32, %lod:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:i32, %lod:i32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureLoad %t, %coords, %array_idx, %lod
     ret %6
   }
@@ -1250,8 +1250,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:i32, %lod:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:i32, %lod:i32):vec4<f32> {
+  $B1: {
     %6:vec3<i32> = construct %coords, %array_idx
     %7:vec4<f32> = spirv.image_fetch %t, %6, 2u, %lod
     ret %7
@@ -1280,8 +1280,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:u32, %lod:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:u32, %lod:i32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureLoad %t, %coords, %array_idx, %lod
     ret %6
   }
@@ -1290,8 +1290,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:u32, %lod:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %coords:vec2<i32>, %array_idx:u32, %lod:i32):vec4<f32> {
+  $B1: {
     %6:i32 = convert %array_idx
     %7:vec3<i32> = construct %coords, %6
     %8:vec4<f32> = spirv.image_fetch %t, %7, 2u, %lod
@@ -1319,8 +1319,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_multisampled_2d<f32>, %coords:vec2<i32>, %sample_idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_multisampled_2d<f32>, %coords:vec2<i32>, %sample_idx:i32):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = textureLoad %t, %coords, %sample_idx
     ret %5
   }
@@ -1329,8 +1329,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_multisampled_2d<f32>, %coords:vec2<i32>, %sample_idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_multisampled_2d<f32>, %coords:vec2<i32>, %sample_idx:i32):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = spirv.image_fetch %t, %coords, 64u, %sample_idx
     ret %5
   }
@@ -1356,8 +1356,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %coords:vec2<i32>, %lod:i32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %coords:vec2<i32>, %lod:i32):f32 {
+  $B1: {
     %5:f32 = textureLoad %t, %coords, %lod
     ret %5
   }
@@ -1366,8 +1366,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %coords:vec2<i32>, %lod:i32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %coords:vec2<i32>, %lod:i32):f32 {
+  $B1: {
     %5:vec4<f32> = spirv.image_fetch %t, %coords, 2u, %lod
     %6:f32 = access %5, 0u
     ret %6
@@ -1394,8 +1394,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_1d<f32>, %s:sampler, %coords:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_1d<f32>, %s:sampler, %coords:f32):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = textureSample %t, %s, %coords
     ret %5
   }
@@ -1404,8 +1404,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_1d<f32>, %s:sampler, %coords:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_1d<f32>, %s:sampler, %coords:f32):vec4<f32> {
+  $B1: {
     %5:spirv.sampled_image<texture_1d<f32>> = spirv.sampled_image %t, %s
     %6:vec4<f32> = spirv.image_sample_implicit_lod %5, %coords, 0u
     ret %6
@@ -1432,8 +1432,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = textureSample %t, %s, %coords
     ret %5
   }
@@ -1442,8 +1442,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %5:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %6:vec4<f32> = spirv.image_sample_implicit_lod %5, %coords, 0u
     ret %6
@@ -1471,8 +1471,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = textureSample %t, %s, %coords, vec2<i32>(1i)
     ret %5
   }
@@ -1481,8 +1481,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %5:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %6:vec4<f32> = spirv.image_sample_implicit_lod %5, %coords, 8u, vec2<i32>(1i)
     ret %6
@@ -1511,8 +1511,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureSample %t, %s, %coords, %array_idx, vec2<i32>(1i)
     ret %6
   }
@@ -1521,8 +1521,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_2d_array<f32>> = spirv.sampled_image %t, %s
     %7:f32 = convert %array_idx
     %8:vec3<f32> = construct %coords, %7
@@ -1553,8 +1553,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureSampleBias %t, %s, %coords, %bias
     ret %6
   }
@@ -1563,8 +1563,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_sample_implicit_lod %6, %coords, 1u, %bias
     ret %7
@@ -1593,8 +1593,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureSampleBias %t, %s, %coords, %bias, vec2<i32>(1i)
     ret %6
   }
@@ -1603,8 +1603,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %bias:f32):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_sample_implicit_lod %6, %coords, 9u, %bias, vec2<i32>(1i)
     ret %7
@@ -1634,8 +1634,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %bias:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %bias:f32):vec4<f32> {
+  $B1: {
     %7:vec4<f32> = textureSampleBias %t, %s, %coords, %array_idx, %bias, vec2<i32>(1i)
     ret %7
   }
@@ -1644,8 +1644,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %bias:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %bias:f32):vec4<f32> {
+  $B1: {
     %7:spirv.sampled_image<texture_2d_array<f32>> = spirv.sampled_image %t, %s
     %8:f32 = convert %array_idx
     %9:vec3<f32> = construct %coords, %8
@@ -1675,8 +1675,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:f32 = textureSampleCompare %t, %s, %coords, %dref
     ret %6
   }
@@ -1685,8 +1685,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:spirv.sampled_image<texture_depth_2d> = spirv.sampled_image %t, %s
     %7:f32 = spirv.image_sample_dref_implicit_lod %6, %coords, %dref, 0u
     ret %7
@@ -1715,8 +1715,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:f32 = textureSampleCompare %t, %s, %coords, %dref, vec2<i32>(1i)
     ret %6
   }
@@ -1725,8 +1725,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:spirv.sampled_image<texture_depth_2d> = spirv.sampled_image %t, %s
     %7:f32 = spirv.image_sample_dref_implicit_lod %6, %coords, %dref, 8u, vec2<i32>(1i)
     ret %7
@@ -1756,8 +1756,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 {
+  $B1: {
     %7:f32 = textureSampleCompare %t, %s, %coords, %array_idx, %bias, vec2<i32>(1i)
     ret %7
   }
@@ -1766,8 +1766,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 {
+  $B1: {
     %7:spirv.sampled_image<texture_depth_2d_array> = spirv.sampled_image %t, %s
     %8:f32 = convert %array_idx
     %9:vec3<f32> = construct %coords, %8
@@ -1798,8 +1798,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:f32 = textureSampleCompareLevel %t, %s, %coords, %dref
     ret %6
   }
@@ -1808,8 +1808,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:spirv.sampled_image<texture_depth_2d> = spirv.sampled_image %t, %s
     %7:f32 = spirv.image_sample_dref_explicit_lod %6, %coords, %dref, 2u, 0.0f
     ret %7
@@ -1838,8 +1838,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:f32 = textureSampleCompareLevel %t, %s, %coords, %dref, vec2<i32>(1i)
     ret %6
   }
@@ -1848,8 +1848,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %dref:f32):f32 {
+  $B1: {
     %6:spirv.sampled_image<texture_depth_2d> = spirv.sampled_image %t, %s
     %7:f32 = spirv.image_sample_dref_explicit_lod %6, %coords, %dref, 10u, 0.0f, vec2<i32>(1i)
     ret %7
@@ -1879,8 +1879,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 {
+  $B1: {
     %7:f32 = textureSampleCompareLevel %t, %s, %coords, %array_idx, %bias, vec2<i32>(1i)
     ret %7
   }
@@ -1889,8 +1889,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:i32, %bias:f32):f32 {
+  $B1: {
     %7:spirv.sampled_image<texture_depth_2d_array> = spirv.sampled_image %t, %s
     %8:f32 = convert %array_idx
     %9:vec3<f32> = construct %coords, %8
@@ -1922,8 +1922,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> {
+  $B1: {
     %7:vec4<f32> = textureSampleGrad %t, %s, %coords, %ddx, %ddy
     ret %7
   }
@@ -1932,8 +1932,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> {
+  $B1: {
     %7:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %8:vec4<f32> = spirv.image_sample_explicit_lod %7, %coords, 4u, %ddx, %ddy
     ret %8
@@ -1963,8 +1963,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> {
+  $B1: {
     %7:vec4<f32> = textureSampleGrad %t, %s, %coords, %ddx, %ddy, vec2<i32>(1i)
     ret %7
   }
@@ -1973,8 +1973,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> {
+  $B1: {
     %7:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %8:vec4<f32> = spirv.image_sample_explicit_lod %7, %coords, 12u, %ddx, %ddy, vec2<i32>(1i)
     ret %8
@@ -2005,8 +2005,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> {
+  $B1: {
     %8:vec4<f32> = textureSampleGrad %t, %s, %coords, %array_idx, %ddx, %ddy, vec2<i32>(1i)
     ret %8
   }
@@ -2015,8 +2015,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %ddx:vec2<f32>, %ddy:vec2<f32>):vec4<f32> {
+  $B1: {
     %8:spirv.sampled_image<texture_2d_array<f32>> = spirv.sampled_image %t, %s
     %9:f32 = convert %array_idx
     %10:vec3<f32> = construct %coords, %9
@@ -2047,8 +2047,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureSampleLevel %t, %s, %coords, %lod
     ret %6
   }
@@ -2057,8 +2057,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_sample_explicit_lod %6, %coords, 2u, %lod
     ret %7
@@ -2087,8 +2087,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureSampleLevel %t, %s, %coords, %lod, vec2<i32>(1i)
     ret %6
   }
@@ -2097,8 +2097,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>, %lod:f32):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_sample_explicit_lod %6, %coords, 10u, %lod, vec2<i32>(1i)
     ret %7
@@ -2128,8 +2128,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %lod:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %lod:f32):vec4<f32> {
+  $B1: {
     %7:vec4<f32> = textureSampleLevel %t, %s, %coords, %array_idx, %lod, vec2<i32>(1i)
     ret %7
   }
@@ -2138,8 +2138,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %lod:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %coords:vec2<f32>, %array_idx:i32, %lod:f32):vec4<f32> {
+  $B1: {
     %7:spirv.sampled_image<texture_2d_array<f32>> = spirv.sampled_image %t, %s
     %8:f32 = convert %array_idx
     %9:vec3<f32> = construct %coords, %8
@@ -2170,8 +2170,8 @@
     });
 
     auto* src = R"(
-%foo = func(%component:i32, %t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%component:i32, %t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureGather %component, %t, %s, %coords
     ret %6
   }
@@ -2180,8 +2180,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%component:i32, %t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%component:i32, %t:texture_2d<f32>, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_gather %6, %coords, %component, 0u
     ret %7
@@ -2210,8 +2210,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %component:i32, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %component:i32, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureGather %component, %t, %s, %coords, vec2<i32>(1i)
     ret %6
   }
@@ -2220,8 +2220,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %s:sampler, %component:i32, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %s:sampler, %component:i32, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_2d<f32>> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_gather %6, %coords, %component, 8u, vec2<i32>(1i)
     ret %7
@@ -2251,8 +2251,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %component:i32, %coords:vec2<f32>, %array_idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %component:i32, %coords:vec2<f32>, %array_idx:i32):vec4<f32> {
+  $B1: {
     %7:vec4<f32> = textureGather %component, %t, %s, %coords, %array_idx, vec2<i32>(1i)
     ret %7
   }
@@ -2261,8 +2261,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>, %s:sampler, %component:i32, %coords:vec2<f32>, %array_idx:i32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>, %s:sampler, %component:i32, %coords:vec2<f32>, %array_idx:i32):vec4<f32> {
+  $B1: {
     %7:spirv.sampled_image<texture_2d_array<f32>> = spirv.sampled_image %t, %s
     %8:f32 = convert %array_idx
     %9:vec3<f32> = construct %coords, %8
@@ -2291,8 +2291,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = textureGather %t, %s, %coords
     ret %5
   }
@@ -2301,8 +2301,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler, %coords:vec2<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler, %coords:vec2<f32>):vec4<f32> {
+  $B1: {
     %5:spirv.sampled_image<texture_depth_2d> = spirv.sampled_image %t, %s
     %6:vec4<f32> = spirv.image_gather %5, %coords, 0u, 0u
     ret %6
@@ -2331,8 +2331,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureGatherCompare %t, %s, %coords, %depth
     ret %6
   }
@@ -2341,8 +2341,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_depth_2d> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_dref_gather %6, %coords, %depth, 0u
     ret %7
@@ -2371,8 +2371,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> {
+  $B1: {
     %6:vec4<f32> = textureGatherCompare %t, %s, %coords, %depth, vec2<i32>(1i)
     ret %6
   }
@@ -2381,8 +2381,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d, %s:sampler_comparison, %coords:vec2<f32>, %depth:f32):vec4<f32> {
+  $B1: {
     %6:spirv.sampled_image<texture_depth_2d> = spirv.sampled_image %t, %s
     %7:vec4<f32> = spirv.image_dref_gather %6, %coords, %depth, 8u, vec2<i32>(1i)
     ret %7
@@ -2412,8 +2412,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:u32, %depth:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:u32, %depth:f32):vec4<f32> {
+  $B1: {
     %7:vec4<f32> = textureGatherCompare %t, %s, %coords, %array_idx, %depth
     ret %7
   }
@@ -2422,8 +2422,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:u32, %depth:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array, %s:sampler_comparison, %coords:vec2<f32>, %array_idx:u32, %depth:f32):vec4<f32> {
+  $B1: {
     %7:spirv.sampled_image<texture_depth_2d_array> = spirv.sampled_image %t, %s
     %8:f32 = convert %array_idx
     %9:vec3<f32> = construct %coords, %8
@@ -2455,8 +2455,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_storage_2d<r32uint, write>, %coords:vec2<i32>, %texel:vec4<u32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d<r32uint, write>, %coords:vec2<i32>, %texel:vec4<u32>):void {
+  $B1: {
     %5:void = textureStore %t, %coords, %texel
     ret
   }
@@ -2465,8 +2465,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_storage_2d<r32uint, write>, %coords:vec2<i32>, %texel:vec4<u32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d<r32uint, write>, %coords:vec2<i32>, %texel:vec4<u32>):void {
+  $B1: {
     %5:void = spirv.image_write %t, %coords, %texel, 0u
     ret
   }
@@ -2496,8 +2496,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_storage_2d_array<rgba8sint, write>, %coords:vec2<i32>, %array_idx:i32, %texel:vec4<i32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d_array<rgba8sint, write>, %coords:vec2<i32>, %array_idx:i32, %texel:vec4<i32>):void {
+  $B1: {
     %6:void = textureStore %t, %coords, %array_idx, %texel
     ret
   }
@@ -2506,8 +2506,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_storage_2d_array<rgba8sint, write>, %coords:vec2<i32>, %array_idx:i32, %texel:vec4<i32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d_array<rgba8sint, write>, %coords:vec2<i32>, %array_idx:i32, %texel:vec4<i32>):void {
+  $B1: {
     %6:vec3<i32> = construct %coords, %array_idx
     %7:void = spirv.image_write %t, %6, %texel, 0u
     ret
@@ -2538,8 +2538,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_storage_2d_array<rgba32uint, write>, %coords:vec2<i32>, %array_idx:u32, %texel:vec4<u32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d_array<rgba32uint, write>, %coords:vec2<i32>, %array_idx:u32, %texel:vec4<u32>):void {
+  $B1: {
     %6:void = textureStore %t, %coords, %array_idx, %texel
     ret
   }
@@ -2548,8 +2548,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_storage_2d_array<rgba32uint, write>, %coords:vec2<i32>, %array_idx:u32, %texel:vec4<u32>):void -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d_array<rgba32uint, write>, %coords:vec2<i32>, %array_idx:u32, %texel:vec4<u32>):void {
+  $B1: {
     %6:i32 = convert %array_idx
     %7:vec3<i32> = construct %coords, %6
     %8:void = spirv.image_write %t, %7, %texel, 0u
@@ -2575,8 +2575,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = textureDimensions %t
     ret %3
   }
@@ -2585,8 +2585,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = spirv.image_query_size_lod %t, 0u
     ret %3
   }
@@ -2611,8 +2611,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d<f32>, %lod:i32):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %lod:i32):vec2<u32> {
+  $B1: {
     %4:vec2<u32> = textureDimensions %t, %lod
     ret %4
   }
@@ -2621,8 +2621,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d<f32>, %lod:i32):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d<f32>, %lod:i32):vec2<u32> {
+  $B1: {
     %4:vec2<u32> = spirv.image_query_size_lod %t, %lod
     ret %4
   }
@@ -2646,8 +2646,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = textureDimensions %t
     ret %3
   }
@@ -2656,8 +2656,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>):vec2<u32> {
+  $B1: {
     %3:vec3<u32> = spirv.image_query_size_lod %t, 0u
     %4:vec2<u32> = swizzle %3, xy
     ret %4
@@ -2682,8 +2682,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_multisampled_2d<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_multisampled_2d<f32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = textureDimensions %t
     ret %3
   }
@@ -2692,8 +2692,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_multisampled_2d<f32>):vec2<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_multisampled_2d<f32>):vec2<u32> {
+  $B1: {
     %3:vec2<u32> = spirv.image_query_size %t
     ret %3
   }
@@ -2717,8 +2717,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_2d_array<f32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>):u32 {
+  $B1: {
     %3:u32 = textureNumLayers %t
     ret %3
   }
@@ -2727,8 +2727,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_2d_array<f32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_2d_array<f32>):u32 {
+  $B1: {
     %3:vec3<u32> = spirv.image_query_size_lod %t, 0u
     %4:u32 = access %3, 2u
     ret %4
@@ -2753,8 +2753,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_cube_array<f32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_cube_array<f32>):u32 {
+  $B1: {
     %3:u32 = textureNumLayers %t
     ret %3
   }
@@ -2763,8 +2763,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_cube_array<f32>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_cube_array<f32>):u32 {
+  $B1: {
     %3:vec3<u32> = spirv.image_query_size_lod %t, 0u
     %4:u32 = access %3, 2u
     ret %4
@@ -2789,8 +2789,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_2d_array):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array):u32 {
+  $B1: {
     %3:u32 = textureNumLayers %t
     ret %3
   }
@@ -2799,8 +2799,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_2d_array):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_2d_array):u32 {
+  $B1: {
     %3:vec3<u32> = spirv.image_query_size_lod %t, 0u
     %4:u32 = access %3, 2u
     ret %4
@@ -2825,8 +2825,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_depth_cube_array):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_cube_array):u32 {
+  $B1: {
     %3:u32 = textureNumLayers %t
     ret %3
   }
@@ -2835,8 +2835,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_depth_cube_array):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_depth_cube_array):u32 {
+  $B1: {
     %3:vec3<u32> = spirv.image_query_size_lod %t, 0u
     %4:u32 = access %3, 2u
     ret %4
@@ -2864,8 +2864,8 @@
     });
 
     auto* src = R"(
-%foo = func(%t:texture_storage_2d_array<r32float, write>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d_array<r32float, write>):u32 {
+  $B1: {
     %3:u32 = textureNumLayers %t
     ret %3
   }
@@ -2874,8 +2874,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%t:texture_storage_2d_array<r32float, write>):u32 -> %b1 {
-  %b1 = block {
+%foo = func(%t:texture_storage_2d_array<r32float, write>):u32 {
+  $B1: {
     %3:vec3<u32> = spirv.image_query_size %t
     %4:u32 = access %3, 2u
     ret %4
@@ -2899,8 +2899,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg:f32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%arg:f32):f32 {
+  $B1: {
     %3:f32 = quantizeToF16 %arg
     ret %3
   }
@@ -2926,8 +2926,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<f32>):vec4<f32> {
+  $B1: {
     %3:vec4<f32> = quantizeToF16 %arg
     ret %3
   }
@@ -2936,8 +2936,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:vec4<f32>):vec4<f32> {
+  $B1: {
     %3:f32 = access %arg, 0u
     %4:f32 = quantizeToF16 %3
     %5:f32 = access %arg, 1u
diff --git a/src/tint/lang/spirv/writer/raise/expand_implicit_splats_test.cc b/src/tint/lang/spirv/writer/raise/expand_implicit_splats_test.cc
index ef4afaa..3e9bb3d 100644
--- a/src/tint/lang/spirv/writer/raise/expand_implicit_splats_test.cc
+++ b/src/tint/lang/spirv/writer/raise/expand_implicit_splats_test.cc
@@ -50,8 +50,8 @@
     });
 
     auto* expect = R"(
-%foo = func(%vector:vec2<i32>):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%vector:vec2<i32>):vec2<i32> {
+  $B1: {
     %3:vec2<i32> = construct %vector
     ret %3
   }
@@ -75,8 +75,8 @@
     });
 
     auto* expect = R"(
-%foo = func(%scalar:i32, %vector:vec2<i32>):vec3<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32, %vector:vec2<i32>):vec3<i32> {
+  $B1: {
     %4:vec3<i32> = construct %scalar, %vector
     ret %4
   }
@@ -99,8 +99,8 @@
     });
 
     auto* expect = R"(
-%foo = func(%scalar:i32):vec3<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32):vec3<i32> {
+  $B1: {
     %3:vec3<i32> = construct %scalar, %scalar, %scalar
     ret %3
   }
@@ -123,8 +123,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:i32):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32):vec2<i32> {
+  $B1: {
     %3:vec2<i32> = construct %scalar
     ret %3
   }
@@ -133,8 +133,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:i32):vec2<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32):vec2<i32> {
+  $B1: {
     %3:vec2<i32> = construct %scalar, %scalar
     ret %3
   }
@@ -157,8 +157,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:u32):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:u32):vec3<u32> {
+  $B1: {
     %3:vec3<u32> = construct %scalar
     ret %3
   }
@@ -167,8 +167,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:u32):vec3<u32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:u32):vec3<u32> {
+  $B1: {
     %3:vec3<u32> = construct %scalar, %scalar, %scalar
     ret %3
   }
@@ -191,8 +191,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32):vec4<f32> {
+  $B1: {
     %3:vec4<f32> = construct %scalar
     ret %3
   }
@@ -201,8 +201,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32):vec4<f32> {
+  $B1: {
     %3:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     ret %3
   }
@@ -226,8 +226,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = add %vector, %scalar
     ret %4
   }
@@ -236,8 +236,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = add %vector, %4
     ret %5
@@ -262,8 +262,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = add %scalar, %vector
     ret %4
   }
@@ -272,8 +272,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = add %4, %vector
     ret %5
@@ -298,8 +298,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = sub %vector, %scalar
     ret %4
   }
@@ -308,8 +308,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = sub %vector, %4
     ret %5
@@ -334,8 +334,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = sub %scalar, %vector
     ret %4
   }
@@ -344,8 +344,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = sub %4, %vector
     ret %5
@@ -370,8 +370,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = div %vector, %scalar
     ret %4
   }
@@ -380,8 +380,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = div %vector, %4
     ret %5
@@ -406,8 +406,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = div %scalar, %vector
     ret %4
   }
@@ -416,8 +416,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = div %4, %vector
     ret %5
@@ -442,8 +442,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = mod %vector, %scalar
     ret %4
   }
@@ -452,8 +452,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = mod %vector, %4
     ret %5
@@ -478,8 +478,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = mod %scalar, %vector
     ret %4
   }
@@ -488,8 +488,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<f32> = mod %4, %vector
     ret %5
@@ -514,8 +514,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = mul %vector, %scalar
     ret %4
   }
@@ -524,8 +524,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = spirv.vector_times_scalar %vector, %scalar
     ret %4
   }
@@ -549,8 +549,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = mul %scalar, %vector
     ret %4
   }
@@ -559,8 +559,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:f32, %vector:vec4<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = spirv.vector_times_scalar %vector, %scalar
     ret %4
   }
@@ -584,8 +584,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = mul %vector, %scalar
     ret %4
   }
@@ -594,8 +594,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<i32> = mul %vector, %4
     ret %5
@@ -620,8 +620,8 @@
     });
 
     auto* src = R"(
-%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = mul %scalar, %vector
     ret %4
   }
@@ -630,8 +630,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> -> %b1 {
-  %b1 = block {
+%foo = func(%scalar:i32, %vector:vec4<i32>):vec4<i32> {
+  $B1: {
     %4:vec4<i32> = construct %scalar, %scalar, %scalar, %scalar
     %5:vec4<i32> = mul %4, %vector
     ret %5
@@ -657,8 +657,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>, %factor:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>, %factor:f32):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = mix %arg1, %arg2, %factor
     ret %5
   }
@@ -667,8 +667,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>, %factor:f32):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec4<f32>, %arg2:vec4<f32>, %factor:f32):vec4<f32> {
+  $B1: {
     %5:vec4<f32> = construct %factor, %factor, %factor, %factor
     %6:vec4<f32> = mix %arg1, %arg2, %5
     ret %6
diff --git a/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic_test.cc b/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic_test.cc
index 89a025d..835a4e1 100644
--- a/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic_test.cc
+++ b/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic_test.cc
@@ -52,8 +52,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat2x3<f32>, %arg2:mat2x3<f32>):mat2x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat2x3<f32>, %arg2:mat2x3<f32>):mat2x3<f32> {
+  $B1: {
     %4:mat2x3<f32> = add %arg1, %arg2
     ret %4
   }
@@ -62,8 +62,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat2x3<f32>, %arg2:mat2x3<f32>):mat2x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat2x3<f32>, %arg2:mat2x3<f32>):mat2x3<f32> {
+  $B1: {
     %4:vec3<f32> = access %arg1, 0u
     %5:vec3<f32> = access %arg2, 0u
     %6:vec3<f32> = add %4, %5
@@ -93,8 +93,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat4x2<f16>, %arg2:mat4x2<f16>):mat4x2<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat4x2<f16>, %arg2:mat4x2<f16>):mat4x2<f16> {
+  $B1: {
     %4:mat4x2<f16> = add %arg1, %arg2
     ret %4
   }
@@ -103,8 +103,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat4x2<f16>, %arg2:mat4x2<f16>):mat4x2<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat4x2<f16>, %arg2:mat4x2<f16>):mat4x2<f16> {
+  $B1: {
     %4:vec2<f16> = access %arg1, 0u
     %5:vec2<f16> = access %arg2, 0u
     %6:vec2<f16> = add %4, %5
@@ -140,8 +140,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat3x2<f32>, %arg2:mat3x2<f32>):mat3x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat3x2<f32>, %arg2:mat3x2<f32>):mat3x2<f32> {
+  $B1: {
     %4:mat3x2<f32> = sub %arg1, %arg2
     ret %4
   }
@@ -150,8 +150,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat3x2<f32>, %arg2:mat3x2<f32>):mat3x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat3x2<f32>, %arg2:mat3x2<f32>):mat3x2<f32> {
+  $B1: {
     %4:vec2<f32> = access %arg1, 0u
     %5:vec2<f32> = access %arg2, 0u
     %6:vec2<f32> = sub %4, %5
@@ -184,8 +184,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat2x4<f16>, %arg2:mat2x4<f16>):mat2x4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat2x4<f16>, %arg2:mat2x4<f16>):mat2x4<f16> {
+  $B1: {
     %4:mat2x4<f16> = sub %arg1, %arg2
     ret %4
   }
@@ -194,8 +194,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat2x4<f16>, %arg2:mat2x4<f16>):mat2x4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat2x4<f16>, %arg2:mat2x4<f16>):mat2x4<f16> {
+  $B1: {
     %4:vec4<f16> = access %arg1, 0u
     %5:vec4<f16> = access %arg2, 0u
     %6:vec4<f16> = sub %4, %5
@@ -225,8 +225,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat2x3<f32>, %arg2:f32):mat2x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat2x3<f32>, %arg2:f32):mat2x3<f32> {
+  $B1: {
     %4:mat2x3<f32> = mul %arg1, %arg2
     ret %4
   }
@@ -235,8 +235,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat2x3<f32>, %arg2:f32):mat2x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat2x3<f32>, %arg2:f32):mat2x3<f32> {
+  $B1: {
     %4:mat2x3<f32> = spirv.matrix_times_scalar %arg1, %arg2
     ret %4
   }
@@ -260,8 +260,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat3x4<f32>, %arg2:vec3<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat3x4<f32>, %arg2:vec3<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = mul %arg1, %arg2
     ret %4
   }
@@ -270,8 +270,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat3x4<f32>, %arg2:vec3<f32>):vec4<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat3x4<f32>, %arg2:vec3<f32>):vec4<f32> {
+  $B1: {
     %4:vec4<f32> = spirv.matrix_times_vector %arg1, %arg2
     ret %4
   }
@@ -295,8 +295,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat4x2<f32>, %arg2:mat2x4<f32>):mat2x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat4x2<f32>, %arg2:mat2x4<f32>):mat2x2<f32> {
+  $B1: {
     %4:mat2x2<f32> = mul %arg1, %arg2
     ret %4
   }
@@ -305,8 +305,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat4x2<f32>, %arg2:mat2x4<f32>):mat2x2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat4x2<f32>, %arg2:mat2x4<f32>):mat2x2<f32> {
+  $B1: {
     %4:mat2x2<f32> = spirv.matrix_times_matrix %arg1, %arg2
     ret %4
   }
@@ -330,8 +330,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:f16, %arg2:mat3x2<f16>):mat3x2<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:f16, %arg2:mat3x2<f16>):mat3x2<f16> {
+  $B1: {
     %4:mat3x2<f16> = mul %arg1, %arg2
     ret %4
   }
@@ -340,8 +340,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:f16, %arg2:mat3x2<f16>):mat3x2<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:f16, %arg2:mat3x2<f16>):mat3x2<f16> {
+  $B1: {
     %4:mat3x2<f16> = spirv.matrix_times_scalar %arg2, %arg1
     ret %4
   }
@@ -365,8 +365,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:vec3<f16>, %arg2:mat4x3<f16>):vec4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec3<f16>, %arg2:mat4x3<f16>):vec4<f16> {
+  $B1: {
     %4:vec4<f16> = mul %arg1, %arg2
     ret %4
   }
@@ -375,8 +375,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:vec3<f16>, %arg2:mat4x3<f16>):vec4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:vec3<f16>, %arg2:mat4x3<f16>):vec4<f16> {
+  $B1: {
     %4:vec4<f16> = spirv.vector_times_matrix %arg1, %arg2
     ret %4
   }
@@ -400,8 +400,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg1:mat3x3<f16>, %arg2:mat3x3<f16>):mat3x3<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat3x3<f16>, %arg2:mat3x3<f16>):mat3x3<f16> {
+  $B1: {
     %4:mat3x3<f16> = mul %arg1, %arg2
     ret %4
   }
@@ -410,8 +410,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg1:mat3x3<f16>, %arg2:mat3x3<f16>):mat3x3<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg1:mat3x3<f16>, %arg2:mat3x3<f16>):mat3x3<f16> {
+  $B1: {
     %4:mat3x3<f16> = spirv.matrix_times_matrix %arg1, %arg2
     ret %4
   }
@@ -434,8 +434,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg:mat2x3<f32>):mat2x3<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat2x3<f32>):mat2x3<f16> {
+  $B1: {
     %3:mat2x3<f16> = convert %arg
     ret %3
   }
@@ -444,8 +444,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:mat2x3<f32>):mat2x3<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat2x3<f32>):mat2x3<f16> {
+  $B1: {
     %3:vec3<f32> = access %arg, 0u
     %4:vec3<f16> = convert %3
     %5:vec3<f32> = access %arg, 1u
@@ -472,8 +472,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg:mat4x4<f32>):mat4x4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat4x4<f32>):mat4x4<f16> {
+  $B1: {
     %3:mat4x4<f16> = convert %arg
     ret %3
   }
@@ -482,8 +482,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:mat4x4<f32>):mat4x4<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat4x4<f32>):mat4x4<f16> {
+  $B1: {
     %3:vec4<f32> = access %arg, 0u
     %4:vec4<f16> = convert %3
     %5:vec4<f32> = access %arg, 1u
@@ -514,8 +514,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg:mat4x3<f16>):mat4x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat4x3<f16>):mat4x3<f32> {
+  $B1: {
     %3:mat4x3<f32> = convert %arg
     ret %3
   }
@@ -524,8 +524,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:mat4x3<f16>):mat4x3<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat4x3<f16>):mat4x3<f32> {
+  $B1: {
     %3:vec3<f16> = access %arg, 0u
     %4:vec3<f32> = convert %3
     %5:vec3<f16> = access %arg, 1u
@@ -556,8 +556,8 @@
     });
 
     auto* src = R"(
-%foo = func(%arg:mat2x2<f32>):mat2x2<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat2x2<f32>):mat2x2<f16> {
+  $B1: {
     %3:mat2x2<f16> = convert %arg
     ret %3
   }
@@ -566,8 +566,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%arg:mat2x2<f32>):mat2x2<f16> -> %b1 {
-  %b1 = block {
+%foo = func(%arg:mat2x2<f32>):mat2x2<f16> {
+  $B1: {
     %3:vec2<f32> = access %arg, 0u
     %4:vec2<f16> = convert %3
     %5:vec2<f32> = access %arg, 1u
diff --git a/src/tint/lang/spirv/writer/raise/merge_return_test.cc b/src/tint/lang/spirv/writer/raise/merge_return_test.cc
index cc18a71..75998f5 100644
--- a/src/tint/lang/spirv/writer/raise/merge_return_test.cc
+++ b/src/tint/lang/spirv/writer/raise/merge_return_test.cc
@@ -47,8 +47,8 @@
     b.Append(func->Block(), [&] { b.Return(func, b.Add(ty.i32(), in, 1_i)); });
 
     auto* src = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:i32):i32 {
+  $B1: {
     %3:i32 = add %2, 1i
     ret %3
   }
@@ -78,14 +78,14 @@
         b.Return(func, ifelse->Result(0));
     });
     auto* src = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
-    %3:i32 = if %4 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:i32):i32 {
+  $B1: {
+    %3:i32 = if %4 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         %5:i32 = add %2, 1i
         exit_if %5  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         %6:i32 = add %2, 2i
         exit_if %6  # if_1
       }
@@ -125,24 +125,24 @@
     });
 
     auto* src = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
-    switch %2 [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+%foo = func(%2:i32):i32 {
+  $B1: {
+    switch %2 [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         exit_switch  # switch_1
       }
     }
-    loop [b: %b3] {  # loop_1
-      %b3 = block {  # body
+    loop [b: $B3] {  # loop_1
+      $B3: {  # body
         exit_loop  # loop_1
       }
     }
-    %3:i32 = if %4 [t: %b4, f: %b5] {  # if_1
-      %b4 = block {  # true
+    %3:i32 = if %4 [t: $B4, f: $B5] {  # if_1
+      $B4: {  # true
         %5:i32 = add %2, 1i
         exit_if %5  # if_1
       }
-      %b5 = block {  # false
+      $B5: {  # false
         %6:i32 = add %2, 2i
         exit_if %6  # if_1
       }
@@ -174,13 +174,13 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
@@ -191,13 +191,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         exit_if  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
@@ -227,13 +227,13 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
@@ -244,13 +244,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         exit_if  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
@@ -278,13 +278,13 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):i32 -> %b1 {
-  %b1 = block {
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):i32 {
+  $B1: {
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret 1i
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
@@ -295,23 +295,23 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:bool):i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         store %continue_execution, false
         store %return_value, 1i
         exit_if  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %5 [t: $B4] {  # if_2
+      $B4: {  # true
         store %return_value, 2i
         exit_if  # if_2
       }
@@ -342,13 +342,13 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):i32 -> %b1 {
-  %b1 = block {
-    %3:i32 = if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):i32 {
+  $B1: {
+    %3:i32 = if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret 1i
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if 2i  # if_1
       }
     }
@@ -359,23 +359,23 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:bool):i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    %5:i32 = if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+    %5:i32 = if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         store %continue_execution, false
         store %return_value, 1i
         exit_if undef  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if 2i  # if_1
       }
     }
     %6:bool = load %continue_execution
-    if %6 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %6 [t: $B4] {  # if_2
+      $B4: {  # true
         store %return_value, %5
         exit_if  # if_2
       }
@@ -407,13 +407,13 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):i32 -> %b1 {
-  %b1 = block {
-    %3:i32 = if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):i32 {
+  $B1: {
+    %3:i32 = if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret 1i
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if undef  # if_1
       }
     }
@@ -424,23 +424,23 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:bool):i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    %5:i32 = if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+    %5:i32 = if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         store %continue_execution, false
         store %return_value, 1i
         exit_if undef  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if undef  # if_1
       }
     }
     %6:bool = load %continue_execution
-    if %6 [t: %b4] {  # if_2
-      %b4 = block {  # true
+    if %6 [t: $B4] {  # if_2
+      $B4: {  # true
         store %return_value, %5
         exit_if  # if_2
       }
@@ -470,13 +470,13 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -488,13 +488,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         exit_if  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
@@ -533,21 +533,21 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    %3:i32, %4:f32 = if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
-        if %2 [t: %b4, f: %b5] {  # if_2
-          %b4 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    %3:i32, %4:f32 = if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
+        if %2 [t: $B4, f: $B5] {  # if_2
+          $B4: {  # true
             ret
           }
-          %b5 = block {  # false
+          $B5: {  # false
             ret
           }
         }
         unreachable
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -559,21 +559,21 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    %3:i32, %4:f32 = if %2 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
-        if %2 [t: %b4, f: %b5] {  # if_2
-          %b4 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    %3:i32, %4:f32 = if %2 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
+        if %2 [t: $B4, f: $B5] {  # if_2
+          $B4: {  # true
             exit_if  # if_2
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_if  # if_2
           }
         }
         exit_if undef, undef  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if undef, undef  # if_1
       }
     }
@@ -608,15 +608,15 @@
     });
 
     auto* src = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
-        if %2 [t: %b3, f: %b4] {  # if_1
-          %b3 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
+        if %2 [t: $B3, f: $B4] {  # if_1
+          $B3: {  # true
             ret
           }
-          %b4 = block {  # false
+          $B4: {  # false
             ret
           }
         }
@@ -631,15 +631,15 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:bool):void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
-        if %2 [t: %b3, f: %b4] {  # if_1
-          %b3 = block {  # true
+%foo = func(%2:bool):void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
+        if %2 [t: $B3, f: $B4] {  # if_1
+          $B3: {  # true
             exit_if  # if_1
           }
-          %b4 = block {  # false
+          $B4: {  # false
             exit_if  # if_1
           }
         }
@@ -674,17 +674,17 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):void -> %b2 {
-  %b2 = block {
-    if %3 [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+%foo = func(%3:bool):void {
+  $B2: {
+    if %3 [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         ret
       }
-      %b4 = block {  # false
+      $B4: {  # false
         exit_if  # if_1
       }
     }
@@ -697,25 +697,25 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):void -> %b2 {
-  %b2 = block {
+%foo = func(%3:bool):void {
+  $B2: {
     %continue_execution:ptr<function, bool, read_write> = var, true
-    if %3 [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    if %3 [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
-      %b4 = block {  # false
+      $B4: {  # false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b5] {  # if_2
-      %b5 = block {  # true
+    if %5 [t: $B5] {  # if_2
+      $B5: {  # true
         store %1, 42i
         exit_if  # if_2
       }
@@ -750,17 +750,17 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):void -> %b2 {
-  %b2 = block {
-    if %3 [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+%foo = func(%3:bool):void {
+  $B2: {
+    if %3 [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         ret
       }
-      %b4 = block {  # false
+      $B4: {  # false
         exit_if  # if_1
       }
     }
@@ -773,25 +773,25 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):void -> %b2 {
-  %b2 = block {
+%foo = func(%3:bool):void {
+  $B2: {
     %continue_execution:ptr<function, bool, read_write> = var, true
-    if %3 [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    if %3 [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         exit_if  # if_1
       }
-      %b4 = block {  # false
+      $B4: {  # false
         exit_if  # if_1
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b5] {  # if_2
-      %b5 = block {  # true
+    if %5 [t: $B5] {  # if_2
+      $B5: {  # true
         store %1, 42i
         exit_if  # if_2
       }
@@ -838,31 +838,31 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
-  %b2 = block {
-    if %condA [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 {
+  $B2: {
+    if %condA [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         ret 3i
       }
-      %b4 = block {  # false
-        if %condB [t: %b5, f: %b6] {  # if_2
-          %b5 = block {  # true
-            if %condC [t: %b7, f: %b8] {  # if_3
-              %b7 = block {  # true
+      $B4: {  # false
+        if %condB [t: $B5, f: $B6] {  # if_2
+          $B5: {  # true
+            if %condC [t: $B7, f: $B8] {  # if_3
+              $B7: {  # true
                 ret 1i
               }
-              %b8 = block {  # false
+              $B8: {  # false
                 exit_if  # if_3
               }
             }
             store %1, 1i
             ret 2i
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_2
           }
         }
@@ -880,36 +880,36 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 {
+  $B2: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    if %condA [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    if %condA [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         store %return_value, 3i
         exit_if  # if_1
       }
-      %b4 = block {  # false
-        if %condB [t: %b5, f: %b6] {  # if_2
-          %b5 = block {  # true
-            if %condC [t: %b7, f: %b8] {  # if_3
-              %b7 = block {  # true
+      $B4: {  # false
+        if %condB [t: $B5, f: $B6] {  # if_2
+          $B5: {  # true
+            if %condC [t: $B7, f: $B8] {  # if_3
+              $B7: {  # true
                 store %continue_execution, false
                 store %return_value, 1i
                 exit_if  # if_3
               }
-              %b8 = block {  # false
+              $B8: {  # false
                 exit_if  # if_3
               }
             }
             %8:bool = load %continue_execution
-            if %8 [t: %b9] {  # if_4
-              %b9 = block {  # true
+            if %8 [t: $B9] {  # if_4
+              $B9: {  # true
                 store %1, 1i
                 store %continue_execution, false
                 store %return_value, 2i
@@ -918,13 +918,13 @@
             }
             exit_if  # if_2
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_2
           }
         }
         %9:bool = load %continue_execution
-        if %9 [t: %b10] {  # if_5
-          %b10 = block {  # true
+        if %9 [t: $B10] {  # if_5
+          $B10: {  # true
             store %1, 2i
             exit_if  # if_5
           }
@@ -933,8 +933,8 @@
       }
     }
     %10:bool = load %continue_execution
-    if %10 [t: %b11] {  # if_6
-      %b11 = block {  # true
+    if %10 [t: $B11] {  # if_6
+      $B11: {  # true
         store %1, 3i
         %11:i32 = add 5i, 6i
         store %return_value, %11
@@ -981,30 +981,30 @@
         b.Return(func, 3_i);
     });
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
-  %b2 = block {
-    if %condA [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 {
+  $B2: {
+    if %condA [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         ret 3i
       }
-      %b4 = block {  # false
-        if %condB [t: %b5, f: %b6] {  # if_2
-          %b5 = block {  # true
-            if %condC [t: %b7, f: %b8] {  # if_3
-              %b7 = block {  # true
+      $B4: {  # false
+        if %condB [t: $B5, f: $B6] {  # if_2
+          $B5: {  # true
+            if %condC [t: $B7, f: $B8] {  # if_3
+              $B7: {  # true
                 ret 1i
               }
-              %b8 = block {  # false
+              $B8: {  # false
                 exit_if  # if_3
               }
             }
             exit_if  # if_2
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_2
           }
         }
@@ -1019,36 +1019,36 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 {
+  $B2: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    if %condA [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    if %condA [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         store %return_value, 3i
         exit_if  # if_1
       }
-      %b4 = block {  # false
-        if %condB [t: %b5, f: %b6] {  # if_2
-          %b5 = block {  # true
-            if %condC [t: %b7, f: %b8] {  # if_3
-              %b7 = block {  # true
+      $B4: {  # false
+        if %condB [t: $B5, f: $B6] {  # if_2
+          $B5: {  # true
+            if %condC [t: $B7, f: $B8] {  # if_3
+              $B7: {  # true
                 store %continue_execution, false
                 store %return_value, 1i
                 exit_if  # if_3
               }
-              %b8 = block {  # false
+              $B8: {  # false
                 exit_if  # if_3
               }
             }
             exit_if  # if_2
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_2
           }
         }
@@ -1056,8 +1056,8 @@
       }
     }
     %8:bool = load %continue_execution
-    if %8 [t: %b9] {  # if_4
-      %b9 = block {  # true
+    if %8 [t: $B9] {  # if_4
+      $B9: {  # true
         store %return_value, 3i
         exit_if  # if_4
       }
@@ -1107,31 +1107,31 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
-  %b2 = block {
-    %6:i32 = if %condA [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 {
+  $B2: {
+    %6:i32 = if %condA [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         ret 3i
       }
-      %b4 = block {  # false
-        %7:i32 = if %condB [t: %b5, f: %b6] {  # if_2
-          %b5 = block {  # true
-            if %condC [t: %b7, f: %b8] {  # if_3
-              %b7 = block {  # true
+      $B4: {  # false
+        %7:i32 = if %condB [t: $B5, f: $B6] {  # if_2
+          $B5: {  # true
+            if %condC [t: $B7, f: $B8] {  # if_3
+              $B7: {  # true
                 ret 1i
               }
-              %b8 = block {  # false
+              $B8: {  # false
                 exit_if  # if_3
               }
             }
             %8:i32 = add 42i, 1i
             exit_if %8  # if_2
           }
-          %b6 = block {  # false
+          $B6: {  # false
             %9:i32 = add 43i, 2i
             exit_if %9  # if_2
           }
@@ -1149,36 +1149,36 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 {
+  $B2: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    %8:i32 = if %condA [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    %8:i32 = if %condA [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         store %continue_execution, false
         store %return_value, 3i
         exit_if undef  # if_1
       }
-      %b4 = block {  # false
-        %9:i32 = if %condB [t: %b5, f: %b6] {  # if_2
-          %b5 = block {  # true
-            if %condC [t: %b7, f: %b8] {  # if_3
-              %b7 = block {  # true
+      $B4: {  # false
+        %9:i32 = if %condB [t: $B5, f: $B6] {  # if_2
+          $B5: {  # true
+            if %condC [t: $B7, f: $B8] {  # if_3
+              $B7: {  # true
                 store %continue_execution, false
                 store %return_value, 1i
                 exit_if  # if_3
               }
-              %b8 = block {  # false
+              $B8: {  # false
                 exit_if  # if_3
               }
             }
             %10:bool = load %continue_execution
-            %11:i32 = if %10 [t: %b9] {  # if_4
-              %b9 = block {  # true
+            %11:i32 = if %10 [t: $B9] {  # if_4
+              $B9: {  # true
                 %12:i32 = add 42i, 1i
                 exit_if %12  # if_4
               }
@@ -1186,14 +1186,14 @@
             }
             exit_if %11  # if_2
           }
-          %b6 = block {  # false
+          $B6: {  # false
             %13:i32 = add 43i, 2i
             exit_if %13  # if_2
           }
         }
         %14:bool = load %continue_execution
-        %15:i32 = if %14 [t: %b10] {  # if_5
-          %b10 = block {  # true
+        %15:i32 = if %14 [t: $B10] {  # if_5
+          $B10: {  # true
             %16:i32 = add %9, 1i
             exit_if %16  # if_5
           }
@@ -1203,8 +1203,8 @@
       }
     }
     %17:bool = load %continue_execution
-    if %17 [t: %b11] {  # if_6
-      %b11 = block {  # true
+    if %17 [t: $B11] {  # if_6
+      $B11: {  # true
         %18:i32 = add %8, 1i
         store %return_value, %18
         exit_if  # if_6
@@ -1243,23 +1243,23 @@
     });
 
     auto* src = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:i32):i32 {
+  $B1: {
     %3:bool = eq %2, 1i
-    if %3 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %3 [t: $B2] {  # if_1
+      $B2: {  # true
         ret 101i
       }
     }
     %4:bool = eq %2, 2i
-    if %4 [t: %b3] {  # if_2
-      %b3 = block {  # true
+    if %4 [t: $B3] {  # if_2
+      $B3: {  # true
         ret 202i
       }
     }
     %5:bool = eq %2, 3i
-    if %5 [t: %b4] {  # if_3
-      %b4 = block {  # true
+    if %5 [t: $B4] {  # if_3
+      $B4: {  # true
         ret 303i
       }
     }
@@ -1270,43 +1270,43 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:i32):i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
     %5:bool = eq %2, 1i
-    if %5 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %5 [t: $B2] {  # if_1
+      $B2: {  # true
         store %continue_execution, false
         store %return_value, 101i
         exit_if  # if_1
       }
     }
     %6:bool = load %continue_execution
-    if %6 [t: %b3] {  # if_2
-      %b3 = block {  # true
+    if %6 [t: $B3] {  # if_2
+      $B3: {  # true
         %7:bool = eq %2, 2i
-        if %7 [t: %b4] {  # if_3
-          %b4 = block {  # true
+        if %7 [t: $B4] {  # if_3
+          $B4: {  # true
             store %continue_execution, false
             store %return_value, 202i
             exit_if  # if_3
           }
         }
         %8:bool = load %continue_execution
-        if %8 [t: %b5] {  # if_4
-          %b5 = block {  # true
+        if %8 [t: $B5] {  # if_4
+          $B5: {  # true
             %9:bool = eq %2, 3i
-            if %9 [t: %b6] {  # if_5
-              %b6 = block {  # true
+            if %9 [t: $B6] {  # if_5
+              $B6: {  # true
                 store %continue_execution, false
                 store %return_value, 303i
                 exit_if  # if_5
               }
             }
             %10:bool = load %continue_execution
-            if %10 [t: %b7] {  # if_6
-              %b7 = block {  # true
+            if %10 [t: $B7] {  # if_6
+              $B7: {  # true
                 store %return_value, 404i
                 exit_if  # if_6
               }
@@ -1347,20 +1347,20 @@
     });
 
     auto* src = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:i32):i32 {
+  $B1: {
     %3:bool = eq %2, 1i
-    if %3 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %3 [t: $B2] {  # if_1
+      $B2: {  # true
         ret 101i
       }
     }
     %4:bool = eq %2, 2i
-    if %4 [t: %b3, f: %b4] {  # if_2
-      %b3 = block {  # true
+    if %4 [t: $B3, f: $B4] {  # if_2
+      $B3: {  # true
         ret 202i
       }
-      %b4 = block {  # false
+      $B4: {  # false
         ret 303i
       }
     }
@@ -1371,29 +1371,29 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:i32):i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
     %5:bool = eq %2, 1i
-    if %5 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %5 [t: $B2] {  # if_1
+      $B2: {  # true
         store %continue_execution, false
         store %return_value, 101i
         exit_if  # if_1
       }
     }
     %6:bool = load %continue_execution
-    if %6 [t: %b3] {  # if_2
-      %b3 = block {  # true
+    if %6 [t: $B3] {  # if_2
+      $B3: {  # true
         %7:bool = eq %2, 2i
-        if %7 [t: %b4, f: %b5] {  # if_3
-          %b4 = block {  # true
+        if %7 [t: $B4, f: $B5] {  # if_3
+          $B4: {  # true
             store %continue_execution, false
             store %return_value, 202i
             exit_if  # if_3
           }
-          %b5 = block {  # false
+          $B5: {  # false
             store %continue_execution, false
             store %return_value, 303i
             exit_if  # if_3
@@ -1423,10 +1423,10 @@
         b.Unreachable();
     });
     auto* src = R"(
-%foo = func():i32 -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+%foo = func():i32 {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         ret 42i
       }
     }
@@ -1437,11 +1437,11 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():i32 -> %b1 {
-  %b1 = block {
+%foo = func():i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         store %return_value, 42i
         exit_loop  # loop_1
       }
@@ -1486,28 +1486,28 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):i32 -> %b2 {
-  %b2 = block {
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        if %3 [t: %b5, f: %b6] {  # if_1
-          %b5 = block {  # true
+%foo = func(%3:bool):i32 {
+  $B2: {
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        if %3 [t: $B5, f: $B6] {  # if_1
+          $B5: {  # true
             ret 42i
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_1
           }
         }
         store %1, 2i
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         store %1, 1i
-        break_if true %b3
+        break_if true  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     store %1, 3i
@@ -1518,43 +1518,43 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%3:bool):i32 {
+  $B2: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        if %3 [t: %b5, f: %b6] {  # if_1
-          %b5 = block {  # true
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        if %3 [t: $B5, f: $B6] {  # if_1
+          $B5: {  # true
             store %continue_execution, false
             store %return_value, 42i
             exit_if  # if_1
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_1
           }
         }
         %6:bool = load %continue_execution
-        if %6 [t: %b7] {  # if_2
-          %b7 = block {  # true
+        if %6 [t: $B7] {  # if_2
+          $B7: {  # true
             store %1, 2i
-            continue %b4
+            continue  # -> $B4
           }
         }
         exit_loop  # loop_1
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         store %1, 1i
-        break_if true %b3
+        break_if true  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     %7:bool = load %continue_execution
-    if %7 [t: %b8] {  # if_3
-      %b8 = block {  # true
+    if %7 [t: $B8] {  # if_3
+      $B8: {  # true
         store %1, 3i
         store %return_value, 43i
         exit_if  # if_3
@@ -1600,28 +1600,28 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):i32 -> %b2 {
-  %b2 = block {
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        if %3 [t: %b5, f: %b6] {  # if_1
-          %b5 = block {  # true
+%foo = func(%3:bool):i32 {
+  $B2: {
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        if %3 [t: $B5, f: $B6] {  # if_1
+          $B5: {  # true
             ret 42i
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_1
           }
         }
         store %1, 2i
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         store %1, 1i
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
     }
     unreachable
@@ -1631,38 +1631,38 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:bool):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%3:bool):i32 {
+  $B2: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    loop [b: %b3, c: %b4] {  # loop_1
-      %b3 = block {  # body
-        if %3 [t: %b5, f: %b6] {  # if_1
-          %b5 = block {  # true
+    loop [b: $B3, c: $B4] {  # loop_1
+      $B3: {  # body
+        if %3 [t: $B5, f: $B6] {  # if_1
+          $B5: {  # true
             store %continue_execution, false
             store %return_value, 42i
             exit_if  # if_1
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_1
           }
         }
         %6:bool = load %continue_execution
-        if %6 [t: %b7] {  # if_2
-          %b7 = block {  # true
+        if %6 [t: $B7] {  # if_2
+          $B7: {  # true
             store %1, 2i
-            continue %b4
+            continue  # -> $B4
           }
         }
         exit_loop  # loop_1
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         store %1, 1i
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
     }
     %7:i32 = load %return_value
@@ -1804,13 +1804,13 @@
     });
 
     auto* src = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
-    switch %2 [c: (1i, %b2), c: (default, %b3)] {  # switch_1
-      %b2 = block {  # case
+%foo = func(%2:i32):i32 {
+  $B1: {
+    switch %2 [c: (1i, $B2), c: (default, $B3)] {  # switch_1
+      $B2: {  # case
         ret 42i
       }
-      %b3 = block {  # case
+      $B3: {  # case
         exit_switch  # switch_1
       }
     }
@@ -1821,23 +1821,23 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:i32):i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    switch %2 [c: (1i, %b2), c: (default, %b3)] {  # switch_1
-      %b2 = block {  # case
+    switch %2 [c: (1i, $B2), c: (default, $B3)] {  # switch_1
+      $B2: {  # case
         store %continue_execution, false
         store %return_value, 42i
         exit_switch  # switch_1
       }
-      %b3 = block {  # case
+      $B3: {  # case
         exit_switch  # switch_1
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b4] {  # if_1
-      %b4 = block {  # true
+    if %5 [t: $B4] {  # if_1
+      $B4: {  # true
         store %return_value, 0i
         exit_if  # if_1
       }
@@ -1879,27 +1879,27 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:i32):i32 -> %b2 {
-  %b2 = block {
-    switch %3 [c: (1i, %b3), c: (default, %b4)] {  # switch_1
-      %b3 = block {  # case
+%foo = func(%3:i32):i32 {
+  $B2: {
+    switch %3 [c: (1i, $B3), c: (default, $B4)] {  # switch_1
+      $B3: {  # case
         %4:bool = eq %3, 1i
-        if %4 [t: %b5, f: %b6] {  # if_1
-          %b5 = block {  # true
+        if %4 [t: $B5, f: $B6] {  # if_1
+          $B5: {  # true
             ret 42i
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_1
           }
         }
         store %1, 2i
         exit_switch  # switch_1
       }
-      %b4 = block {  # case
+      $B4: {  # case
         exit_switch  # switch_1
       }
     }
@@ -1910,43 +1910,43 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
-%foo = func(%3:i32):i32 -> %b2 {
-  %b2 = block {
+%foo = func(%3:i32):i32 {
+  $B2: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    switch %3 [c: (1i, %b3), c: (default, %b4)] {  # switch_1
-      %b3 = block {  # case
+    switch %3 [c: (1i, $B3), c: (default, $B4)] {  # switch_1
+      $B3: {  # case
         %6:bool = eq %3, 1i
-        if %6 [t: %b5, f: %b6] {  # if_1
-          %b5 = block {  # true
+        if %6 [t: $B5, f: $B6] {  # if_1
+          $B5: {  # true
             store %continue_execution, false
             store %return_value, 42i
             exit_if  # if_1
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_if  # if_1
           }
         }
         %7:bool = load %continue_execution
-        if %7 [t: %b7] {  # if_2
-          %b7 = block {  # true
+        if %7 [t: $B7] {  # if_2
+          $B7: {  # true
             store %1, 2i
             exit_switch  # switch_1
           }
         }
         exit_switch  # switch_1
       }
-      %b4 = block {  # case
+      $B4: {  # case
         exit_switch  # switch_1
       }
     }
     %8:bool = load %continue_execution
-    if %8 [t: %b8] {  # if_3
-      %b8 = block {  # true
+    if %8 [t: $B8] {  # if_3
+      $B8: {  # true
         store %return_value, 0i
         exit_if  # if_3
       }
@@ -1979,19 +1979,19 @@
     });
 
     auto* src = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
-    %3:i32 = switch %2 [c: (1i, %b2), c: (2i, %b3), c: (3i, %b4), c: (default, %b5)] {  # switch_1
-      %b2 = block {  # case
+%foo = func(%2:i32):i32 {
+  $B1: {
+    %3:i32 = switch %2 [c: (1i, $B2), c: (2i, $B3), c: (3i, $B4), c: (default, $B5)] {  # switch_1
+      $B2: {  # case
         ret 42i
       }
-      %b3 = block {  # case
+      $B3: {  # case
         ret 99i
       }
-      %b4 = block {  # case
+      $B4: {  # case
         exit_switch 1i  # switch_1
       }
-      %b5 = block {  # case
+      $B5: {  # case
         exit_switch 0i  # switch_1
       }
     }
@@ -2002,31 +2002,31 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:i32):i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    %5:i32 = switch %2 [c: (1i, %b2), c: (2i, %b3), c: (3i, %b4), c: (default, %b5)] {  # switch_1
-      %b2 = block {  # case
+    %5:i32 = switch %2 [c: (1i, $B2), c: (2i, $B3), c: (3i, $B4), c: (default, $B5)] {  # switch_1
+      $B2: {  # case
         store %continue_execution, false
         store %return_value, 42i
         exit_switch undef  # switch_1
       }
-      %b3 = block {  # case
+      $B3: {  # case
         store %continue_execution, false
         store %return_value, 99i
         exit_switch undef  # switch_1
       }
-      %b4 = block {  # case
+      $B4: {  # case
         exit_switch 1i  # switch_1
       }
-      %b5 = block {  # case
+      $B5: {  # case
         exit_switch 0i  # switch_1
       }
     }
     %6:bool = load %continue_execution
-    if %6 [t: %b6] {  # if_1
-      %b6 = block {  # true
+    if %6 [t: $B6] {  # if_1
+      $B6: {  # true
         store %return_value, %5
         exit_if  # if_1
       }
@@ -2055,16 +2055,16 @@
     });
 
     auto* src = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
-        if true [t: %b3] {  # if_1
-          %b3 = block {  # true
+%foo = func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
+        if true [t: $B3] {  # if_1
+          $B3: {  # true
             ret
           }
         }
-        continue %b4
+        continue  # -> $B4
       }
     }
     unreachable
@@ -2074,21 +2074,21 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():void -> %b1 {
-  %b1 = block {
+%foo = func():void {
+  $B1: {
     %continue_execution:ptr<function, bool, read_write> = var, true
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
-        if true [t: %b3] {  # if_1
-          %b3 = block {  # true
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
+        if true [t: $B3] {  # if_1
+          $B3: {  # true
             store %continue_execution, false
             exit_if  # if_1
           }
         }
         %3:bool = load %continue_execution
-        if %3 [t: %b4] {  # if_2
-          %b4 = block {  # true
-            continue %b5
+        if %3 [t: $B4] {  # if_2
+          $B4: {  # true
+            continue  # -> $B5
           }
         }
         exit_loop  # loop_1
@@ -2116,12 +2116,12 @@
     });
 
     auto* src = R"(
-%foo = func():i32 -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
-        if true [t: %b3] {  # if_2
-          %b3 = block {  # true
+%foo = func():i32 {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
+        if true [t: $B3] {  # if_2
+          $B3: {  # true
             ret 1i
           }
         }
@@ -2135,22 +2135,22 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%foo = func():i32 -> %b1 {
-  %b1 = block {
+%foo = func():i32 {
+  $B1: {
     %return_value:ptr<function, i32, read_write> = var
     %continue_execution:ptr<function, bool, read_write> = var, true
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
-        if true [t: %b3] {  # if_2
-          %b3 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
+        if true [t: $B3] {  # if_2
+          $B3: {  # true
             store %continue_execution, false
             store %return_value, 1i
             exit_if  # if_2
           }
         }
         %4:bool = load %continue_execution
-        if %4 [t: %b4] {  # if_3
-          %b4 = block {  # true
+        if %4 [t: $B4] {  # if_3
+          $B4: {  # true
             store %continue_execution, false
             store %return_value, 2i
             exit_if  # if_3
@@ -2160,8 +2160,8 @@
       }
     }
     %5:bool = load %continue_execution
-    if %5 [t: %b5] {  # if_4
-      %b5 = block {  # true
+    if %5 [t: $B5] {  # if_4
+      $B5: {  # true
         store %return_value, 3i
         exit_if  # if_4
       }
diff --git a/src/tint/lang/spirv/writer/raise/pass_matrix_by_pointer_test.cc b/src/tint/lang/spirv/writer/raise/pass_matrix_by_pointer_test.cc
index 5dc737d..e50d515 100644
--- a/src/tint/lang/spirv/writer/raise/pass_matrix_by_pointer_test.cc
+++ b/src/tint/lang/spirv/writer/raise/pass_matrix_by_pointer_test.cc
@@ -58,18 +58,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, array<f32, 4>, read_write> = var
 }
 
-%target = func(%value:array<f32, 4>):f32 -> %b2 {
-  %b2 = block {
+%target = func(%value:array<f32, 4>):f32 {
+  $B2: {
     %4:f32 = access %value, 1i
     ret %4
   }
 }
-%caller = func():f32 -> %b3 {
-  %b3 = block {
+%caller = func():f32 {
+  $B3: {
     %6:array<f32, 4> = load %var
     %7:f32 = call %target, %6
     ret %7
@@ -104,19 +104,19 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%target = func(%value:ptr<private, mat3x3<f32>, read_write>):vec3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value:ptr<private, mat3x3<f32>, read_write>):vec3<f32> {
+  $B2: {
     %4:ptr<private, vec3<f32>, read_write> = access %value, 1i
     %5:vec3<f32> = load %4
     ret %5
   }
 }
-%caller = func():vec3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():vec3<f32> {
+  $B3: {
     %7:vec3<f32> = call %target, %var
     ret %7
   }
@@ -142,12 +142,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%caller = func():f32 -> %b2 {
-  %b2 = block {
+%caller = func():f32 {
+  $B2: {
     %3:mat3x3<f32> = load %var
     %4:f32 = determinant %3
     ret %4
@@ -182,18 +182,18 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%target = func(%value:mat3x3<f32>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value:mat3x3<f32>):mat3x3<f32> {
+  $B2: {
     %4:mat3x3<f32> = mul %value, 2.0f
     ret %4
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %6:mat3x3<f32> = load %var
     %7:mat3x3<f32> = call %target, %6
     ret %7
@@ -203,19 +203,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%target = func(%3:ptr<function, mat3x3<f32>, read_write>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%3:ptr<function, mat3x3<f32>, read_write>):mat3x3<f32> {
+  $B2: {
     %4:mat3x3<f32> = load %3
     %5:mat3x3<f32> = mul %4, 2.0f
     ret %5
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %7:mat3x3<f32> = load %var
     %8:ptr<function, mat3x3<f32>, read_write> = var, %7
     %9:mat3x3<f32> = call %target, %8
@@ -254,19 +254,19 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, array<mat3x3<f32>, 4>, read_write> = var
 }
 
-%target = func(%value_a:mat3x3<f32>, %scalar:f32, %value_b:mat3x3<f32>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value_a:mat3x3<f32>, %scalar:f32, %value_b:mat3x3<f32>):mat3x3<f32> {
+  $B2: {
     %6:mat3x3<f32> = mul %value_a, %scalar
     %7:mat3x3<f32> = add %6, %value_b
     ret %7
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %9:ptr<private, mat3x3<f32>, read_write> = access %var, 0u
     %10:mat3x3<f32> = load %9
     %11:ptr<private, mat3x3<f32>, read_write> = access %var, 1u
@@ -279,12 +279,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, array<mat3x3<f32>, 4>, read_write> = var
 }
 
-%target = func(%3:ptr<function, mat3x3<f32>, read_write>, %scalar:f32, %5:ptr<function, mat3x3<f32>, read_write>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%3:ptr<function, mat3x3<f32>, read_write>, %scalar:f32, %5:ptr<function, mat3x3<f32>, read_write>):mat3x3<f32> {
+  $B2: {
     %6:mat3x3<f32> = load %5
     %7:mat3x3<f32> = load %3
     %8:mat3x3<f32> = mul %7, %scalar
@@ -292,8 +292,8 @@
     ret %9
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %11:ptr<private, mat3x3<f32>, read_write> = access %var, 0u
     %12:mat3x3<f32> = load %11
     %13:ptr<private, mat3x3<f32>, read_write> = access %var, 1u
@@ -331,19 +331,19 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%target = func(%value:mat3x3<f32>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value:mat3x3<f32>):mat3x3<f32> {
+  $B2: {
     %4:mat3x3<f32> = add %value, %value
     %5:mat3x3<f32> = mul %4, %value
     ret %5
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %7:mat3x3<f32> = load %var
     %8:mat3x3<f32> = call %target, %7
     ret %8
@@ -353,20 +353,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%target = func(%3:ptr<function, mat3x3<f32>, read_write>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%3:ptr<function, mat3x3<f32>, read_write>):mat3x3<f32> {
+  $B2: {
     %4:mat3x3<f32> = load %3
     %5:mat3x3<f32> = add %4, %4
     %6:mat3x3<f32> = mul %5, %4
     ret %6
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %8:mat3x3<f32> = load %var
     %9:ptr<function, mat3x3<f32>, read_write> = var, %8
     %10:mat3x3<f32> = call %target, %9
@@ -412,32 +412,32 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%target = func(%value:mat3x3<f32>, %scalar:f32):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value:mat3x3<f32>, %scalar:f32):mat3x3<f32> {
+  $B2: {
     %5:mat3x3<f32> = mul %value, %scalar
     ret %5
   }
 }
-%caller_a = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller_a = func():mat3x3<f32> {
+  $B3: {
     %7:mat3x3<f32> = load %var
     %8:mat3x3<f32> = call %target, %7, 2.0f
     ret %8
   }
 }
-%caller_b = func():mat3x3<f32> -> %b4 {
-  %b4 = block {
+%caller_b = func():mat3x3<f32> {
+  $B4: {
     %10:mat3x3<f32> = load %var
     %11:mat3x3<f32> = call %target, %10, 3.0f
     ret %11
   }
 }
-%caller_c = func():mat3x3<f32> -> %b5 {
-  %b5 = block {
+%caller_c = func():mat3x3<f32> {
+  $B5: {
     %13:mat3x3<f32> = load %var
     %14:mat3x3<f32> = call %target, %13, 4.0f
     ret %14
@@ -447,35 +447,35 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, mat3x3<f32>, read_write> = var
 }
 
-%target = func(%3:ptr<function, mat3x3<f32>, read_write>, %scalar:f32):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%3:ptr<function, mat3x3<f32>, read_write>, %scalar:f32):mat3x3<f32> {
+  $B2: {
     %5:mat3x3<f32> = load %3
     %6:mat3x3<f32> = mul %5, %scalar
     ret %6
   }
 }
-%caller_a = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller_a = func():mat3x3<f32> {
+  $B3: {
     %8:mat3x3<f32> = load %var
     %9:ptr<function, mat3x3<f32>, read_write> = var, %8
     %10:mat3x3<f32> = call %target, %9, 2.0f
     ret %10
   }
 }
-%caller_b = func():mat3x3<f32> -> %b4 {
-  %b4 = block {
+%caller_b = func():mat3x3<f32> {
+  $B4: {
     %12:mat3x3<f32> = load %var
     %13:ptr<function, mat3x3<f32>, read_write> = var, %12
     %14:mat3x3<f32> = call %target, %13, 3.0f
     ret %14
   }
 }
-%caller_c = func():mat3x3<f32> -> %b5 {
-  %b5 = block {
+%caller_c = func():mat3x3<f32> {
+  $B5: {
     %16:mat3x3<f32> = load %var
     %17:ptr<function, mat3x3<f32>, read_write> = var, %16
     %18:mat3x3<f32> = call %target, %17, 4.0f
@@ -511,20 +511,20 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, array<mat3x3<f32>, 2>, read_write> = var
 }
 
-%target = func(%value:array<mat3x3<f32>, 2>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value:array<mat3x3<f32>, 2>):mat3x3<f32> {
+  $B2: {
     %4:mat3x3<f32> = access %value, 0u
     %5:mat3x3<f32> = access %value, 1u
     %6:mat3x3<f32> = add %4, %5
     ret %6
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %8:array<mat3x3<f32>, 2> = load %var
     %9:mat3x3<f32> = call %target, %8
     ret %9
@@ -534,12 +534,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, array<mat3x3<f32>, 2>, read_write> = var
 }
 
-%target = func(%3:ptr<function, array<mat3x3<f32>, 2>, read_write>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%3:ptr<function, array<mat3x3<f32>, 2>, read_write>):mat3x3<f32> {
+  $B2: {
     %4:array<mat3x3<f32>, 2> = load %3
     %5:mat3x3<f32> = access %4, 0u
     %6:mat3x3<f32> = access %4, 1u
@@ -547,8 +547,8 @@
     ret %7
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %9:array<mat3x3<f32>, 2> = load %var
     %10:ptr<function, array<mat3x3<f32>, 2>, read_write> = var, %9
     %11:mat3x3<f32> = call %target, %10
@@ -592,20 +592,20 @@
   s:f32 @offset(48)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, MyStruct, read_write> = var
 }
 
-%target = func(%value:MyStruct):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value:MyStruct):mat3x3<f32> {
+  $B2: {
     %4:mat3x3<f32> = access %value, 0u
     %5:f32 = access %value, 1u
     %6:mat3x3<f32> = mul %4, %5
     ret %6
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %8:MyStruct = load %var
     %9:mat3x3<f32> = call %target, %8
     ret %9
@@ -620,12 +620,12 @@
   s:f32 @offset(48)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, MyStruct, read_write> = var
 }
 
-%target = func(%3:ptr<function, MyStruct, read_write>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%3:ptr<function, MyStruct, read_write>):mat3x3<f32> {
+  $B2: {
     %4:MyStruct = load %3
     %5:mat3x3<f32> = access %4, 0u
     %6:f32 = access %4, 1u
@@ -633,8 +633,8 @@
     ret %7
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %9:MyStruct = load %var
     %10:ptr<function, MyStruct, read_write> = var, %9
     %11:mat3x3<f32> = call %target, %10
@@ -682,12 +682,12 @@
   s:f32 @offset(96)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, array<MyStruct, 4>, read_write> = var
 }
 
-%target = func(%value:array<MyStruct, 4>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%value:array<MyStruct, 4>):mat3x3<f32> {
+  $B2: {
     %4:mat3x3<f32> = access %value, 2u, 0u, 0u
     %5:mat3x3<f32> = access %value, 2u, 0u, 1u
     %6:f32 = access %value, 2u, 1u
@@ -696,8 +696,8 @@
     ret %8
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %10:array<MyStruct, 4> = load %var
     %11:mat3x3<f32> = call %target, %10
     ret %11
@@ -712,12 +712,12 @@
   s:f32 @offset(96)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %var:ptr<private, array<MyStruct, 4>, read_write> = var
 }
 
-%target = func(%3:ptr<function, array<MyStruct, 4>, read_write>):mat3x3<f32> -> %b2 {
-  %b2 = block {
+%target = func(%3:ptr<function, array<MyStruct, 4>, read_write>):mat3x3<f32> {
+  $B2: {
     %4:array<MyStruct, 4> = load %3
     %5:mat3x3<f32> = access %4, 2u, 0u, 0u
     %6:mat3x3<f32> = access %4, 2u, 0u, 1u
@@ -727,8 +727,8 @@
     ret %9
   }
 }
-%caller = func():mat3x3<f32> -> %b3 {
-  %b3 = block {
+%caller = func():mat3x3<f32> {
+  $B3: {
     %11:array<MyStruct, 4> = load %var
     %12:ptr<function, array<MyStruct, 4>, read_write> = var, %11
     %13:mat3x3<f32> = call %target, %12
diff --git a/src/tint/lang/spirv/writer/raise/shader_io_test.cc b/src/tint/lang/spirv/writer/raise/shader_io_test.cc
index 61d3ef7..4faaf5d 100644
--- a/src/tint/lang/spirv/writer/raise/shader_io_test.cc
+++ b/src/tint/lang/spirv/writer/raise/shader_io_test.cc
@@ -48,8 +48,8 @@
     });
 
     auto* src = R"(
-%foo = @compute func():void -> %b1 {
-  %b1 = block {
+%foo = @compute func():void {
+  $B1: {
     ret
   }
 }
@@ -91,10 +91,10 @@
     });
 
     auto* src = R"(
-%foo = @fragment func(%front_facing:bool [@front_facing], %position:vec4<f32> [@invariant, @position], %color1:f32 [@location(0)], %color2:f32 [@location(1), @interpolate(linear, sample)]):void -> %b1 {
-  %b1 = block {
-    if %front_facing [t: %b2] {  # if_1
-      %b2 = block {  # true
+%foo = @fragment func(%front_facing:bool [@front_facing], %position:vec4<f32> [@invariant, @position], %color1:f32 [@location(0)], %color2:f32 [@location(1), @interpolate(linear, sample)]):void {
+  $B1: {
+    if %front_facing [t: $B2] {  # if_1
+      $B2: {  # true
         %6:f32 = add %color1, %color2
         %7:vec4<f32> = mul %position, %6
         exit_if  # if_1
@@ -107,17 +107,17 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %foo_front_facing_Input:ptr<__in, bool, read> = var @builtin(front_facing)
   %foo_position_Input:ptr<__in, vec4<f32>, read> = var @invariant @builtin(position)
   %foo_loc0_Input:ptr<__in, f32, read> = var @location(0)
   %foo_loc1_Input:ptr<__in, f32, read> = var @location(1) @interpolate(linear, sample)
 }
 
-%foo_inner = func(%front_facing:bool, %position:vec4<f32>, %color1:f32, %color2:f32):void -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%foo_inner = func(%front_facing:bool, %position:vec4<f32>, %color1:f32, %color2:f32):void {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         %10:f32 = add %color1, %color2
         %11:vec4<f32> = mul %position, %10
         exit_if  # if_1
@@ -126,8 +126,8 @@
     ret
   }
 }
-%foo = @fragment func():void -> %b4 {
-  %b4 = block {
+%foo = @fragment func():void {
+  $B4: {
     %13:bool = load %foo_front_facing_Input
     %14:vec4<f32> = load %foo_position_Input
     %15:f32 = load %foo_loc0_Input
@@ -227,11 +227,11 @@
   color2:f32 @offset(36), @location(1), @interpolate(linear, sample)
 }
 
-%foo = @fragment func(%inputs:Inputs):void -> %b1 {
-  %b1 = block {
+%foo = @fragment func(%inputs:Inputs):void {
+  $B1: {
     %3:bool = access %inputs, 0i
-    if %3 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %3 [t: $B2] {  # if_1
+      $B2: {  # true
         %4:vec4<f32> = access %inputs, 1i
         %5:f32 = access %inputs, 2i
         %6:f32 = access %inputs, 3i
@@ -254,18 +254,18 @@
   color2:f32 @offset(36)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %foo_front_facing_Input:ptr<__in, bool, read> = var @builtin(front_facing)
   %foo_position_Input:ptr<__in, vec4<f32>, read> = var @invariant @builtin(position)
   %foo_loc0_Input:ptr<__in, f32, read> = var @location(0)
   %foo_loc1_Input:ptr<__in, f32, read> = var @location(1) @interpolate(linear, sample)
 }
 
-%foo_inner = func(%inputs:Inputs):void -> %b2 {
-  %b2 = block {
+%foo_inner = func(%inputs:Inputs):void {
+  $B2: {
     %7:bool = access %inputs, 0i
-    if %7 [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if %7 [t: $B3] {  # if_1
+      $B3: {  # true
         %8:vec4<f32> = access %inputs, 1i
         %9:f32 = access %inputs, 2i
         %10:f32 = access %inputs, 3i
@@ -277,8 +277,8 @@
     ret
   }
 }
-%foo = @fragment func():void -> %b4 {
-  %b4 = block {
+%foo = @fragment func():void {
+  $B4: {
     %14:bool = load %foo_front_facing_Input
     %15:vec4<f32> = load %foo_position_Input
     %16:f32 = load %foo_loc0_Input
@@ -354,10 +354,10 @@
   color1:f32 @offset(16), @location(0)
 }
 
-%foo = @fragment func(%front_facing:bool [@front_facing], %inputs:Inputs, %color2:f32 [@location(1), @interpolate(linear, sample)]):void -> %b1 {
-  %b1 = block {
-    if %front_facing [t: %b2] {  # if_1
-      %b2 = block {  # true
+%foo = @fragment func(%front_facing:bool [@front_facing], %inputs:Inputs, %color2:f32 [@location(1), @interpolate(linear, sample)]):void {
+  $B1: {
+    if %front_facing [t: $B2] {  # if_1
+      $B2: {  # true
         %5:vec4<f32> = access %inputs, 0i
         %6:f32 = access %inputs, 1i
         %7:f32 = add %6, %color2
@@ -377,17 +377,17 @@
   color1:f32 @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %foo_front_facing_Input:ptr<__in, bool, read> = var @builtin(front_facing)
   %foo_position_Input:ptr<__in, vec4<f32>, read> = var @invariant @builtin(position)
   %foo_loc0_Input:ptr<__in, f32, read> = var @location(0)
   %foo_loc1_Input:ptr<__in, f32, read> = var @location(1) @interpolate(linear, sample)
 }
 
-%foo_inner = func(%front_facing:bool, %inputs:Inputs, %color2:f32):void -> %b2 {
-  %b2 = block {
-    if %front_facing [t: %b3] {  # if_1
-      %b3 = block {  # true
+%foo_inner = func(%front_facing:bool, %inputs:Inputs, %color2:f32):void {
+  $B2: {
+    if %front_facing [t: $B3] {  # if_1
+      $B3: {  # true
         %9:vec4<f32> = access %inputs, 0i
         %10:f32 = access %inputs, 1i
         %11:f32 = add %10, %color2
@@ -398,8 +398,8 @@
     ret
   }
 }
-%foo = @fragment func():void -> %b4 {
-  %b4 = block {
+%foo = @fragment func():void {
+  $B4: {
     %14:bool = load %foo_front_facing_Input
     %15:vec4<f32> = load %foo_position_Input
     %16:f32 = load %foo_loc0_Input
@@ -429,8 +429,8 @@
     });
 
     auto* src = R"(
-%foo = @vertex func():vec4<f32> [@invariant, @position] -> %b1 {
-  %b1 = block {
+%foo = @vertex func():vec4<f32> [@invariant, @position] {
+  $B1: {
     %2:vec4<f32> = construct 0.5f
     ret %2
   }
@@ -439,18 +439,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %foo_position_Output:ptr<__out, vec4<f32>, write> = var @invariant @builtin(position)
 }
 
-%foo_inner = func():vec4<f32> -> %b2 {
-  %b2 = block {
+%foo_inner = func():vec4<f32> {
+  $B2: {
     %3:vec4<f32> = construct 0.5f
     ret %3
   }
 }
-%foo = @vertex func():void -> %b3 {
-  %b3 = block {
+%foo = @vertex func():void {
+  $B3: {
     %5:vec4<f32> = call %foo_inner
     store %foo_position_Output, %5
     ret
@@ -475,8 +475,8 @@
     });
 
     auto* src = R"(
-%foo = @fragment func():vec4<f32> [@location(1)] -> %b1 {
-  %b1 = block {
+%foo = @fragment func():vec4<f32> [@location(1)] {
+  $B1: {
     %2:vec4<f32> = construct 0.5f
     ret %2
   }
@@ -485,18 +485,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %foo_loc1_Output:ptr<__out, vec4<f32>, write> = var @location(1)
 }
 
-%foo_inner = func():vec4<f32> -> %b2 {
-  %b2 = block {
+%foo_inner = func():vec4<f32> {
+  $B2: {
     %3:vec4<f32> = construct 0.5f
     ret %3
   }
 }
-%foo = @fragment func():void -> %b3 {
-  %b3 = block {
+%foo = @fragment func():void {
+  $B3: {
     %5:vec4<f32> = call %foo_inner
     store %foo_loc1_Output, %5
     ret
@@ -570,8 +570,8 @@
   color2:f32 @offset(20), @location(1), @interpolate(linear, sample)
 }
 
-%foo = @vertex func():Outputs -> %b1 {
-  %b1 = block {
+%foo = @vertex func():Outputs {
+  $B1: {
     %2:vec4<f32> = construct 0.0f
     %3:Outputs = construct %2, 0.25f, 0.75f
     ret %3
@@ -587,21 +587,21 @@
   color2:f32 @offset(20)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %foo_position_Output:ptr<__out, vec4<f32>, write> = var @invariant @builtin(position)
   %foo_loc0_Output:ptr<__out, f32, write> = var @location(0)
   %foo_loc1_Output:ptr<__out, f32, write> = var @location(1) @interpolate(linear, sample)
 }
 
-%foo_inner = func():Outputs -> %b2 {
-  %b2 = block {
+%foo_inner = func():Outputs {
+  $B2: {
     %5:vec4<f32> = construct 0.0f
     %6:Outputs = construct %5, 0.25f, 0.75f
     ret %6
   }
 }
-%foo = @vertex func():void -> %b3 {
-  %b3 = block {
+%foo = @vertex func():void {
+  $B3: {
     %8:Outputs = call %foo_inner
     %9:vec4<f32> = access %8, 0u
     store %foo_position_Output, %9
@@ -663,8 +663,8 @@
   color2:f32 @offset(4), @location(0)
 }
 
-%foo = @fragment func():Output -> %b1 {
-  %b1 = block {
+%foo = @fragment func():Output {
+  $B1: {
     %2:Output = construct 0.25f, 0.75f
     ret %2
   }
@@ -678,19 +678,19 @@
   color2:f32 @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %foo_loc0_idx0_Output:ptr<__out, f32, write> = var @location(0) @blend_src(0)
   %foo_loc0_idx1_Output:ptr<__out, f32, write> = var @location(0) @blend_src(1)
 }
 
-%foo_inner = func():Output -> %b2 {
-  %b2 = block {
+%foo_inner = func():Output {
+  $B2: {
     %4:Output = construct 0.25f, 0.75f
     ret %4
   }
 }
-%foo = @fragment func():void -> %b3 {
-  %b3 = block {
+%foo = @fragment func():void {
+  $B3: {
     %6:Output = call %foo_inner
     %7:f32 = access %6, 0u
     store %foo_loc0_idx0_Output, %7
@@ -771,16 +771,16 @@
   color:vec4<f32> @offset(16), @location(0)
 }
 
-%vert = @vertex func():Interface -> %b1 {
-  %b1 = block {
+%vert = @vertex func():Interface {
+  $B1: {
     %2:vec4<f32> = construct 0.0f
     %3:vec4<f32> = construct 1.0f
     %4:Interface = construct %2, %3
     ret %4
   }
 }
-%frag = @fragment func(%inputs:Interface):vec4<f32> [@location(0)] -> %b2 {
-  %b2 = block {
+%frag = @fragment func(%inputs:Interface):vec4<f32> [@location(0)] {
+  $B2: {
     %7:vec4<f32> = access %inputs, 0u
     %8:vec4<f32> = access %inputs, 1u
     %9:vec4<f32> = add %7, %8
@@ -796,7 +796,7 @@
   color:vec4<f32> @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %vert_position_Output:ptr<__out, vec4<f32>, write> = var @builtin(position)
   %vert_loc0_Output:ptr<__out, vec4<f32>, write> = var @location(0)
   %frag_position_Input:ptr<__in, vec4<f32>, read> = var @builtin(position)
@@ -804,24 +804,24 @@
   %frag_loc0_Output:ptr<__out, vec4<f32>, write> = var @location(0)
 }
 
-%vert_inner = func():Interface -> %b2 {
-  %b2 = block {
+%vert_inner = func():Interface {
+  $B2: {
     %7:vec4<f32> = construct 0.0f
     %8:vec4<f32> = construct 1.0f
     %9:Interface = construct %7, %8
     ret %9
   }
 }
-%frag_inner = func(%inputs:Interface):vec4<f32> -> %b3 {
-  %b3 = block {
+%frag_inner = func(%inputs:Interface):vec4<f32> {
+  $B3: {
     %12:vec4<f32> = access %inputs, 0u
     %13:vec4<f32> = access %inputs, 1u
     %14:vec4<f32> = add %12, %13
     ret %14
   }
 }
-%vert = @vertex func():void -> %b4 {
-  %b4 = block {
+%vert = @vertex func():void {
+  $B4: {
     %16:Interface = call %vert_inner
     %17:vec4<f32> = access %16, 0u
     store %vert_position_Output, %17
@@ -830,8 +830,8 @@
     ret
   }
 }
-%frag = @fragment func():void -> %b5 {
-  %b5 = block {
+%frag = @fragment func():void {
+  $B5: {
     %20:vec4<f32> = load %frag_position_Input
     %21:vec4<f32> = load %frag_loc0_Input
     %22:Interface = construct %20, %21
@@ -894,12 +894,12 @@
   color:vec4<f32> @offset(16), @location(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, Outputs, read> = var
 }
 
-%vert = @vertex func():Outputs -> %b2 {
-  %b2 = block {
+%vert = @vertex func():Outputs {
+  $B2: {
     %3:Outputs = load %1
     ret %3
   }
@@ -913,20 +913,20 @@
   color:vec4<f32> @offset(16)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<storage, Outputs, read> = var
   %vert_position_Output:ptr<__out, vec4<f32>, write> = var @builtin(position)
   %vert_loc0_Output:ptr<__out, vec4<f32>, write> = var @location(0)
 }
 
-%vert_inner = func():Outputs -> %b2 {
-  %b2 = block {
+%vert_inner = func():Outputs {
+  $B2: {
     %5:Outputs = load %1
     ret %5
   }
 }
-%vert = @vertex func():void -> %b3 {
-  %b3 = block {
+%vert = @vertex func():void {
+  $B3: {
     %7:Outputs = call %vert_inner
     %8:vec4<f32> = access %7, 0u
     store %vert_position_Output, %8
@@ -991,8 +991,8 @@
   mask:u32 @offset(4), @builtin(sample_mask)
 }
 
-%foo = @fragment func(%mask_in:u32 [@sample_mask]):Outputs -> %b1 {
-  %b1 = block {
+%foo = @fragment func(%mask_in:u32 [@sample_mask]):Outputs {
+  $B1: {
     %3:Outputs = construct 0.5f, %mask_in
     ret %3
   }
@@ -1006,20 +1006,20 @@
   mask:u32 @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %foo_sample_mask_Input:ptr<__in, array<u32, 1>, read> = var @builtin(sample_mask)
   %foo_loc0_Output:ptr<__out, f32, write> = var @location(0)
   %foo_sample_mask_Output:ptr<__out, array<u32, 1>, write> = var @builtin(sample_mask)
 }
 
-%foo_inner = func(%mask_in:u32):Outputs -> %b2 {
-  %b2 = block {
+%foo_inner = func(%mask_in:u32):Outputs {
+  $B2: {
     %6:Outputs = construct 0.5f, %mask_in
     ret %6
   }
 }
-%foo = @fragment func():void -> %b3 {
-  %b3 = block {
+%foo = @fragment func():void {
+  $B3: {
     %8:ptr<__in, u32, read> = access %foo_sample_mask_Input, 0u
     %9:u32 = load %8
     %10:Outputs = call %foo_inner, %9
@@ -1105,20 +1105,20 @@
   color:f32 @offset(0), @location(1), @interpolate(linear, sample)
 }
 
-%vert = @vertex func(%input:MyStruct, %ival:i32 [@location(1), @interpolate(flat)]):vec4<f32> [@invariant, @position] -> %b1 {
-  %b1 = block {
+%vert = @vertex func(%input:MyStruct, %ival:i32 [@location(1), @interpolate(flat)]):vec4<f32> [@invariant, @position] {
+  $B1: {
     %4:vec4<f32> = construct 0.5f
     ret %4
   }
 }
-%frag1 = @fragment func():MyStruct -> %b2 {
-  %b2 = block {
+%frag1 = @fragment func():MyStruct {
+  $B2: {
     %6:MyStruct = construct 0.5f
     ret %6
   }
 }
-%frag2 = @fragment func():i32 [@location(0), @interpolate(flat)] -> %b3 {
-  %b3 = block {
+%frag2 = @fragment func():i32 [@location(0), @interpolate(flat)] {
+  $B3: {
     ret 42i
   }
 }
@@ -1130,7 +1130,7 @@
   color:f32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %vert_loc1_Input:ptr<__in, f32, read> = var @location(1)
   %vert_loc1_Input_1:ptr<__in, i32, read> = var @location(1)  # %vert_loc1_Input_1: 'vert_loc1_Input'
   %vert_position_Output:ptr<__out, vec4<f32>, write> = var @invariant @builtin(position)
@@ -1138,25 +1138,25 @@
   %frag2_loc0_Output:ptr<__out, i32, write> = var @location(0)
 }
 
-%vert_inner = func(%input:MyStruct, %ival:i32):vec4<f32> -> %b2 {
-  %b2 = block {
+%vert_inner = func(%input:MyStruct, %ival:i32):vec4<f32> {
+  $B2: {
     %9:vec4<f32> = construct 0.5f
     ret %9
   }
 }
-%frag1_inner = func():MyStruct -> %b3 {
-  %b3 = block {
+%frag1_inner = func():MyStruct {
+  $B3: {
     %11:MyStruct = construct 0.5f
     ret %11
   }
 }
-%frag2_inner = func():i32 -> %b4 {
-  %b4 = block {
+%frag2_inner = func():i32 {
+  $B4: {
     ret 42i
   }
 }
-%vert = @vertex func():void -> %b5 {
-  %b5 = block {
+%vert = @vertex func():void {
+  $B5: {
     %14:f32 = load %vert_loc1_Input
     %15:MyStruct = construct %14
     %16:i32 = load %vert_loc1_Input_1
@@ -1165,16 +1165,16 @@
     ret
   }
 }
-%frag1 = @fragment func():void -> %b6 {
-  %b6 = block {
+%frag1 = @fragment func():void {
+  $B6: {
     %19:MyStruct = call %frag1_inner
     %20:f32 = access %19, 0u
     store %frag1_loc1_Output, %20
     ret
   }
 }
-%frag2 = @fragment func():void -> %b7 {
-  %b7 = block {
+%frag2 = @fragment func():void {
+  $B7: {
     %22:i32 = call %frag2_inner
     store %frag2_loc0_Output, %22
     ret
@@ -1231,8 +1231,8 @@
   depth:f32 @offset(4), @builtin(frag_depth)
 }
 
-%foo = @fragment func():Outputs -> %b1 {
-  %b1 = block {
+%foo = @fragment func():Outputs {
+  $B1: {
     %2:Outputs = construct 0.5f, 2.0f
     ret %2
   }
@@ -1251,20 +1251,20 @@
   max:f32 @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %foo_loc0_Output:ptr<__out, f32, write> = var @location(0)
   %foo_frag_depth_Output:ptr<__out, f32, write> = var @builtin(frag_depth)
   %tint_frag_depth_clamp_args:ptr<push_constant, FragDepthClampArgs, read> = var
 }
 
-%foo_inner = func():Outputs -> %b2 {
-  %b2 = block {
+%foo_inner = func():Outputs {
+  $B2: {
     %5:Outputs = construct 0.5f, 2.0f
     ret %5
   }
 }
-%foo = @fragment func():void -> %b3 {
-  %b3 = block {
+%foo = @fragment func():void {
+  $B3: {
     %7:Outputs = call %foo_inner
     %8:f32 = access %7, 0u
     store %foo_loc0_Output, %8
@@ -1332,20 +1332,20 @@
   depth:f32 @offset(4), @builtin(frag_depth)
 }
 
-%ep1 = @fragment func():Outputs -> %b1 {
-  %b1 = block {
+%ep1 = @fragment func():Outputs {
+  $B1: {
     %2:Outputs = construct 0.5f, 2.0f
     ret %2
   }
 }
-%ep2 = @fragment func():Outputs -> %b2 {
-  %b2 = block {
+%ep2 = @fragment func():Outputs {
+  $B2: {
     %4:Outputs = construct 0.5f, 2.0f
     ret %4
   }
 }
-%ep3 = @fragment func():Outputs -> %b3 {
-  %b3 = block {
+%ep3 = @fragment func():Outputs {
+  $B3: {
     %6:Outputs = construct 0.5f, 2.0f
     ret %6
   }
@@ -1364,7 +1364,7 @@
   max:f32 @offset(4)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %ep1_loc0_Output:ptr<__out, f32, write> = var @location(0)
   %ep1_frag_depth_Output:ptr<__out, f32, write> = var @builtin(frag_depth)
   %tint_frag_depth_clamp_args:ptr<push_constant, FragDepthClampArgs, read> = var
@@ -1374,26 +1374,26 @@
   %ep3_frag_depth_Output:ptr<__out, f32, write> = var @builtin(frag_depth)
 }
 
-%ep1_inner = func():Outputs -> %b2 {
-  %b2 = block {
+%ep1_inner = func():Outputs {
+  $B2: {
     %9:Outputs = construct 0.5f, 2.0f
     ret %9
   }
 }
-%ep2_inner = func():Outputs -> %b3 {
-  %b3 = block {
+%ep2_inner = func():Outputs {
+  $B3: {
     %11:Outputs = construct 0.5f, 2.0f
     ret %11
   }
 }
-%ep3_inner = func():Outputs -> %b4 {
-  %b4 = block {
+%ep3_inner = func():Outputs {
+  $B4: {
     %13:Outputs = construct 0.5f, 2.0f
     ret %13
   }
 }
-%ep1 = @fragment func():void -> %b5 {
-  %b5 = block {
+%ep1 = @fragment func():void {
+  $B5: {
     %15:Outputs = call %ep1_inner
     %16:f32 = access %15, 0u
     store %ep1_loc0_Output, %16
@@ -1406,8 +1406,8 @@
     ret
   }
 }
-%ep2 = @fragment func():void -> %b6 {
-  %b6 = block {
+%ep2 = @fragment func():void {
+  $B6: {
     %23:Outputs = call %ep2_inner
     %24:f32 = access %23, 0u
     store %ep2_loc0_Output, %24
@@ -1420,8 +1420,8 @@
     ret
   }
 }
-%ep3 = @fragment func():void -> %b7 {
-  %b7 = block {
+%ep3 = @fragment func():void {
+  $B7: {
     %31:Outputs = call %ep3_inner
     %32:f32 = access %31, 0u
     store %ep3_loc0_Output, %32
@@ -1453,8 +1453,8 @@
     });
 
     auto* src = R"(
-%foo = @vertex func():vec4<f32> [@position] -> %b1 {
-  %b1 = block {
+%foo = @vertex func():vec4<f32> [@position] {
+  $B1: {
     %2:vec4<f32> = construct 0.5f
     ret %2
   }
@@ -1463,19 +1463,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %foo_position_Output:ptr<__out, vec4<f32>, write> = var @builtin(position)
   %foo___point_size_Output:ptr<__out, f32, write> = var @builtin(__point_size)
 }
 
-%foo_inner = func():vec4<f32> -> %b2 {
-  %b2 = block {
+%foo_inner = func():vec4<f32> {
+  $B2: {
     %4:vec4<f32> = construct 0.5f
     ret %4
   }
 }
-%foo = @vertex func():void -> %b3 {
-  %b3 = block {
+%foo = @vertex func():void {
+  $B3: {
     %6:vec4<f32> = call %foo_inner
     store %foo_position_Output, %6
     store %foo___point_size_Output, 1.0f
@@ -1536,8 +1536,8 @@
   out2:vec4<f16> @offset(8), @location(2)
 }
 
-%main = @fragment func(%in1:f16 [@location(2)], %in2:vec4<f16>):Outputs -> %b1 {
-  %b1 = block {
+%main = @fragment func(%in1:f16 [@location(2)], %in2:vec4<f16>):Outputs {
+  $B1: {
     %4:Outputs = construct %in1, %in2
     ret %4
   }
@@ -1551,21 +1551,21 @@
   out2:vec4<f16> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %main_loc2_Input:ptr<__in, f16, read> = var @location(2)
   %main_Input:ptr<__in, vec4<f16>, read> = var
   %main_loc1_Output:ptr<__out, f16, write> = var @location(1)
   %main_loc2_Output:ptr<__out, vec4<f16>, write> = var @location(2)
 }
 
-%main_inner = func(%in1:f16, %in2:vec4<f16>):Outputs -> %b2 {
-  %b2 = block {
+%main_inner = func(%in1:f16, %in2:vec4<f16>):Outputs {
+  $B2: {
     %8:Outputs = construct %in1, %in2
     ret %8
   }
 }
-%main = @fragment func():void -> %b3 {
-  %b3 = block {
+%main = @fragment func():void {
+  $B3: {
     %10:f16 = load %main_loc2_Input
     %11:vec4<f16> = load %main_Input
     %12:Outputs = call %main_inner, %10, %11
@@ -1630,8 +1630,8 @@
   out2:vec4<f16> @offset(8), @location(2)
 }
 
-%main = @fragment func(%in1:f16 [@location(2)], %in2:vec4<f16>):Outputs -> %b1 {
-  %b1 = block {
+%main = @fragment func(%in1:f16 [@location(2)], %in2:vec4<f16>):Outputs {
+  $B1: {
     %4:Outputs = construct %in1, %in2
     ret %4
   }
@@ -1645,21 +1645,21 @@
   out2:vec4<f16> @offset(8)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %main_loc2_Input:ptr<__in, f32, read> = var @location(2)
   %main_Input:ptr<__in, vec4<f32>, read> = var
   %main_loc1_Output:ptr<__out, f32, write> = var @location(1)
   %main_loc2_Output:ptr<__out, vec4<f32>, write> = var @location(2)
 }
 
-%main_inner = func(%in1:f16, %in2:vec4<f16>):Outputs -> %b2 {
-  %b2 = block {
+%main_inner = func(%in1:f16, %in2:vec4<f16>):Outputs {
+  $B2: {
     %8:Outputs = construct %in1, %in2
     ret %8
   }
 }
-%main = @fragment func():void -> %b3 {
-  %b3 = block {
+%main = @fragment func():void {
+  $B3: {
     %10:f32 = load %main_loc2_Input
     %11:f16 = convert %10
     %12:vec4<f32> = load %main_Input
diff --git a/src/tint/lang/spirv/writer/raise/var_for_dynamic_index_test.cc b/src/tint/lang/spirv/writer/raise/var_for_dynamic_index_test.cc
index 657488b..59b0f27 100644
--- a/src/tint/lang/spirv/writer/raise/var_for_dynamic_index_test.cc
+++ b/src/tint/lang/spirv/writer/raise/var_for_dynamic_index_test.cc
@@ -52,8 +52,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:array<i32, 4>):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:array<i32, 4>):i32 {
+  $B1: {
     %3:i32 = access %2, 1i
     ret %3
   }
@@ -75,8 +75,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:mat2x2<f32>):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:mat2x2<f32>):f32 {
+  $B1: {
     %3:f32 = access %2, 1i, 0i
     ret %3
   }
@@ -100,8 +100,8 @@
     block->Append(b.Return(func, load));
 
     auto* expect = R"(
-%foo = func(%2:ptr<function, array<i32, 4>, read_write>, %3:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:ptr<function, array<i32, 4>, read_write>, %3:i32):i32 {
+  $B1: {
     %4:ptr<function, i32, read_write> = access %2, %3
     %5:i32 = load %4
     ret %5
@@ -126,8 +126,8 @@
     block->Append(b.Return(func, load));
 
     auto* expect = R"(
-%foo = func(%2:ptr<function, mat2x2<f32>, read_write>, %3:i32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:ptr<function, mat2x2<f32>, read_write>, %3:i32):f32 {
+  $B1: {
     %4:ptr<function, vec2<f32>, read_write> = access %2, %3
     %5:f32 = load_vector_element %4, %3
     ret %5
@@ -151,8 +151,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:vec4<f32>, %3:i32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:vec4<f32>, %3:i32):f32 {
+  $B1: {
     %4:f32 = access %2, %3
     ret %4
   }
@@ -175,8 +175,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:array<i32, 4>, %3:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:array<i32, 4>, %3:i32):i32 {
+  $B1: {
     %4:ptr<function, array<i32, 4>, read_write> = var, %2
     %5:ptr<function, i32, read_write> = access %4, %3
     %6:i32 = load %5
@@ -201,8 +201,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:mat2x2<f32>, %3:i32):vec2<f32> -> %b1 {
-  %b1 = block {
+%foo = func(%2:mat2x2<f32>, %3:i32):vec2<f32> {
+  $B1: {
     %4:ptr<function, mat2x2<f32>, read_write> = var, %2
     %5:ptr<function, vec2<f32>, read_write> = access %4, %3
     %6:vec2<f32> = load %5
@@ -227,8 +227,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:mat2x2<f32>, %3:i32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:mat2x2<f32>, %3:i32):f32 {
+  $B1: {
     %4:ptr<function, mat2x2<f32>, read_write> = var, %2
     %5:ptr<function, vec2<f32>, read_write> = access %4, %3
     %6:f32 = load_vector_element %5, %3
@@ -253,8 +253,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:array<array<array<i32, 4>, 4>, 4>, %3:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:array<array<array<i32, 4>, 4>, 4>, %3:i32):i32 {
+  $B1: {
     %4:ptr<function, array<array<array<i32, 4>, 4>, 4>, read_write> = var, %2
     %5:ptr<function, i32, read_write> = access %4, %3, 1u, %3
     %6:i32 = load %5
@@ -279,8 +279,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:array<array<array<i32, 4>, 4>, 4>, %3:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:array<array<array<i32, 4>, 4>, 4>, %3:i32):i32 {
+  $B1: {
     %4:array<i32, 4> = access %2, 1u, 2u
     %5:ptr<function, array<i32, 4>, read_write> = var, %4
     %6:ptr<function, i32, read_write> = access %5, %3
@@ -306,8 +306,8 @@
     block->Append(b.Return(func, access));
 
     auto* expect = R"(
-%foo = func(%2:array<array<array<array<i32, 4>, 4>, 4>, 4>, %3:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:array<array<array<array<i32, 4>, 4>, 4>, 4>, %3:i32):i32 {
+  $B1: {
     %4:array<array<array<i32, 4>, 4>, 4> = access %2, 1u
     %5:ptr<function, array<array<array<i32, 4>, 4>, 4>, read_write> = var, %4
     %6:ptr<function, i32, read_write> = access %5, %3, 2u, %3
@@ -345,8 +345,8 @@
   arr2:array<f32, 1024> @offset(4160)
 }
 
-%foo = func(%2:MyStruct, %3:i32):f32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:MyStruct, %3:i32):f32 {
+  $B1: {
     %4:mat4x4<f32> = access %2, 1u
     %5:ptr<function, mat4x4<f32>, read_write> = var, %4
     %6:ptr<function, vec4<f32>, read_write> = access %5, %3
@@ -376,8 +376,8 @@
     block->Append(b.Return(func, access_c));
 
     auto* expect = R"(
-%foo = func(%2:array<i32, 4>, %3:i32, %4:i32, %5:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:array<i32, 4>, %3:i32, %4:i32, %5:i32):i32 {
+  $B1: {
     %6:ptr<function, array<i32, 4>, read_write> = var, %2
     %7:ptr<function, i32, read_write> = access %6, %3
     %8:i32 = load %7
@@ -410,8 +410,8 @@
     block->Append(b.Return(func, access_c));
 
     auto* expect = R"(
-%foo = func(%2:array<array<array<i32, 4>, 4>, 4>, %3:i32, %4:i32, %5:i32):i32 -> %b1 {
-  %b1 = block {
+%foo = func(%2:array<array<array<i32, 4>, 4>, 4>, %3:i32, %4:i32, %5:i32):i32 {
+  $B1: {
     %6:array<i32, 4> = access %2, 1u, 2u
     %7:ptr<function, array<i32, 4>, read_write> = var, %6
     %8:ptr<function, i32, read_write> = access %7, %3
@@ -449,14 +449,14 @@
     });
 
     auto* src = R"(
-%func = func(%2:array<i32, 4>, %3:bool, %4:i32, %5:i32):i32 -> %b1 {
-  %b1 = block {
-    if %3 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%func = func(%2:array<i32, 4>, %3:bool, %4:i32, %5:i32):i32 {
+  $B1: {
+    if %3 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         %6:i32 = access %2, %4
         ret %6
       }
-      %b3 = block {  # false
+      $B3: {  # false
         %7:i32 = access %2, %5
         ret %7
       }
@@ -468,16 +468,16 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%func = func(%2:array<i32, 4>, %3:bool, %4:i32, %5:i32):i32 -> %b1 {
-  %b1 = block {
+%func = func(%2:array<i32, 4>, %3:bool, %4:i32, %5:i32):i32 {
+  $B1: {
     %6:ptr<function, array<i32, 4>, read_write> = var, %2
-    if %3 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+    if %3 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         %7:ptr<function, i32, read_write> = access %6, %4
         %8:i32 = load %7
         ret %8
       }
-      %b3 = block {  # false
+      $B3: {  # false
         %9:ptr<function, i32, read_write> = access %6, %5
         %10:i32 = load %9
         ret %10
@@ -513,14 +513,14 @@
     });
 
     auto* src = R"(
-%func = func(%2:array<array<i32, 4>, 4>, %3:bool, %4:i32, %5:i32):i32 -> %b1 {
-  %b1 = block {
-    if %3 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+%func = func(%2:array<array<i32, 4>, 4>, %3:bool, %4:i32, %5:i32):i32 {
+  $B1: {
+    if %3 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         %6:i32 = access %2, 0u, %4
         ret %6
       }
-      %b3 = block {  # false
+      $B3: {  # false
         %7:i32 = access %2, 0u, %5
         ret %7
       }
@@ -532,17 +532,17 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%func = func(%2:array<array<i32, 4>, 4>, %3:bool, %4:i32, %5:i32):i32 -> %b1 {
-  %b1 = block {
+%func = func(%2:array<array<i32, 4>, 4>, %3:bool, %4:i32, %5:i32):i32 {
+  $B1: {
     %6:array<i32, 4> = access %2, 0u
     %7:ptr<function, array<i32, 4>, read_write> = var, %6
-    if %3 [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+    if %3 [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         %8:ptr<function, i32, read_write> = access %7, %4
         %9:i32 = load %8
         ret %9
       }
-      %b3 = block {  # false
+      $B3: {  # false
         %10:ptr<function, i32, read_write> = access %7, %5
         %11:i32 = load %10
         ret %11
@@ -581,16 +581,16 @@
     });
 
     auto* src = R"(
-%func = func(%2:bool, %3:i32, %4:i32):i32 -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block (%5:array<i32, 4>) {  # body
-        if %2 [t: %b3, f: %b4] {  # if_1
-          %b3 = block {  # true
+%func = func(%2:bool, %3:i32, %4:i32):i32 {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2 (%5:array<i32, 4>): {  # body
+        if %2 [t: $B3, f: $B4] {  # if_1
+          $B3: {  # true
             %6:i32 = access %5:array<i32, 4>, %3
             ret %6
           }
-          %b4 = block {  # false
+          $B4: {  # false
             %7:i32 = access %5:array<i32, 4>, %4
             ret %7
           }
@@ -605,18 +605,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%func = func(%2:bool, %3:i32, %4:i32):i32 -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block (%5:array<i32, 4>) {  # body
+%func = func(%2:bool, %3:i32, %4:i32):i32 {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2 (%5:array<i32, 4>): {  # body
         %6:ptr<function, array<i32, 4>, read_write> = var, %5:array<i32, 4>
-        if %2 [t: %b3, f: %b4] {  # if_1
-          %b3 = block {  # true
+        if %2 [t: $B3, f: $B4] {  # if_1
+          $B3: {  # true
             %7:ptr<function, i32, read_write> = access %6, %3
             %8:i32 = load %7
             ret %8
           }
-          %b4 = block {  # false
+          $B4: {  # false
             %9:ptr<function, i32, read_write> = access %6, %4
             %10:i32 = load %9
             ret %10
@@ -660,16 +660,16 @@
     });
 
     auto* src = R"(
-%func = func(%2:bool, %3:i32, %4:i32):i32 -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block (%5:array<array<i32, 4>, 4>) {  # body
-        if %2 [t: %b3, f: %b4] {  # if_1
-          %b3 = block {  # true
+%func = func(%2:bool, %3:i32, %4:i32):i32 {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2 (%5:array<array<i32, 4>, 4>): {  # body
+        if %2 [t: $B3, f: $B4] {  # if_1
+          $B3: {  # true
             %6:i32 = access %5:array<array<i32, 4>, 4>, 0u, %3
             ret %6
           }
-          %b4 = block {  # false
+          $B4: {  # false
             %7:i32 = access %5:array<array<i32, 4>, 4>, 0u, %4
             ret %7
           }
@@ -684,19 +684,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%func = func(%2:bool, %3:i32, %4:i32):i32 -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block (%5:array<array<i32, 4>, 4>) {  # body
+%func = func(%2:bool, %3:i32, %4:i32):i32 {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2 (%5:array<array<i32, 4>, 4>): {  # body
         %6:array<i32, 4> = access %5:array<array<i32, 4>, 4>, 0u
         %7:ptr<function, array<i32, 4>, read_write> = var, %6
-        if %2 [t: %b3, f: %b4] {  # if_1
-          %b3 = block {  # true
+        if %2 [t: $B3, f: $B4] {  # if_1
+          $B3: {  # true
             %8:ptr<function, i32, read_write> = access %7, %3
             %9:i32 = load %8
             ret %9
           }
-          %b4 = block {  # false
+          $B4: {  # false
             %10:ptr<function, i32, read_write> = access %7, %4
             %11:i32 = load %10
             ret %11
@@ -740,20 +740,20 @@
     });
 
     auto* src = R"(
-%func_a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%func_a = func(%2:i32):i32 {
+  $B1: {
     %3:i32 = access array<i32, 4>(0i), %2
     ret %3
   }
 }
-%func_b = func(%5:i32):i32 -> %b2 {
-  %b2 = block {
+%func_b = func(%5:i32):i32 {
+  $B2: {
     %6:i32 = access array<i32, 4>(0i), %5
     ret %6
   }
 }
-%func_c = func(%8:i32):i32 -> %b3 {
-  %b3 = block {
+%func_c = func(%8:i32):i32 {
+  $B3: {
     %9:i32 = access array<i32, 4>(0i), %8
     ret %9
   }
@@ -762,26 +762,26 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, array<i32, 4>, read_write> = var, array<i32, 4>(0i)
 }
 
-%func_a = func(%3:i32):i32 -> %b2 {
-  %b2 = block {
+%func_a = func(%3:i32):i32 {
+  $B2: {
     %4:ptr<private, i32, read_write> = access %1, %3
     %5:i32 = load %4
     ret %5
   }
 }
-%func_b = func(%7:i32):i32 -> %b3 {
-  %b3 = block {
+%func_b = func(%7:i32):i32 {
+  $B3: {
     %8:ptr<private, i32, read_write> = access %1, %7
     %9:i32 = load %8
     ret %9
   }
 }
-%func_c = func(%11:i32):i32 -> %b4 {
-  %b4 = block {
+%func_c = func(%11:i32):i32 {
+  $B4: {
     %12:ptr<private, i32, read_write> = access %1, %11
     %13:i32 = load %12
     ret %13
@@ -820,20 +820,20 @@
     });
 
     auto* src = R"(
-%func_a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%func_a = func(%2:i32):i32 {
+  $B1: {
     %3:i32 = access array<array<i32, 4>, 4>(array<i32, 4>(0i)), 0u, %2
     ret %3
   }
 }
-%func_b = func(%5:i32):i32 -> %b2 {
-  %b2 = block {
+%func_b = func(%5:i32):i32 {
+  $B2: {
     %6:i32 = access array<array<i32, 4>, 4>(array<i32, 4>(0i)), 0u, %5
     ret %6
   }
 }
-%func_c = func(%8:i32):i32 -> %b3 {
-  %b3 = block {
+%func_c = func(%8:i32):i32 {
+  $B3: {
     %9:i32 = access array<array<i32, 4>, 4>(array<i32, 4>(0i)), 0u, %8
     ret %9
   }
@@ -842,26 +842,26 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, array<i32, 4>, read_write> = var, array<i32, 4>(0i)
 }
 
-%func_a = func(%3:i32):i32 -> %b2 {
-  %b2 = block {
+%func_a = func(%3:i32):i32 {
+  $B2: {
     %4:ptr<private, i32, read_write> = access %1, %3
     %5:i32 = load %4
     ret %5
   }
 }
-%func_b = func(%7:i32):i32 -> %b3 {
-  %b3 = block {
+%func_b = func(%7:i32):i32 {
+  $B3: {
     %8:ptr<private, i32, read_write> = access %1, %7
     %9:i32 = load %8
     ret %9
   }
 }
-%func_c = func(%11:i32):i32 -> %b4 {
-  %b4 = block {
+%func_c = func(%11:i32):i32 {
+  $B4: {
     %12:ptr<private, i32, read_write> = access %1, %11
     %13:i32 = load %12
     ret %13
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.cmake b/src/tint/lang/wgsl/ast/transform/BUILD.cmake
index 13dc91b..9f17000 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.cmake
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.cmake
@@ -251,11 +251,23 @@
   lang/wgsl/ast/transform/add_block_attribute_fuzz.cc
   lang/wgsl/ast/transform/add_empty_entry_point_fuzz.cc
   lang/wgsl/ast/transform/array_length_from_uniform_fuzz.cc
+  lang/wgsl/ast/transform/binding_remapper_fuzz.cc
+  lang/wgsl/ast/transform/builtin_polyfill_fuzz.cc
+  lang/wgsl/ast/transform/canonicalize_entry_point_io_fuzz.cc
+  lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc
+  lang/wgsl/ast/transform/demote_to_helper_fuzz.cc
+  lang/wgsl/ast/transform/direct_variable_access_fuzz.cc
+  lang/wgsl/ast/transform/disable_uniformity_analysis_fuzz.cc
+  lang/wgsl/ast/transform/expand_compound_assignment_fuzz.cc
+  lang/wgsl/ast/transform/first_index_offset_fuzz.cc
+  lang/wgsl/ast/transform/fold_constants_fuzz.cc
+  lang/wgsl/ast/transform/multiplanar_external_texture_fuzz.cc
   lang/wgsl/ast/transform/zero_init_workgroup_memory_fuzz.cc
 )
 
 tint_target_add_dependencies(tint_lang_wgsl_ast_transform_fuzz fuzz
   tint_api_common
+  tint_api_options
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.gn b/src/tint/lang/wgsl/ast/transform/BUILD.gn
index 63bcb03..76bcf95 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.gn
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.gn
@@ -241,10 +241,22 @@
       "add_block_attribute_fuzz.cc",
       "add_empty_entry_point_fuzz.cc",
       "array_length_from_uniform_fuzz.cc",
+      "binding_remapper_fuzz.cc",
+      "builtin_polyfill_fuzz.cc",
+      "canonicalize_entry_point_io_fuzz.cc",
+      "clamp_frag_depth_fuzz.cc",
+      "demote_to_helper_fuzz.cc",
+      "direct_variable_access_fuzz.cc",
+      "disable_uniformity_analysis_fuzz.cc",
+      "expand_compound_assignment_fuzz.cc",
+      "first_index_offset_fuzz.cc",
+      "fold_constants_fuzz.cc",
+      "multiplanar_external_texture_fuzz.cc",
       "zero_init_workgroup_memory_fuzz.cc",
     ]
     deps = [
       "${tint_src_dir}/api/common",
+      "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
diff --git a/src/tint/lang/wgsl/ast/transform/binding_remapper.cc b/src/tint/lang/wgsl/ast/transform/binding_remapper.cc
index 31ef518..5501dd5 100644
--- a/src/tint/lang/wgsl/ast/transform/binding_remapper.cc
+++ b/src/tint/lang/wgsl/ast/transform/binding_remapper.cc
@@ -47,6 +47,7 @@
 
 namespace tint::ast::transform {
 
+BindingRemapper::Remappings::Remappings() = default;
 BindingRemapper::Remappings::Remappings(BindingPoints bp, AccessControls ac, bool may_collide)
     : binding_points(std::move(bp)),
       access_controls(std::move(ac)),
diff --git a/src/tint/lang/wgsl/ast/transform/binding_remapper.h b/src/tint/lang/wgsl/ast/transform/binding_remapper.h
index a21a090..ff8785d 100644
--- a/src/tint/lang/wgsl/ast/transform/binding_remapper.h
+++ b/src/tint/lang/wgsl/ast/transform/binding_remapper.h
@@ -33,6 +33,7 @@
 #include "src/tint/api/common/binding_point.h"
 #include "src/tint/lang/core/access.h"
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -53,6 +54,9 @@
     /// Data holds information about shader usage and constant buffer offsets.
     struct Remappings final : public Castable<Remappings, Data> {
         /// Constructor
+        Remappings();
+
+        /// Constructor
         /// @param bp a map of new binding points
         /// @param ac a map of new access controls
         /// @param may_collide If true, then validation will be disabled for
@@ -66,14 +70,17 @@
         ~Remappings() override;
 
         /// A map of old binding point to new binding point
-        const BindingPoints binding_points;
+        BindingPoints binding_points;
 
         /// A map of old binding point to new access controls
-        const AccessControls access_controls;
+        AccessControls access_controls;
 
         /// If true, then validation will be disabled for binding point collisions
         /// generated by this transform
-        const bool allow_collisions;
+        bool allow_collisions = false;
+
+        /// Reflection for this class
+        TINT_REFLECT(Remappings, binding_points, access_controls, allow_collisions);
     };
 
     /// Constructor
diff --git a/src/tint/lang/wgsl/ast/transform/binding_remapper_fuzz.cc b/src/tint/lang/wgsl/ast/transform/binding_remapper_fuzz.cc
new file mode 100644
index 0000000..2f27549
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/binding_remapper_fuzz.cc
@@ -0,0 +1,89 @@
+// 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/api/common/binding_point.h"
+#include "src/tint/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/core/access.h"
+#include "src/tint/lang/wgsl/ast/module.h"
+#include "src/tint/lang/wgsl/ast/transform/binding_remapper.h"
+#include "src/tint/lang/wgsl/sem/variable.h"
+
+namespace tint::ast::transform {
+namespace {
+
+bool CanRun(const Program& program, const BindingRemapper::Remappings& remappings) {
+    if (!remappings.access_controls.empty()) {
+        // Changing access is likely to cause WGSL validation failures. Just skip these for now.
+        return false;
+    }
+
+    if (!remappings.allow_collisions) {
+        Hashset<BindingPoint, 8> binding_points;
+        for (auto* global : program.AST().GlobalVariables()) {
+            if (auto* sem = program.Sem().Get<sem::GlobalVariable>(global)) {
+                if (auto binding_point = sem->Attributes().binding_point) {
+                    binding_points.Add(binding_point.value());
+                }
+            }
+        }
+        Hashset<BindingPoint, 8> new_binding_points;
+        for (auto& remapping : remappings.binding_points) {
+            if (binding_points.Remove(remapping.first)) {
+                if (!new_binding_points.Add(remapping.second)) {
+                    return false;  // Binding collision
+                }
+            }
+        }
+        for (auto& binding_point : new_binding_points) {
+            if (!binding_points.Add(binding_point)) {
+                return false;  // Binding collision
+            }
+        }
+    }
+    return true;
+}
+
+void BindingRemapperFuzzer(const Program& program, const BindingRemapper::Remappings& remappings) {
+    if (!CanRun(program, remappings)) {
+        return;
+    }
+
+    DataMap inputs;
+    inputs.Add<BindingRemapper::Remappings>(std::move(remappings));
+
+    DataMap outputs;
+    if (auto result = BindingRemapper{}.Apply(program, inputs, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "BindingRemapper returned invalid program:\n" << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::BindingRemapperFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
index f82fe95..640af4d 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
@@ -1602,6 +1602,7 @@
     return State{src, *cfg}.Run();
 }
 
+BuiltinPolyfill::Config::Config() = default;
 BuiltinPolyfill::Config::Config(const Builtins& b) : builtins(b) {}
 BuiltinPolyfill::Config::Config(const Config&) = default;
 BuiltinPolyfill::Config::~Config() = default;
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h
index bdbe157..6f999b1 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.h
@@ -29,6 +29,7 @@
 #define SRC_TINT_LANG_WGSL_AST_TRANSFORM_BUILTIN_POLYFILL_H_
 
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -108,12 +109,43 @@
         /// Should `pack4xU8Clamp()` be polyfilled?
         /// TODO(tint:1497): remove the option once the bug in DXC is fixed.
         bool pack_4xu8_clamp = false;
+
+        /// Reflection for this struct
+        TINT_REFLECT(Builtins,
+                     acosh,
+                     asinh,
+                     atanh,
+                     bgra8unorm,
+                     bitshift_modulo,
+                     clamp_int,
+                     count_leading_zeros,
+                     count_trailing_zeros,
+                     conv_f32_to_iu32,
+                     extract_bits,
+                     first_leading_bit,
+                     first_trailing_bit,
+                     fwidth_fine,
+                     insert_bits,
+                     int_div_mod,
+                     precise_float_mod,
+                     reflect_vec2_f32,
+                     saturate,
+                     sign_int,
+                     texture_sample_base_clamp_to_edge_2d_f32,
+                     quantize_to_vec_f16,
+                     workgroup_uniform_load,
+                     dot_4x8_packed,
+                     pack_unpack_4x8,
+                     pack_4xu8_clamp);
     };
 
     /// Config is consumed by the BuiltinPolyfill transform.
     /// Config specifies the builtins that should be polyfilled.
     struct Config final : public Castable<Config, Data> {
         /// Constructor
+        Config();
+
+        /// Constructor
         /// @param b the list of builtins to polyfill
         explicit Config(const Builtins& b);
 
@@ -124,7 +156,10 @@
         ~Config() override;
 
         /// The builtins to polyfill
-        const Builtins builtins;
+        Builtins builtins;
+
+        /// Reflection for this struct
+        TINT_REFLECT(Config, builtins);
     };
 
     /// @copydoc Transform::Apply
@@ -138,4 +173,11 @@
 
 }  // namespace tint::ast::transform
 
+namespace tint {
+
+/// Level reflection information
+TINT_REFLECT_ENUM_RANGE(ast::transform::BuiltinPolyfill::Level, kNone, kFull);
+
+}  // namespace tint
+
 #endif  // SRC_TINT_LANG_WGSL_AST_TRANSFORM_BUILTIN_POLYFILL_H_
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill_fuzz.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill_fuzz.cc
new file mode 100644
index 0000000..adce548
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill_fuzz.cc
@@ -0,0 +1,49 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/builtin_polyfill.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void BuiltinPolyfillFuzzer(const Program& program, const BuiltinPolyfill::Config& config) {
+    DataMap inputs;
+    inputs.Add<BuiltinPolyfill::Config>(std::move(config));
+
+    DataMap outputs;
+    if (auto result = BuiltinPolyfill{}.Apply(program, inputs, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "BuiltinPolyfill returned invalid program:\n" << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::BuiltinPolyfillFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc
index 3e2029b..e61f615 100644
--- a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc
+++ b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc
@@ -1011,6 +1011,8 @@
     return resolver::Resolve(b);
 }
 
+CanonicalizeEntryPointIO::Config::Config() = default;
+
 CanonicalizeEntryPointIO::Config::Config(ShaderStyle style,
                                          uint32_t sample_mask,
                                          bool emit_point_size,
diff --git a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h
index ddf761d..9899e3d 100644
--- a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h
+++ b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h
@@ -32,6 +32,7 @@
 
 #include "src/tint/lang/wgsl/ast/internal_attribute.h"
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -115,6 +116,9 @@
     /// Configuration options for the transform.
     struct Config final : public Castable<Config, Data> {
         /// Constructor
+        Config();
+
+        /// Constructor
         /// @param style the approach to use for emitting shader IO.
         /// @param sample_mask an optional sample mask to combine with shader masks
         /// @param emit_vertex_point_size `true` to generate a pointsize builtin
@@ -131,17 +135,24 @@
         ~Config() override;
 
         /// The approach to use for emitting shader IO.
-        const ShaderStyle shader_style;
+        ShaderStyle shader_style = ShaderStyle::kSpirv;
 
         /// A fixed sample mask to combine into masks produced by fragment shaders.
-        const uint32_t fixed_sample_mask;
+        uint32_t fixed_sample_mask = 0xffffffff;
 
         /// Set to `true` to generate a pointsize builtin and have it set to 1.0
         /// from all vertex shaders in the module.
-        const bool emit_vertex_point_size;
+        bool emit_vertex_point_size = false;
 
         /// Set to `true` to replace f16 IO types with f32 types and convert them.
-        const bool polyfill_f16_io = false;
+        bool polyfill_f16_io = false;
+
+        /// Reflection for this struct
+        TINT_REFLECT(Config,
+                     shader_style,
+                     fixed_sample_mask,
+                     emit_vertex_point_size,
+                     polyfill_f16_io);
     };
 
     /// HLSLWaveIntrinsic is an InternalAttribute that is used to decorate a stub function so that
@@ -189,4 +200,11 @@
 
 }  // namespace tint::ast::transform
 
+namespace tint {
+
+/// Reflection for ShaderStyle
+TINT_REFLECT_ENUM_RANGE(ast::transform::CanonicalizeEntryPointIO::ShaderStyle, kSpirv, kHlsl);
+
+}  // namespace tint
+
 #endif  // SRC_TINT_LANG_WGSL_AST_TRANSFORM_CANONICALIZE_ENTRY_POINT_IO_H_
diff --git a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io_fuzz.cc b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io_fuzz.cc
new file mode 100644
index 0000000..136291a
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io_fuzz.cc
@@ -0,0 +1,51 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void CanonicalizeEntryPointIOFuzzer(const Program& program,
+                                    const CanonicalizeEntryPointIO::Config& config) {
+    DataMap inputs;
+    inputs.Add<CanonicalizeEntryPointIO::Config>(std::move(config));
+
+    DataMap outputs;
+    if (auto result = CanonicalizeEntryPointIO{}.Apply(program, inputs, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "CanonicalizeEntryPointIO returned invalid program:\n"
+                       << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::CanonicalizeEntryPointIOFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc
index 66bf672..44c1118 100644
--- a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc
+++ b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc
@@ -221,6 +221,7 @@
     return State{src}.Run(inputs);
 }
 
+ClampFragDepth::Config::Config() = default;
 ClampFragDepth::Config::Config(std::optional<tint::DepthRangeOffsets> off) : offsets(off) {}
 
 ClampFragDepth::Config::~Config() = default;
diff --git a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.h b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.h
index 03972a0..39a73f8 100644
--- a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.h
+++ b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.h
@@ -30,6 +30,7 @@
 
 #include "src/tint/api/options/depth_range_offsets.h"
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -73,6 +74,9 @@
     /// Transform configuration options
     struct Config final : public Castable<Config, ast::transform::Data> {
         /// Constructor
+        Config();
+
+        /// Constructor
         /// @param off Offsets of the min_depth and max_depth push constants
         explicit Config(std::optional<tint::DepthRangeOffsets> off);
 
@@ -81,6 +85,9 @@
 
         /// Offsets of the min_depth and max_depth push constants
         std::optional<tint::DepthRangeOffsets> offsets;
+
+        /// Reflection for this struct
+        TINT_REFLECT(Config, offsets);
     };
 
     /// @copydoc ast::transform::Transform::Apply
diff --git a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc
new file mode 100644
index 0000000..d2ef4c8
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth_fuzz.cc
@@ -0,0 +1,49 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/clamp_frag_depth.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void ClampFragDepthFuzzer(const Program& program, const ClampFragDepth::Config& config) {
+    DataMap inputs;
+    inputs.Add<ClampFragDepth::Config>(std::move(config));
+
+    DataMap outputs;
+    if (auto result = ClampFragDepth{}.Apply(program, inputs, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "ClampFragDepth returned invalid program:\n" << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::ClampFragDepthFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/demote_to_helper_fuzz.cc b/src/tint/lang/wgsl/ast/transform/demote_to_helper_fuzz.cc
new file mode 100644
index 0000000..180ab67
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/demote_to_helper_fuzz.cc
@@ -0,0 +1,46 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/demote_to_helper.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void DemoteToHelperFuzzer(const Program& program) {
+    DataMap outputs;
+    if (auto result = DemoteToHelper{}.Apply(program, DataMap{}, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "DemoteToHelper returned invalid program:\n" << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::DemoteToHelperFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
index d92bfb0..44fc79b 100644
--- a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
+++ b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
@@ -1203,6 +1203,7 @@
     }
 };
 
+DirectVariableAccess::Config::Config() = default;
 DirectVariableAccess::Config::Config(const Options& opt) : options(opt) {}
 
 DirectVariableAccess::Config::~Config() = default;
diff --git a/src/tint/lang/wgsl/ast/transform/direct_variable_access.h b/src/tint/lang/wgsl/ast/transform/direct_variable_access.h
index d1bb9fe..16af90d 100644
--- a/src/tint/lang/wgsl/ast/transform/direct_variable_access.h
+++ b/src/tint/lang/wgsl/ast/transform/direct_variable_access.h
@@ -29,6 +29,7 @@
 #define SRC_TINT_LANG_WGSL_AST_TRANSFORM_DIRECT_VARIABLE_ACCESS_H_
 
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -57,19 +58,29 @@
         bool transform_private = false;
         /// If true, then 'function' sub-object pointer arguments will be transformed.
         bool transform_function = false;
+
+        /// Reflection for this struct
+        TINT_REFLECT(Options, transform_private, transform_function);
     };
 
     /// Config is consumed by the DirectVariableAccess transform.
     /// Config specifies the behavior of the transform.
     struct Config final : public Castable<Config, Data> {
         /// Constructor
+        Config();
+
+        /// Constructor
         /// @param options behavior of the transform
         explicit Config(const Options& options);
+
         /// Destructor
         ~Config() override;
 
         /// The transform behavior options
-        const Options options;
+        Options options;
+
+        /// Reflection for this struct
+        TINT_REFLECT(Config, options);
     };
 
     /// @copydoc Transform::Apply
diff --git a/src/tint/lang/wgsl/ast/transform/direct_variable_access_fuzz.cc b/src/tint/lang/wgsl/ast/transform/direct_variable_access_fuzz.cc
new file mode 100644
index 0000000..5123798
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/direct_variable_access_fuzz.cc
@@ -0,0 +1,51 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/direct_variable_access.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void DirectVariableAccessFuzzer(const Program& program,
+                                const DirectVariableAccess::Config& config) {
+    DataMap inputs;
+    inputs.Add<DirectVariableAccess::Config>(std::move(config));
+
+    DataMap outputs;
+    if (auto result = DirectVariableAccess{}.Apply(program, inputs, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "DirectVariableAccess returned invalid program:\n"
+                       << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::DirectVariableAccessFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis_fuzz.cc b/src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis_fuzz.cc
new file mode 100644
index 0000000..378eb5f
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis_fuzz.cc
@@ -0,0 +1,47 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void DisableUniformityAnalysisFuzzer(const Program& program) {
+    DataMap outputs;
+    if (auto result = DisableUniformityAnalysis{}.Apply(program, DataMap{}, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "DisableUniformityAnalysis returned invalid program:\n"
+                       << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::DisableUniformityAnalysisFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/expand_compound_assignment_fuzz.cc b/src/tint/lang/wgsl/ast/transform/expand_compound_assignment_fuzz.cc
new file mode 100644
index 0000000..d017dbb
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/expand_compound_assignment_fuzz.cc
@@ -0,0 +1,47 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/expand_compound_assignment.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void ExpandCompoundAssignmentFuzzer(const Program& program) {
+    DataMap outputs;
+    if (auto result = ExpandCompoundAssignment{}.Apply(program, DataMap{}, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "ExpandCompoundAssignment returned invalid program:\n"
+                       << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::ExpandCompoundAssignmentFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/first_index_offset.cc b/src/tint/lang/wgsl/ast/transform/first_index_offset.cc
index 399bb2a..a7d912c 100644
--- a/src/tint/lang/wgsl/ast/transform/first_index_offset.cc
+++ b/src/tint/lang/wgsl/ast/transform/first_index_offset.cc
@@ -69,6 +69,7 @@
 FirstIndexOffset::BindingPoint::BindingPoint(uint32_t b, uint32_t g) : binding(b), group(g) {}
 FirstIndexOffset::BindingPoint::~BindingPoint() = default;
 
+FirstIndexOffset::Data::Data() = default;
 FirstIndexOffset::Data::Data(bool has_vtx_index, bool has_inst_index)
     : has_vertex_index(has_vtx_index), has_instance_index(has_inst_index) {}
 FirstIndexOffset::Data::Data(const Data&) = default;
diff --git a/src/tint/lang/wgsl/ast/transform/first_index_offset.h b/src/tint/lang/wgsl/ast/transform/first_index_offset.h
index c943d8b..c414485 100644
--- a/src/tint/lang/wgsl/ast/transform/first_index_offset.h
+++ b/src/tint/lang/wgsl/ast/transform/first_index_offset.h
@@ -28,7 +28,9 @@
 #ifndef SRC_TINT_LANG_WGSL_AST_TRANSFORM_FIRST_INDEX_OFFSET_H_
 #define SRC_TINT_LANG_WGSL_AST_TRANSFORM_FIRST_INDEX_OFFSET_H_
 
+#include "src/tint/lang/wgsl/ast/transform/binding_remapper.h"
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -91,12 +93,18 @@
         uint32_t binding = 0;
         /// `@group()` for the first vertex / first instance uniform buffer
         uint32_t group = 0;
+
+        /// Reflection for this struct
+        TINT_REFLECT(BindingPoint, binding, group);
     };
 
     /// Data is outputted by the FirstIndexOffset transform.
     /// Data holds information about shader usage and constant buffer offsets.
     struct Data final : public Castable<Data, transform::Data> {
         /// Constructor
+        Data();
+
+        /// Constructor
         /// @param has_vtx_index True if the shader uses vertex_index
         /// @param has_inst_index True if the shader uses instance_index
         Data(bool has_vtx_index, bool has_inst_index);
@@ -108,9 +116,12 @@
         ~Data() override;
 
         /// True if the shader uses vertex_index
-        const bool has_vertex_index;
+        bool has_vertex_index = false;
         /// True if the shader uses instance_index
-        const bool has_instance_index;
+        bool has_instance_index = false;
+
+        /// Reflection for this struct
+        TINT_REFLECT(Data, has_vertex_index, has_instance_index);
     };
 
     /// Constructor
diff --git a/src/tint/lang/wgsl/ast/transform/first_index_offset_fuzz.cc b/src/tint/lang/wgsl/ast/transform/first_index_offset_fuzz.cc
new file mode 100644
index 0000000..b7ed12e
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/first_index_offset_fuzz.cc
@@ -0,0 +1,70 @@
+// 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/api/common/binding_point.h"
+#include "src/tint/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/module.h"
+#include "src/tint/lang/wgsl/ast/transform/first_index_offset.h"
+#include "src/tint/lang/wgsl/sem/variable.h"
+
+namespace tint::ast::transform {
+namespace {
+
+bool CanRun(const Program& program, const FirstIndexOffset::BindingPoint& binding_point) {
+    for (auto& global : program.AST().GlobalVariables()) {
+        if (auto* sem = program.Sem().Get<sem::GlobalVariable>(global)) {
+            if (sem->Attributes().binding_point ==
+                BindingPoint{binding_point.group, binding_point.binding}) {
+                // Might cause binding point collision
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+void FirstIndexOffsetFuzzer(const Program& program,
+                            const FirstIndexOffset::BindingPoint& binding_point) {
+    if (!CanRun(program, binding_point)) {
+        return;
+    }
+
+    DataMap inputs;
+    inputs.Add<FirstIndexOffset::BindingPoint>(std::move(binding_point));
+
+    DataMap outputs;
+    if (auto result = FirstIndexOffset{}.Apply(program, inputs, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "FirstIndexOffset returned invalid program:\n" << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::FirstIndexOffsetFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/fold_constants_fuzz.cc b/src/tint/lang/wgsl/ast/transform/fold_constants_fuzz.cc
new file mode 100644
index 0000000..4c48a90
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/fold_constants_fuzz.cc
@@ -0,0 +1,46 @@
+// 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/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/wgsl/ast/transform/fold_constants.h"
+
+namespace tint::ast::transform {
+namespace {
+
+void FoldConstantsFuzzer(const Program& program) {
+    DataMap outputs;
+    if (auto result = FoldConstants{}.Apply(program, DataMap{}, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "FoldConstants returned invalid program:\n" << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::FoldConstantsFuzzer);
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
index f1bd0c3..3d7450b 100644
--- a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
@@ -531,6 +531,7 @@
     }
 };
 
+MultiplanarExternalTexture::NewBindingPoints::NewBindingPoints() = default;
 MultiplanarExternalTexture::NewBindingPoints::NewBindingPoints(BindingsMap inputBindingsMap,
                                                                bool may_collide)
     : bindings_map(std::move(inputBindingsMap)), allow_collisions(may_collide) {}
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h
index 3395047..d9ed67a 100644
--- a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h
@@ -36,6 +36,7 @@
 #include "src/tint/lang/core/builtin_fn.h"
 #include "src/tint/lang/wgsl/ast/struct_member.h"
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -66,8 +67,11 @@
     /// which binding slots it should expand into.
     struct NewBindingPoints final : public Castable<NewBindingPoints, Data> {
         /// Constructor
+        NewBindingPoints();
+
+        /// Constructor
         /// @param bm a map to the new binding slots to use.
-        /// /// @param may_collide if true, then validation will be disabled for binding point
+        /// @param may_collide if true, then validation will be disabled for binding point
         /// collisions generated by this transform
         explicit NewBindingPoints(BindingsMap bm, bool may_collide = false);
 
@@ -75,11 +79,14 @@
         ~NewBindingPoints() override;
 
         /// A map of new binding points to use.
-        const BindingsMap bindings_map;
+        BindingsMap bindings_map;
 
         /// If true, then validation will be disabled for bindign poitn collisions generated by this
         /// transform.
-        const bool allow_collisions = false;
+        bool allow_collisions = false;
+
+        /// Reflection for this struct
+        TINT_REFLECT(NewBindingPoints, bindings_map, allow_collisions);
     };
 
     /// Constructor
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture_fuzz.cc b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture_fuzz.cc
new file mode 100644
index 0000000..caddb35
--- /dev/null
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture_fuzz.cc
@@ -0,0 +1,106 @@
+// 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/api/common/binding_point.h"
+#include "src/tint/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/core/type/external_texture.h"
+#include "src/tint/lang/wgsl/ast/module.h"
+#include "src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h"
+#include "src/tint/lang/wgsl/sem/variable.h"
+
+namespace tint::ast::transform {
+namespace {
+
+bool CanRun(const Program& program,
+            const MultiplanarExternalTexture::NewBindingPoints& remappings) {
+    Hashset<BindingPoint, 8> all_binding_points;
+    for (auto* global : program.AST().GlobalVariables()) {
+        if (auto* sem = program.Sem().Get<sem::GlobalVariable>(global)) {
+            if (auto binding_point = sem->Attributes().binding_point) {
+                if (sem->Type()->UnwrapPtrOrRef()->Is<core::type::ExternalTexture>() &&
+                    remappings.bindings_map.find(binding_point.value()) ==
+                        remappings.bindings_map.end()) {
+                    // Missing entry for external texture
+                    return false;
+                }
+
+                all_binding_points.Add(binding_point.value());
+            }
+        }
+    }
+
+    if (!remappings.allow_collisions) {
+        for (auto* global : program.AST().GlobalVariables()) {
+            if (auto* sem = program.Sem().Get<sem::GlobalVariable>(global)) {
+                if (auto binding_point = sem->Attributes().binding_point) {
+                    all_binding_points.Add(binding_point.value());
+                }
+            }
+        }
+        Hashset<BindingPoint, 8> new_binding_points;
+        for (auto& remapping : remappings.bindings_map) {
+            if (all_binding_points.Remove(remapping.first)) {
+                if (!new_binding_points.Add(remapping.second.params)) {
+                    return false;  // Binding collision
+                }
+                if (!new_binding_points.Add(remapping.second.plane_1)) {
+                    return false;  // Binding collision
+                }
+            }
+        }
+        for (auto& binding_point : new_binding_points) {
+            if (!all_binding_points.Add(binding_point)) {
+                return false;  // Binding collision
+            }
+        }
+    }
+    return true;
+}
+
+void MultiplanarExternalTextureFuzzer(
+    const Program& program,
+    const MultiplanarExternalTexture::NewBindingPoints& binding_points) {
+    if (!CanRun(program, binding_points)) {
+        return;
+    }
+
+    DataMap inputs;
+    inputs.Add<MultiplanarExternalTexture::NewBindingPoints>(std::move(binding_points));
+
+    DataMap outputs;
+    if (auto result = MultiplanarExternalTexture{}.Apply(program, inputs, outputs)) {
+        if (!result->IsValid()) {
+            TINT_ICE() << "MultiplanarExternalTexture returned invalid program:\n"
+                       << result->Diagnostics();
+        }
+    }
+}
+
+}  // namespace
+}  // namespace tint::ast::transform
+
+TINT_WGSL_PROGRAM_FUZZER(tint::ast::transform::MultiplanarExternalTextureFuzzer);
diff --git a/src/tint/lang/wgsl/reader/lower/lower_test.cc b/src/tint/lang/wgsl/reader/lower/lower_test.cc
index ba73688..4a0c91c 100644
--- a/src/tint/lang/wgsl/reader/lower/lower_test.cc
+++ b/src/tint/lang/wgsl/reader/lower/lower_test.cc
@@ -55,8 +55,8 @@
     });
 
     auto* src = R"(
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %2:i32 = wgsl.max 1i, 2i
     ret
   }
@@ -65,8 +65,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %2:i32 = max 1i, 2i
     ret
   }
@@ -91,12 +91,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:i32 = wgsl.workgroupUniformLoad %wgvar
     ret %3
   }
@@ -105,12 +105,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %wgvar:ptr<workgroup, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:void = workgroupBarrier
     %4:i32 = load %wgvar
     %5:void = workgroupBarrier
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/accessor_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/accessor_test.cc
index b763ef9..cb5294e 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/accessor_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/accessor_test.cc
@@ -54,8 +54,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<u32, 3>, read_write> = var
     %3:ptr<function, u32, read_write> = access %a, 2u
     %4:u32 = load %3
@@ -80,8 +80,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<u32, 3>, read_write> = var
     %p:ptr<function, array<u32, 3>, read_write> = let %a
     %4:ptr<function, u32, read_write> = access %p, 2u
@@ -107,8 +107,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<u32, 3>, read_write> = var
     %p:ptr<function, array<u32, 3>, read_write> = let %a
     %4:ptr<function, u32, read_write> = access %p, 2u
@@ -135,8 +135,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:vec3<u32> = let vec3<u32>(0u)
     %3:u32 = access %a, 2u
     %b:u32 = let %3
@@ -160,8 +160,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec3<u32>, read_write> = var
     %3:u32 = load_vector_element %a, 2u
     %b:u32 = let %3
@@ -185,8 +185,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec3<u32>, read_write> = var
     %p:ptr<function, vec3<u32>, read_write> = let %a
     %4:u32 = load_vector_element %p, 2u
@@ -211,8 +211,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec3<u32>, read_write> = var
     %p:ptr<function, vec3<u32>, read_write> = let %a
     %4:u32 = load_vector_element %p, 2u
@@ -235,8 +235,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<array<f32, 4>, 3>, read_write> = var
     %3:ptr<function, f32, read_write> = access %a, 2u, 3u
     %4:f32 = load %3
@@ -261,8 +261,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<array<f32, 4>, 3>, read_write> = var
     %p:ptr<function, array<array<f32, 4>, 3>, read_write> = let %a
     %4:ptr<function, f32, read_write> = access %p, 2u, 3u
@@ -288,8 +288,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<array<f32, 4>, 3>, read_write> = var
     %p:ptr<function, array<array<f32, 4>, 3>, read_write> = let %a
     %4:ptr<function, f32, read_write> = access %p, 2u, 3u
@@ -313,8 +313,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, mat3x4<f32>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %a, 2u
     %4:f32 = load_vector_element %3, 3u
@@ -345,8 +345,8 @@
   foo:i32 @offset(0)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, MyStruct, read_write> = var
     %3:ptr<function, i32, read_write> = access %a, 0u
     %4:i32 = load %3
@@ -379,8 +379,8 @@
   foo:i32 @offset(0)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, MyStruct, read_write> = var
     %p:ptr<function, MyStruct, read_write> = let %a
     %4:ptr<function, i32, read_write> = access %p, 0u
@@ -414,8 +414,8 @@
   foo:i32 @offset(0)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, MyStruct, read_write> = var
     %p:ptr<function, MyStruct, read_write> = let %a
     %4:ptr<function, i32, read_write> = access %p, 0u
@@ -457,8 +457,8 @@
   foo:Inner @offset(4)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, Outer, read_write> = var
     %3:ptr<function, f32, read_write> = access %a, 1u, 0u
     %4:f32 = load %3
@@ -505,8 +505,8 @@
   foo:array<Inner, 4> @offset(16)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<Outer, 4>, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %a, 0u, 1u, 1u, 2u
     %4:vec4<f32> = load %3
@@ -529,8 +529,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, array<u32, 4>, read_write> = var
     %3:ptr<function, u32, read_write> = access %a, 2u
     store %3, 0u
@@ -552,8 +552,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec2<f32>, read_write> = var
     %3:f32 = load_vector_element %a, 1u
     %b:f32 = let %3
@@ -577,8 +577,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec2<f32>, read_write> = var
     %p:ptr<function, vec2<f32>, read_write> = let %a
     %4:f32 = load_vector_element %p, 1u
@@ -603,8 +603,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec2<f32>, read_write> = var
     %p:ptr<function, vec2<f32>, read_write> = let %a
     %4:f32 = load_vector_element %p, 1u
@@ -627,8 +627,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec3<f32>, read_write> = var
     %3:vec3<f32> = load %a
     %4:vec4<f32> = swizzle %3, zyxz
@@ -651,8 +651,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, vec3<f32>, read_write> = var
     %3:vec3<f32> = load %a
     %4:vec3<f32> = swizzle %3, zyx
@@ -688,8 +688,8 @@
   foo:vec4<f32> @offset(16)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, MyStruct, read_write> = var
     %3:ptr<function, vec4<f32>, read_write> = access %a, 1u
     %4:vec4<f32> = load %3
@@ -714,8 +714,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:vec3<u32> = let vec3<u32>(0u)
     %3:u32 = access %a, 2u
     %b:u32 = let %3
@@ -737,8 +737,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:mat3x4<f32> = let mat3x4<f32>(vec4<f32>(0.0f))
     %3:f32 = access %a, 2u, 3u
     %b:f32 = let %3
@@ -768,8 +768,8 @@
   foo:i32 @offset(0)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:MyStruct = let MyStruct(0i)
     %3:i32 = access %a, 0u
     %b:i32 = let %3
@@ -809,8 +809,8 @@
   foo:Inner @offset(4)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:Outer = let Outer(0i, Inner(0.0f))
     %3:f32 = access %a, 1u, 0u
     %b:f32 = let %3
@@ -856,8 +856,8 @@
   foo:array<Inner, 4> @offset(16)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:array<Outer, 4> = let array<Outer, 4>(Outer(0i, array<Inner, 4>(Inner(0i, 0.0f, vec4<f32>(0.0f)))))
     %3:vec4<f32> = access %a, 0u, 1u, 1u, 2u
     %b:vec4<f32> = let %3
@@ -879,8 +879,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:vec2<f32> = let vec2<f32>(0.0f)
     %3:f32 = access %a, 1u
     %b:f32 = let %3
@@ -902,8 +902,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:vec3<f32> = let vec3<f32>(0.0f)
     %3:vec4<f32> = swizzle %a, zyxz
     %b:vec4<f32> = let %3
@@ -925,8 +925,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:vec3<f32> = let vec3<f32>(0.0f)
     %3:vec3<f32> = swizzle %a, zyx
     %4:vec2<f32> = swizzle %3, yy
@@ -961,8 +961,8 @@
   foo:vec4<f32> @offset(16)
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:MyStruct = let MyStruct(0i, vec4<f32>(0.0f))
     %3:vec4<f32> = access %a, 1u
     %4:vec3<f32> = swizzle %3, zyx
@@ -989,8 +989,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %i:i32 = let 1i
     %3:i32 = access vec3<i32>(1i, 2i, 3i), %i
     %b:ptr<function, i32, read_write> = var, %3
@@ -1014,8 +1014,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %i:i32 = let 1i
     %3:i32 = access vec2<i32>(1i, 2i), %i
     %b:ptr<function, i32, read_write> = var, %3
@@ -1039,8 +1039,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %i:i32 = let 1i
     %3:i32 = add %i, 2i
     %4:i32 = sub %3, 3i
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/binary_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/binary_test.cc
index 9903836..79b7366 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/binary_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/binary_test.cc
@@ -46,13 +46,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = add %3, 4u
     %tint_symbol:u32 = let %4
@@ -70,12 +70,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = add %3, 1u
     store %v1, %4
@@ -93,12 +93,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = add %3, 1u
     store %v1, %4
@@ -116,13 +116,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = sub %3, 4u
     %tint_symbol:u32 = let %4
@@ -140,12 +140,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, i32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:i32 = load %v1
     %4:i32 = sub %3, 1i
     store %v1, %4
@@ -163,12 +163,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = sub %3, 1u
     store %v1, %4
@@ -186,13 +186,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = mul %3, 4u
     %tint_symbol:u32 = let %4
@@ -210,12 +210,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = mul %3, 1u
     store %v1, %4
@@ -233,13 +233,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = div %3, 4u
     %tint_symbol:u32 = let %4
@@ -257,12 +257,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = div %3, 1u
     store %v1, %4
@@ -280,13 +280,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = mod %3, 4u
     %tint_symbol:u32 = let %4
@@ -304,12 +304,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = mod %3, 1u
     store %v1, %4
@@ -327,13 +327,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = and %3, 4u
     %tint_symbol:u32 = let %4
@@ -351,12 +351,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, bool, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:bool = load %v1
     %4:bool = and %3, false
     store %v1, %4
@@ -374,13 +374,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = or %3, 4u
     %tint_symbol:u32 = let %4
@@ -398,12 +398,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, bool, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:bool = load %v1
     %4:bool = or %3, false
     store %v1, %4
@@ -421,13 +421,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = xor %3, 4u
     %tint_symbol:u32 = let %4
@@ -445,12 +445,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = xor %3, 1u
     store %v1, %4
@@ -469,25 +469,25 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():bool -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():bool {
+  $B1: {
     ret true
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:bool = call %my_func
-    %4:bool = if %3 [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    %4:bool = if %3 [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         exit_if false  # if_1
       }
-      %b4 = block {  # false
+      $B4: {  # false
         exit_if false  # if_1
       }
     }
     %logical_and:bool = let %4
-    if %logical_and [t: %b5] {  # if_2
-      %b5 = block {  # true
+    if %logical_and [t: $B5] {  # if_2
+      $B5: {  # true
         exit_if  # if_2
       }
     }
@@ -506,25 +506,25 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():bool -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():bool {
+  $B1: {
     ret true
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:bool = call %my_func
-    %4:bool = if %3 [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    %4:bool = if %3 [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         exit_if true  # if_1
       }
-      %b4 = block {  # false
+      $B4: {  # false
         exit_if true  # if_1
       }
     }
     %logical_or:bool = let %4
-    if %logical_or [t: %b5] {  # if_2
-      %b5 = block {  # true
+    if %logical_or [t: $B5] {  # if_2
+      $B5: {  # true
         exit_if  # if_2
       }
     }
@@ -542,13 +542,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:bool = eq %3, 4u
     %tint_symbol:bool = let %4
@@ -566,13 +566,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:bool = neq %3, 4u
     %tint_symbol:bool = let %4
@@ -590,13 +590,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:bool = lt %3, 4u
     %tint_symbol:bool = let %4
@@ -614,13 +614,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:bool = gt %3, 4u
     %tint_symbol:bool = let %4
@@ -638,13 +638,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:bool = lte %3, 4u
     %tint_symbol:bool = let %4
@@ -662,13 +662,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:bool = gte %3, 4u
     %tint_symbol:bool = let %4
@@ -686,13 +686,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = shl %3, 4u
     %tint_symbol:u32 = let %4
@@ -710,12 +710,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = shl %3, 1u
     store %v1, %4
@@ -733,13 +733,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 0u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = shr %3, 4u
     %tint_symbol:u32 = let %4
@@ -757,12 +757,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = load %v1
     %4:u32 = shr %3, 1u
     store %v1, %4
@@ -782,17 +782,17 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():f32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():f32 {
+  $B1: {
     ret 0.0f
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:f32 = call %my_func
     %4:bool = lt %3, 2.0f
-    %5:bool = if %4 [t: %b3, f: %b4] {  # if_1
-      %b3 = block {  # true
+    %5:bool = if %4 [t: $B3, f: $B4] {  # if_1
+      $B3: {  # true
         %6:f32 = call %my_func
         %7:f32 = call %my_func
         %8:f32 = mul 2.29999995231628417969f, %7
@@ -800,7 +800,7 @@
         %10:bool = gt 2.5f, %9
         exit_if %10  # if_1
       }
-      %b4 = block {  # false
+      $B4: {  # false
         exit_if false  # if_1
       }
     }
@@ -820,13 +820,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func(%p:bool):bool -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func(%p:bool):bool {
+  $B1: {
     ret true
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %4:bool = call %my_func, false
     %tint_symbol:bool = let %4
     ret
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/builtin_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/builtin_test.cc
index fecb029..7423f12 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/builtin_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/builtin_test.cc
@@ -46,12 +46,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %i:ptr<private, f32, read_write> = var, 1.0f
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:f32 = load %i
     %4:f32 = asin %3
     %tint_symbol:f32 = let %4
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/call_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/call_test.cc
index a024c57..eb3dac7 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/call_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/call_test.cc
@@ -48,13 +48,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():f32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():f32 {
+  $B1: {
     ret 0.0f
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:f32 = call %my_func
     %4:f32 = bitcast %3
     %tint_symbol:f32 = let %4
@@ -74,8 +74,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test_function = @fragment func():void -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test_function = @fragment func():void {
+  $B1: {
     discard
     ret
   }
@@ -91,13 +91,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func(%p:f32):void -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func(%p:f32):void {
+  $B1: {
     ret
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %4:void = call %my_func, 6.0f
     ret
   }
@@ -113,12 +113,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %i:ptr<private, i32, read_write> = var, 1i
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:i32 = load %i
     %4:f32 = convert %3
     %tint_symbol:f32 = let %4
@@ -135,7 +135,7 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %i:ptr<private, vec3<f32>, read_write> = var, vec3<f32>(0.0f)
 }
 
@@ -150,12 +150,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %i:ptr<private, f32, read_write> = var, 1.0f
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:f32 = load %i
     %4:vec3<f32> = construct 2.0f, 3.0f, %3
     %tint_symbol:vec3<f32> = let %4
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/function_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/function_test.cc
index da4dd6b..1af67b1 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/function_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/function_test.cc
@@ -47,8 +47,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @vertex func():vec4<f32> [@position] -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @vertex func():vec4<f32> [@position] {
+  $B1: {
     ret vec4<f32>(0.0f)
   }
 }
@@ -62,8 +62,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @fragment func():void -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @fragment func():void {
+  $B1: {
     ret
   }
 }
@@ -78,8 +78,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test = @compute @workgroup_size(8, 4, 2) func():void -> %b1 {
-  %b1 = block {
+              R"(%test = @compute @workgroup_size(8, 4, 2) func():void {
+  $B1: {
     ret
   }
 }
@@ -93,8 +93,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test = func():vec3<f32> -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test = func():vec3<f32> {
+  $B1: {
     ret vec3<f32>(0.0f)
   }
 }
@@ -108,13 +108,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test = func():f32 -> %b1 {
-  %b1 = block {
-    if true [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test = func():f32 {
+  $B1: {
+    if true [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret 0.0f
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret 1.0f
       }
     }
@@ -132,8 +132,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @vertex func():vec4<f32> [@position] -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @vertex func():vec4<f32> [@position] {
+  $B1: {
     ret vec4<f32>(1.0f, 2.0f, 3.0f, 4.0f)
   }
 }
@@ -149,8 +149,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test = @vertex func():vec4<f32> [@invariant, @position] -> %b1 {
-  %b1 = block {
+              R"(%test = @vertex func():vec4<f32> [@invariant, @position] {
+  $B1: {
     ret vec4<f32>(1.0f, 2.0f, 3.0f, 4.0f)
   }
 }
@@ -165,8 +165,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test = @fragment func():vec4<f32> [@location(1)] -> %b1 {
-  %b1 = block {
+              R"(%test = @fragment func():vec4<f32> [@location(1)] {
+  $B1: {
     ret vec4<f32>(1.0f, 2.0f, 3.0f, 4.0f)
   }
 }
@@ -182,10 +182,9 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(
-        Disassemble(m.Get()),
-        R"(%test = @fragment func():vec4<f32> [@location(1), @interpolate(linear, centroid)] -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()),
+              R"(%test = @fragment func():vec4<f32> [@location(1), @interpolate(linear, centroid)] {
+  $B1: {
     ret vec4<f32>(1.0f, 2.0f, 3.0f, 4.0f)
   }
 }
@@ -200,8 +199,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @fragment func():f32 [@frag_depth] -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @fragment func():f32 [@frag_depth] {
+  $B1: {
     ret 1.0f
   }
 }
@@ -216,8 +215,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @fragment func():u32 [@sample_mask] -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test = @fragment func():u32 [@sample_mask] {
+  $B1: {
     ret 1u
   }
 }
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/let_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/let_test.cc
index bfce845..8b67280 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/let_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/let_test.cc
@@ -45,8 +45,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:i32 = let 42i
     ret
   }
@@ -61,8 +61,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:i32 = let 3i
     ret
   }
@@ -79,8 +79,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:i32 = let 1i
     %b:i32 = let %a
     %c:i32 = let %b
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/materialize_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/materialize_test.cc
index 6891335..7b1b1e6 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/materialize_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/materialize_test.cc
@@ -46,8 +46,8 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%test_function = func():f32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%test_function = func():f32 {
+  $B1: {
     ret 2.0f
   }
 }
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir_test.cc
index f8f2d0a..466498e 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir_test.cc
@@ -83,8 +83,8 @@
 
     EXPECT_EQ(m->functions[0]->Stage(), core::ir::Function::PipelineStage::kUndefined);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():void -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():void {
+  $B1: {
     ret
   }
 }
@@ -104,8 +104,8 @@
 
     EXPECT_EQ(m->functions[0]->Stage(), core::ir::Function::PipelineStage::kUndefined);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func(%a:u32):u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func(%a:u32):u32 {
+  $B1: {
     ret %a
   }
 }
@@ -126,8 +126,8 @@
 
     EXPECT_EQ(m->functions[0]->Stage(), core::ir::Function::PipelineStage::kUndefined);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func(%a:u32, %b:i32, %c:bool):void -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func(%a:u32, %b:i32, %c:bool):void {
+  $B1: {
     ret
   }
 }
@@ -155,13 +155,13 @@
     ASSERT_EQ(1u, m.functions.Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    if true [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         exit_if  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         exit_if  # if_1
       }
     }
@@ -183,10 +183,10 @@
     ASSERT_EQ(1u, m.functions.Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         ret
       }
     }
@@ -208,13 +208,13 @@
     ASSERT_EQ(1u, m.functions.Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    if true [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         exit_if  # if_1
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -236,13 +236,13 @@
     ASSERT_EQ(1u, m.functions.Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2, f: %b3] {  # if_1
-      %b2 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    if true [t: $B2, f: $B3] {  # if_1
+      $B2: {  # true
         ret
       }
-      %b3 = block {  # false
+      $B3: {  # false
         ret
       }
     }
@@ -263,12 +263,12 @@
     auto m = res.Move();
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
-        loop [b: %b3] {  # loop_1
-          %b3 = block {  # body
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
+        loop [b: $B3] {  # loop_1
+          $B3: {  # body
             exit_loop  # loop_1
           }
         }
@@ -297,10 +297,10 @@
     EXPECT_EQ(0u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         exit_loop  # loop_1
       }
     }
@@ -327,19 +327,19 @@
     EXPECT_EQ(1u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        if true [t: %b4] {  # if_1
-          %b4 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        if true [t: $B4] {  # if_1
+          $B4: {  # true
             exit_loop  # loop_1
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -365,14 +365,14 @@
     EXPECT_EQ(1u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        break_if true %b2
+      $B3: {  # continuing
+        break_if true  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret
@@ -392,15 +392,15 @@
 
     auto m = res.Move();
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %a:bool = let true
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        break_if %a %b2
+      $B3: {  # continuing
+        break_if %a  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret
@@ -426,19 +426,19 @@
     EXPECT_EQ(1u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        if true [t: %b4] {  # if_1
-          %b4 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        if true [t: $B4] {  # if_1
+          $B4: {  # true
             ret
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     unreachable
@@ -463,10 +463,10 @@
     EXPECT_EQ(0u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         ret
       }
     }
@@ -501,15 +501,15 @@
     EXPECT_EQ(0u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         ret
       }
     }
-    if true [t: %b3] {  # if_1
-      %b3 = block {  # true
+    if true [t: $B3] {  # if_1
+      $B3: {  # true
         ret
       }
     }
@@ -536,15 +536,15 @@
     EXPECT_EQ(0u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
-        if true [t: %b3, f: %b4] {  # if_1
-          %b3 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
+        if true [t: $B3, f: $B4] {  # if_1
+          $B3: {  # true
             exit_loop  # loop_1
           }
-          %b4 = block {  # false
+          $B4: {  # false
             exit_loop  # loop_1
           }
         }
@@ -575,50 +575,50 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        loop [b: %b4, c: %b5] {  # loop_2
-          %b4 = block {  # body
-            if true [t: %b6] {  # if_1
-              %b6 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        loop [b: $B4, c: $B5] {  # loop_2
+          $B4: {  # body
+            if true [t: $B6] {  # if_1
+              $B6: {  # true
                 exit_loop  # loop_2
               }
             }
-            if true [t: %b7] {  # if_2
-              %b7 = block {  # true
-                continue %b5
+            if true [t: $B7] {  # if_2
+              $B7: {  # true
+                continue  # -> $B5
               }
             }
-            continue %b5
+            continue  # -> $B5
           }
-          %b5 = block {  # continuing
-            loop [b: %b8] {  # loop_3
-              %b8 = block {  # body
+          $B5: {  # continuing
+            loop [b: $B8] {  # loop_3
+              $B8: {  # body
                 exit_loop  # loop_3
               }
             }
-            loop [b: %b9, c: %b10] {  # loop_4
-              %b9 = block {  # body
-                continue %b10
+            loop [b: $B9, c: $B10] {  # loop_4
+              $B9: {  # body
+                continue  # -> $B10
               }
-              %b10 = block {  # continuing
-                break_if true %b9
+              $B10: {  # continuing
+                break_if true  # -> [t: exit_loop loop_4, f: $B9]
               }
             }
-            next_iteration %b4
+            next_iteration  # -> $B4
           }
         }
-        if true [t: %b11] {  # if_3
-          %b11 = block {  # true
+        if true [t: $B11] {  # if_3
+          $B11: {  # true
             exit_loop  # loop_1
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -643,22 +643,22 @@
     EXPECT_EQ(1u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        if false [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        if false [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -683,22 +683,22 @@
     EXPECT_EQ(0u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        if true [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        if true [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
         ret
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     ret
@@ -723,31 +723,31 @@
     EXPECT_EQ(1u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
         %i:ptr<function, i32, read_write> = var
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %3:i32 = load %i
         %4:bool = lt %3, 10i
-        if %4 [t: %b5, f: %b6] {  # if_1
-          %b5 = block {  # true
+        if %4 [t: $B5, f: $B6] {  # if_1
+          $B5: {  # true
             exit_if  # if_1
           }
-          %b6 = block {  # false
+          $B6: {  # false
             exit_loop  # loop_1
           }
         }
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %5:i32 = load %i
         %6:i32 = add %5, 1i
         store %i, %6
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
     }
     ret
@@ -772,14 +772,14 @@
     EXPECT_EQ(0u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %i:ptr<function, i32, read_write> = var
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         exit_loop  # loop_1
       }
     }
@@ -805,10 +805,10 @@
     EXPECT_EQ(0u, loop->Continuing()->InboundSiblingBranches().Length());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         exit_loop  # loop_1
       }
     }
@@ -850,16 +850,16 @@
     EXPECT_TRUE(cases[2].selectors[0].IsDefault());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    switch 1i [c: (0i, %b2), c: (1i, %b3), c: (default, %b4)] {  # switch_1
-      %b2 = block {  # case
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    switch 1i [c: (0i, $B2), c: (1i, $B3), c: (default, $B4)] {  # switch_1
+      $B2: {  # case
         exit_switch  # switch_1
       }
-      %b3 = block {  # case
+      $B3: {  # case
         exit_switch  # switch_1
       }
-      %b4 = block {  # case
+      $B4: {  # case
         exit_switch  # switch_1
       }
     }
@@ -898,10 +898,10 @@
     EXPECT_TRUE(cases[0].selectors[2].IsDefault());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    switch 1i [c: (0i 1i default, %b2)] {  # switch_1
-      %b2 = block {  # case
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    switch 1i [c: (0i 1i default, $B2)] {  # switch_1
+      $B2: {  # case
         exit_switch  # switch_1
       }
     }
@@ -929,10 +929,10 @@
     EXPECT_TRUE(cases[0].selectors[0].IsDefault());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    switch 1i [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    switch 1i [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         exit_switch  # switch_1
       }
     }
@@ -969,13 +969,13 @@
     // This is 1 because the if is dead-code eliminated and the return doesn't happen.
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    switch 1i [c: (0i, %b2), c: (default, %b3)] {  # switch_1
-      %b2 = block {  # case
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    switch 1i [c: (0i, $B2), c: (default, $B3)] {  # switch_1
+      $B2: {  # case
         exit_switch  # switch_1
       }
-      %b3 = block {  # case
+      $B3: {  # case
         exit_switch  # switch_1
       }
     }
@@ -1011,13 +1011,13 @@
     EXPECT_TRUE(cases[1].selectors[0].IsDefault());
 
     EXPECT_EQ(Disassemble(m),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
-    switch 1i [c: (0i, %b2), c: (default, %b3)] {  # switch_1
-      %b2 = block {  # case
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
+    switch 1i [c: (0i, $B2), c: (default, $B3)] {  # switch_1
+      $B2: {  # case
         ret
       }
-      %b3 = block {  # case
+      $B3: {  # case
         ret
       }
     }
@@ -1035,13 +1035,13 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%b = func():i32 -> %b1 {
-  %b1 = block {
+              R"(%b = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:i32 = call %b
     ret
   }
@@ -1060,8 +1060,8 @@
 
     EXPECT_EQ(
         Disassemble(m.Get()),
-        R"(%f = @fragment func(%a:vec4<f32> [@invariant, @position]):vec4<f32> [@location(1)] -> %b1 {
-  %b1 = block {
+        R"(%f = @fragment func(%a:vec4<f32> [@invariant, @position]):vec4<f32> [@location(1)] {
+  $B1: {
     ret %a
   }
 }
@@ -1076,8 +1076,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%f = @fragment func(%a:f32 [@location(2)]):f32 [@location(1)] -> %b1 {
-  %b1 = block {
+              R"(%f = @fragment func(%a:f32 [@location(2)]):f32 [@location(1)] {
+  $B1: {
     ret %a
   }
 }
@@ -1097,8 +1097,8 @@
 
     EXPECT_EQ(
         Disassemble(m.Get()),
-        R"(%f = @fragment func(%a:f32 [@location(2), @interpolate(linear, centroid)]):f32 [@location(1)] -> %b1 {
-  %b1 = block {
+        R"(%f = @fragment func(%a:f32 [@location(2), @interpolate(linear, centroid)]):f32 [@location(1)] {
+  $B1: {
     ret %a
   }
 }
@@ -1115,10 +1115,9 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(
-        Disassemble(m.Get()),
-        R"(%f = @fragment func(%a:f32 [@location(2), @interpolate(flat)]):f32 [@location(1)] -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()),
+              R"(%f = @fragment func(%a:f32 [@location(2), @interpolate(flat)]):f32 [@location(1)] {
+  $B1: {
     ret %a
   }
 }
@@ -1139,8 +1138,8 @@
 
     EXPECT_EQ(m->functions[0]->Stage(), core::ir::Function::PipelineStage::kUndefined);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():void -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():void {
+  $B1: {
     ret
   }
 }
@@ -1161,8 +1160,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%f = func():void -> %b1 {
-  %b1 = block {
+              R"(%f = func():void {
+  $B1: {
     ret
   }
 }
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/shadowing_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/shadowing_test.cc
index f01b4da..c3251f5 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/shadowing_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/shadowing_test.cc
@@ -63,8 +63,8 @@
   i:i32 @offset(0)
 }
 
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %S:ptr<function, S, read_write> = var, S(0i)
     %3:ptr<function, i32, read_write> = access %S, 0u
     %4:i32 = load %3
@@ -91,8 +91,8 @@
   i:i32 @offset(0)
 }
 
-%f = func(%S:S):i32 -> %b1 {
-  %b1 = block {
+%f = func(%S:S):i32 {
+  $B1: {
     %3:i32 = access %S, 0u
     ret %3
   }
@@ -113,12 +113,12 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %i:ptr<private, i32, read_write> = var, 1i
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:i32 = load %i
     %4:i32 = add %3, 1i
     store %i, %4
@@ -145,12 +145,12 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %i:ptr<private, i32, read_write> = var, 1i
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:i32 = load %i
     %4:i32 = add %3, 1i
     store %i, %4
@@ -178,11 +178,11 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         %3:i32 = load %i
         %4:i32 = add %3, 1i
         store %i, %4
@@ -217,11 +217,11 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         %3:i32 = load %i
         %4:i32 = add %3, 1i
         store %i, %4
@@ -252,18 +252,18 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %i
         %4:bool = lt %3, 4i
-        if %4 [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+        if %4 [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
@@ -273,8 +273,8 @@
         %8:i32 = load %i_1
         ret %8
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     %9:i32 = load %i
@@ -298,18 +298,18 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %i
         %4:bool = lt %3, 4i
-        if %4 [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+        if %4 [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
@@ -318,8 +318,8 @@
         %i_1:i32 = let %6  # %i_1: 'i'
         ret %i_1
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     %8:i32 = load %i
@@ -342,28 +342,28 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %i_1:ptr<function, f32, read_write> = var, 0.0f  # %i_1: 'i'
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %4:f32 = load %i_1
         %5:bool = lt %4, 4.0f
-        if %5 [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+        if %5 [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
         %6:f32 = load %i_1
         %j:f32 = let %6
-        continue %b6
+        continue  # -> $B6
       }
     }
     %8:i32 = load %i
@@ -386,26 +386,26 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %i_1:f32 = let 0.0f  # %i_1: 'i'
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %4:bool = lt %i_1, 4.0f
-        if %4 [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+        if %4 [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
         %j:f32 = let %i_1
-        continue %b6
+        continue  # -> $B6
       }
     }
     %6:i32 = load %i
@@ -429,22 +429,22 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %x:ptr<function, i32, read_write> = var, 0i
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %4:i32 = load %i
         %5:bool = lt %4, 4i
-        if %5 [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+        if %5 [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
@@ -476,22 +476,22 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %x:ptr<function, i32, read_write> = var, 0i
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %4:i32 = load %i
         %5:bool = lt %4, 4i
-        if %5 [t: %b4, f: %b5] {  # if_1
-          %b4 = block {  # true
+        if %5 [t: $B4, f: $B5] {  # if_1
+          $B4: {  # true
             exit_if  # if_1
           }
-          %b5 = block {  # false
+          $B5: {  # false
             exit_loop  # loop_1
           }
         }
@@ -527,15 +527,15 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %i
         %4:bool = eq %3, 2i
-        if %4 [t: %b4] {  # if_1
-          %b4 = block {  # true
+        if %4 [t: $B4] {  # if_1
+          $B4: {  # true
             exit_loop  # loop_1
           }
         }
@@ -544,15 +544,15 @@
         %i_1:ptr<function, i32, read_write> = var, %6  # %i_1: 'i'
         %8:i32 = load %i_1
         %9:bool = eq %8, 3i
-        if %9 [t: %b5] {  # if_2
-          %b5 = block {  # true
+        if %9 [t: $B5] {  # if_2
+          $B5: {  # true
             exit_loop  # loop_1
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     %10:i32 = load %i
@@ -581,15 +581,15 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %i
         %4:bool = eq %3, 2i
-        if %4 [t: %b4] {  # if_1
-          %b4 = block {  # true
+        if %4 [t: $B4] {  # if_1
+          $B4: {  # true
             exit_loop  # loop_1
           }
         }
@@ -597,15 +597,15 @@
         %6:i32 = add %5, 1i
         %i_1:i32 = let %6  # %i_1: 'i'
         %8:bool = eq %i_1, 3i
-        if %8 [t: %b5] {  # if_2
-          %b5 = block {  # true
+        if %8 [t: $B5] {  # if_2
+          $B5: {  # true
             exit_loop  # loop_1
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
-        next_iteration %b2
+      $B3: {  # continuing
+        next_iteration  # -> $B2
       }
     }
     %9:i32 = load %i
@@ -635,27 +635,27 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %i
         %4:bool = eq %3, 2i
-        if %4 [t: %b4] {  # if_1
-          %b4 = block {  # true
+        if %4 [t: $B4] {  # if_1
+          $B4: {  # true
             exit_loop  # loop_1
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         %5:i32 = load %i
         %6:i32 = add %5, 1i
         %i_1:ptr<function, i32, read_write> = var, %6  # %i_1: 'i'
         %8:i32 = load %i_1
         %9:bool = gt %8, 2i
-        break_if %9 %b2
+        break_if %9  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     %10:i32 = load %i
@@ -685,26 +685,26 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %i
         %4:bool = eq %3, 2i
-        if %4 [t: %b4] {  # if_1
-          %b4 = block {  # true
+        if %4 [t: $B4] {  # if_1
+          $B4: {  # true
             exit_loop  # loop_1
           }
         }
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         %5:i32 = load %i
         %6:i32 = add %5, 1i
         %i_1:i32 = let %6  # %i_1: 'i'
         %8:bool = gt %i_1, 2i
-        break_if %8 %b2
+        break_if %8  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     %9:i32 = load %i
@@ -735,23 +735,23 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
     %3:i32 = load %i
-    switch %3 [c: (0i, %b2), c: (1i, %b3), c: (default, %b4)] {  # switch_1
-      %b2 = block {  # case
+    switch %3 [c: (0i, $B2), c: (1i, $B3), c: (default, $B4)] {  # switch_1
+      $B2: {  # case
         %4:i32 = load %i
         ret %4
       }
-      %b3 = block {  # case
+      $B3: {  # case
         %5:i32 = load %i
         %6:i32 = add %5, 1i
         %i_1:ptr<function, i32, read_write> = var, %6  # %i_1: 'i'
         %8:i32 = load %i_1
         ret %8
       }
-      %b4 = block {  # case
+      $B4: {  # case
         %9:i32 = load %i
         ret %9
       }
@@ -783,22 +783,22 @@
 
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%f = func():i32 {
+  $B1: {
     %i:ptr<function, i32, read_write> = var
     %3:i32 = load %i
-    switch %3 [c: (0i, %b2), c: (1i, %b3), c: (default, %b4)] {  # switch_1
-      %b2 = block {  # case
+    switch %3 [c: (0i, $B2), c: (1i, $B3), c: (default, $B4)] {  # switch_1
+      $B2: {  # case
         %4:i32 = load %i
         ret %4
       }
-      %b3 = block {  # case
+      $B3: {  # case
         %5:i32 = load %i
         %6:i32 = add %5, 1i
         %i_1:i32 = let %6  # %i_1: 'i'
         ret %i_1
       }
-      %b4 = block {  # case
+      $B4: {  # case
         %8:i32 = load %i
         ret %8
       }
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/store_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/store_test.cc
index c2f9ad1..b2ac91e 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/store_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/store_test.cc
@@ -47,12 +47,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %a:ptr<private, u32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     store %a, 4u
     ret
   }
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/unary_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/unary_test.cc
index 62c7e6f..8342e48 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/unary_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/unary_test.cc
@@ -46,13 +46,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():bool -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():bool {
+  $B1: {
     ret false
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:bool = call %my_func
     %4:bool = eq %3, false
     %tint_symbol:bool = let %4
@@ -70,13 +70,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():vec4<bool> -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():vec4<bool> {
+  $B1: {
     ret vec4<bool>(false)
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:vec4<bool> = call %my_func
     %4:vec4<bool> = eq %3, vec4<bool>(false)
     %tint_symbol:vec4<bool> = let %4
@@ -94,13 +94,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():u32 {
+  $B1: {
     ret 1u
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:u32 = call %my_func
     %4:u32 = complement %3
     %tint_symbol:u32 = let %4
@@ -118,13 +118,13 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():i32 -> %b1 {
-  %b1 = block {
+    EXPECT_EQ(Disassemble(m.Get()), R"(%my_func = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %3:i32 = call %my_func
     %4:i32 = negation %3
     %tint_symbol:i32 = let %4
@@ -143,12 +143,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, i32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %v2:ptr<private, i32, read_write> = let %v1
     ret
   }
@@ -167,12 +167,12 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %v1:ptr<private, i32, read_write> = var
 }
 
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %v3:ptr<private, i32, read_write> = let %v1
     store %v3, 42i
     ret
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/var_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/var_test.cc
index b846045..c683285 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/var_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/var_test.cc
@@ -45,7 +45,7 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %a:ptr<private, u32, read_write> = var
 }
 
@@ -59,7 +59,7 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %a:ptr<private, u32, read_write> = var, 2u
 }
 
@@ -72,7 +72,7 @@
     auto m = Build();
     ASSERT_EQ(m, Success);
 
-    EXPECT_EQ(Disassemble(m.Get()), R"(%b1 = block {  # root
+    EXPECT_EQ(Disassemble(m.Get()), R"($B1: {  # root
   %a:ptr<storage, u32, read> = var @binding_point(2, 3)
 }
 
@@ -87,8 +87,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, u32, read_write> = var
     ret
   }
@@ -105,8 +105,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, u32, read_write> = var, 2u
     ret
   }
@@ -123,8 +123,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, u32, read_write> = var
     %3:u32 = load %a
     %4:u32 = add %3, 2u
@@ -143,8 +143,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, i32, read_write> = var
     store %a, 42i
     ret
@@ -180,13 +180,13 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%f = func(%p:i32):i32 -> %b1 {
-  %b1 = block {
+              R"(%f = func(%p:i32):i32 {
+  $B1: {
     ret %p
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %a:ptr<function, array<array<array<i32, 5>, 5>, 5>, read_write> = var
     %5:i32 = call %f, 1i
     %6:i32 = call %f, 2i
@@ -226,13 +226,13 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%f = func(%p:i32):i32 -> %b1 {
-  %b1 = block {
+              R"(%f = func(%p:i32):i32 {
+  $B1: {
     ret %p
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %a:ptr<function, array<vec4<f32>, 5>, read_write> = var
     %5:i32 = call %f, 1i
     %6:ptr<function, vec4<f32>, read_write> = access %a, %5
@@ -274,13 +274,13 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%f = func(%p:i32):i32 -> %b1 {
-  %b1 = block {
+              R"(%f = func(%p:i32):i32 {
+  $B1: {
     ret %p
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %a:ptr<function, array<mat3x4<f32>, 5>, read_write> = var
     %5:i32 = call %f, 1i
     %6:i32 = call %f, 2i
@@ -306,8 +306,8 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b1 {
-  %b1 = block {
+              R"(%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B1: {
     %a:ptr<function, i32, read_write> = var
     %3:i32 = load %a
     %4:i32 = add %3, 42i
@@ -345,13 +345,13 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%f = func(%p:i32):i32 -> %b1 {
-  %b1 = block {
+              R"(%f = func(%p:i32):i32 {
+  $B1: {
     ret %p
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %a:ptr<function, array<array<array<i32, 5>, 5>, 5>, read_write> = var
     %5:i32 = call %f, 1i
     %6:i32 = call %f, 2i
@@ -397,13 +397,13 @@
     ASSERT_EQ(m, Success);
 
     EXPECT_EQ(Disassemble(m.Get()),
-              R"(%f = func(%p:i32):i32 -> %b1 {
-  %b1 = block {
+              R"(%f = func(%p:i32):i32 {
+  $B1: {
     ret %p
   }
 }
-%test_function = @compute @workgroup_size(1, 1, 1) func():void -> %b2 {
-  %b2 = block {
+%test_function = @compute @workgroup_size(1, 1, 1) func():void {
+  $B2: {
     %a:ptr<function, array<mat3x4<f32>, 5>, read_write> = var
     %5:i32 = call %f, 1i
     %6:i32 = call %f, 2i
diff --git a/src/tint/lang/wgsl/writer/raise/ptr_to_ref_test.cc b/src/tint/lang/wgsl/writer/raise/ptr_to_ref_test.cc
index 851f9bb..b663af0 100644
--- a/src/tint/lang/wgsl/writer/raise/ptr_to_ref_test.cc
+++ b/src/tint/lang/wgsl/writer/raise/ptr_to_ref_test.cc
@@ -85,8 +85,8 @@
     b.Append(fn->Block(), [&] { b.Return(fn); });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, i32, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):void {
+  $B1: {
     ret
   }
 }
@@ -104,7 +104,7 @@
     b.Append(mod.root_block, [&] { b.Var(ty.ptr<private_, i32>()); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, i32, read_write> = var
 }
 
@@ -112,7 +112,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %1:ref<private, i32, read_write> = var
 }
 
@@ -131,8 +131,8 @@
     });
 
     auto* src = R"(
-%1 = func():i32 -> %b1 {
-  %b1 = block {
+%1 = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = load %2
     ret %3
@@ -142,8 +142,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func():i32 -> %b1 {
-  %b1 = block {
+%1 = func():i32 {
+  $B1: {
     %2:ref<function, i32, read_write> = var
     %3:i32 = load %2
     ret %3
@@ -165,8 +165,8 @@
     });
 
     auto* src = R"(
-%1 = func():void -> %b1 {
-  %b1 = block {
+%1 = func():void {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 42i
     ret
@@ -176,8 +176,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func():void -> %b1 {
-  %b1 = block {
+%1 = func():void {
+  $B1: {
     %2:ref<function, i32, read_write> = var
     store %2, 42i
     ret
@@ -197,8 +197,8 @@
     b.Append(fn->Block(), [&] { b.Return(fn, b.Load(ptr)); });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, i32, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):i32 {
+  $B1: {
     %3:i32 = load %2
     ret %3
   }
@@ -207,8 +207,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, i32, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):i32 {
+  $B1: {
     %3:ref<function, i32, read_write> = ptr-to-ref %2
     %4:i32 = load %3
     ret %4
@@ -231,8 +231,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, i32, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):void {
+  $B1: {
     store %2, 42i
     ret
   }
@@ -241,8 +241,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, i32, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):void {
+  $B1: {
     %3:ref<function, i32, read_write> = ptr-to-ref %2
     store %3, 42i
     ret
@@ -267,13 +267,13 @@
     });
 
     auto* src = R"(
-%1 = func(%p:ptr<function, i32, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%p:ptr<function, i32, read_write>):void {
+  $B1: {
     ret
   }
 }
-%3 = func():void -> %b2 {
-  %b2 = block {
+%3 = func():void {
+  $B2: {
     %4:ptr<function, i32, read_write> = var
     %5:void = call %1, %4
     ret
@@ -283,13 +283,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%p:ptr<function, i32, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%p:ptr<function, i32, read_write>):void {
+  $B1: {
     ret
   }
 }
-%3 = func():void -> %b2 {
-  %b2 = block {
+%3 = func():void {
+  $B2: {
     %4:ref<function, i32, read_write> = var
     %5:ptr<function, i32, read_write> = ref-to-ptr %4
     %6:void = call %1, %5
@@ -313,8 +313,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, i32, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):i32 {
+  $B1: {
     %l:ptr<function, i32, read_write> = let %2
     %4:i32 = load %l
     ret %4
@@ -324,8 +324,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, i32, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):i32 {
+  $B1: {
     %l:ptr<function, i32, read_write> = let %2
     %4:ref<function, i32, read_write> = ptr-to-ref %l
     %5:i32 = load %4
@@ -350,8 +350,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, i32, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):void {
+  $B1: {
     %l:ptr<function, i32, read_write> = let %2
     store %l, 42i
     ret
@@ -361,8 +361,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, i32, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, i32, read_write>):void {
+  $B1: {
     %l:ptr<function, i32, read_write> = let %2
     %4:ref<function, i32, read_write> = ptr-to-ref %l
     store %4, 42i
@@ -386,8 +386,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 {
+  $B1: {
     %3:ptr<function, i32, read_write> = access %2, 2i
     %4:i32 = load %3
     ret %4
@@ -397,8 +397,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 {
+  $B1: {
     %3:ref<function, array<i32, 4>, read_write> = ptr-to-ref %2
     %4:ref<function, i32, read_write> = access %3, 2i
     %5:i32 = load %4
@@ -423,8 +423,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void {
+  $B1: {
     %3:ptr<function, i32, read_write> = access %2, 2i
     store %3, 42i
     ret
@@ -434,8 +434,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void {
+  $B1: {
     %3:ref<function, array<i32, 4>, read_write> = ptr-to-ref %2
     %4:ref<function, i32, read_write> = access %3, 2i
     store %4, 42i
@@ -460,8 +460,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 {
+  $B1: {
     %3:ptr<function, i32, read_write> = access %2, 2i
     %l:ptr<function, i32, read_write> = let %3
     %5:i32 = load %l
@@ -472,8 +472,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):i32 {
+  $B1: {
     %3:ref<function, array<i32, 4>, read_write> = ptr-to-ref %2
     %4:ref<function, i32, read_write> = access %3, 2i
     %5:ptr<function, i32, read_write> = ref-to-ptr %4
@@ -502,8 +502,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void {
+  $B1: {
     %3:ptr<function, i32, read_write> = access %2, 2i
     %l:ptr<function, i32, read_write> = let %3
     store %l, 42i
@@ -514,8 +514,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, array<i32, 4>, read_write>):void {
+  $B1: {
     %3:ref<function, array<i32, 4>, read_write> = ptr-to-ref %2
     %4:ref<function, i32, read_write> = access %3, 2i
     %5:ptr<function, i32, read_write> = ref-to-ptr %4
@@ -539,8 +539,8 @@
     b.Append(fn->Block(), [&] { b.Return(fn, b.LoadVectorElement(param, 2_i)); });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, vec3<i32>, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, vec3<i32>, read_write>):i32 {
+  $B1: {
     %3:i32 = load_vector_element %2, 2i
     ret %3
   }
@@ -549,8 +549,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, vec3<i32>, read_write>):i32 -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, vec3<i32>, read_write>):i32 {
+  $B1: {
     %3:ref<function, vec3<i32>, read_write> = ptr-to-ref %2
     %4:i32 = load_vector_element %3, 2i
     ret %4
@@ -573,8 +573,8 @@
     });
 
     auto* src = R"(
-%1 = func(%2:ptr<function, vec3<i32>, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, vec3<i32>, read_write>):void {
+  $B1: {
     store_vector_element %2, 2i, 42i
     ret
   }
@@ -583,8 +583,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%1 = func(%2:ptr<function, vec3<i32>, read_write>):void -> %b1 {
-  %b1 = block {
+%1 = func(%2:ptr<function, vec3<i32>, read_write>):void {
+  $B1: {
     %3:ref<function, vec3<i32>, read_write> = ptr-to-ref %2
     store_vector_element %3, 2i, 42i
     ret
diff --git a/src/tint/lang/wgsl/writer/raise/raise_test.cc b/src/tint/lang/wgsl/writer/raise/raise_test.cc
index 0e5cae6..645361c 100644
--- a/src/tint/lang/wgsl/writer/raise/raise_test.cc
+++ b/src/tint/lang/wgsl/writer/raise/raise_test.cc
@@ -51,8 +51,8 @@
     });
 
     auto* src = R"(
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %2:i32 = max 1i, 2i
     ret
   }
@@ -61,8 +61,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():void -> %b1 {
-  %b1 = block {
+%f = func():void {
+  $B1: {
     %2:i32 = wgsl.max 1i, 2i
     %3:i32 = let %2
     ret
@@ -87,12 +87,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:void = workgroupBarrier
     %4:i32 = load %W
     %5:void = workgroupBarrier
@@ -103,12 +103,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ref<workgroup, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<workgroup, i32, read_write> = ref-to-ptr %W
     %4:i32 = wgsl.workgroupUniformLoad %3
     ret %4
@@ -134,12 +134,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ptr<workgroup, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:void = workgroupBarrier
     store %W, 42i
     %4:i32 = load %W
@@ -151,12 +151,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %W:ref<workgroup, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:void = wgsl.workgroupBarrier
     store %W, 42i
     %4:i32 = load %W
diff --git a/src/tint/lang/wgsl/writer/raise/rename_conflicts_test.cc b/src/tint/lang/wgsl/writer/raise/rename_conflicts_test.cc
index b2823db..1c805b1 100644
--- a/src/tint/lang/wgsl/writer/raise/rename_conflicts_test.cc
+++ b/src/tint/lang/wgsl/writer/raise/rename_conflicts_test.cc
@@ -83,7 +83,7 @@
     b.Append(mod.root_block, [&] { b.ir.SetName(b.Var(ty.ptr<private_, i32>()), "v"); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
 }
 
@@ -104,7 +104,7 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
   %v_1:ptr<private, u32, read_write> = var  # %v_1: 'v'
 }
@@ -113,7 +113,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
   %v_1:ptr<private, u32, read_write> = var
 }
@@ -134,7 +134,7 @@
   x:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<function, v, read_write> = var
 }
 
@@ -146,7 +146,7 @@
   x:i32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %v_1:ptr<function, v, read_write> = var
 }
 
@@ -164,12 +164,12 @@
     b.Append(fn->Block(), [&] { b.Return(fn); });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
 }
 
-%v_1 = func():void -> %b2 {  # %v_1: 'v'
-  %b2 = block {
+%v_1 = func():void {  # %v_1: 'v'
+  $B2: {
     ret
   }
 }
@@ -177,12 +177,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
 }
 
-%v_1 = func():void -> %b2 {
-  %b2 = block {
+%v_1 = func():void {
+  $B2: {
     ret
   }
 }
@@ -211,12 +211,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:i32 = load %v
     %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
     %5:i32 = load %v_1
@@ -251,12 +251,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
     %4:i32 = load %v
     %5:i32 = load %v_1
@@ -268,12 +268,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %v:ptr<private, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %v_1:ptr<function, i32, read_write> = var
     %4:i32 = load %v
     %5:i32 = load %v_1
@@ -309,11 +309,11 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         %3:i32 = load %v
         %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
         %5:i32 = load %v_1
@@ -354,11 +354,11 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
         %4:i32 = load %v
         %5:i32 = load %v_1
@@ -373,11 +373,11 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %v:ptr<function, i32, read_write> = var
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         %v_1:ptr<function, i32, read_write> = var
         %4:i32 = load %v
         %5:i32 = load %v_1
@@ -419,14 +419,14 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+%f = func():i32 {
+  $B1: {
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %v:ptr<function, i32, read_write> = var
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %3:i32 = load %v
         %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
         %5:i32 = load %v_1
@@ -470,14 +470,14 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+%f = func():i32 {
+  $B1: {
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %v:ptr<function, i32, read_write> = var
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
         %4:i32 = load %v
         %5:i32 = load %v_1
@@ -492,14 +492,14 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+%f = func():i32 {
+  $B1: {
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %v:ptr<function, i32, read_write> = var
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %v_1:ptr<function, i32, read_write> = var
         %4:i32 = load %v
         %5:i32 = load %v_1
@@ -542,17 +542,17 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
-        next_iteration %b3
+%f = func():i32 {
+  $B1: {
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %v:ptr<function, i32, read_write> = var
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %3:i32 = load %v
         %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
         %5:i32 = load %v_1
@@ -597,17 +597,17 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
-        next_iteration %b3
+%f = func():i32 {
+  $B1: {
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %v:ptr<function, i32, read_write> = var
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %v_1:ptr<function, i32, read_write> = var  # %v_1: 'v'
         %4:i32 = load %v
         %5:i32 = load %v_1
@@ -622,17 +622,17 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
-        next_iteration %b3
+%f = func():i32 {
+  $B1: {
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %v:ptr<function, i32, read_write> = var
-        continue %b4
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %v_1:ptr<function, i32, read_write> = var
         %4:i32 = load %v
         %5:i32 = load %v_1
@@ -662,8 +662,8 @@
     });
 
     auto* src = R"(
-%f = func(%i32:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%i32:i32):void {
+  $B1: {
     %3:ptr<function, i32, read_write> = var
     ret
   }
@@ -672,8 +672,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func(%i32_1:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%i32_1:i32):void {
+  $B1: {
     %3:ptr<function, i32, read_write> = var
     ret
   }
@@ -697,8 +697,8 @@
     });
 
     auto* src = R"(
-%f = func(%vec2:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%vec2:i32):void {
+  $B1: {
     %3:ptr<function, vec3<i32>, read_write> = var
     ret
   }
@@ -725,8 +725,8 @@
     });
 
     auto* src = R"(
-%f = func(%vec3:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%vec3:i32):void {
+  $B1: {
     %3:ptr<function, vec3<i32>, read_write> = var
     ret
   }
@@ -735,8 +735,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func(%vec3_1:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%vec3_1:i32):void {
+  $B1: {
     %3:ptr<function, vec3<i32>, read_write> = var
     ret
   }
@@ -760,8 +760,8 @@
     });
 
     auto* src = R"(
-%f = func(%mat3x2:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%mat3x2:i32):void {
+  $B1: {
     %3:ptr<function, mat2x4<f32>, read_write> = var
     ret
   }
@@ -788,8 +788,8 @@
     });
 
     auto* src = R"(
-%f = func(%mat2x4:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%mat2x4:i32):void {
+  $B1: {
     %3:ptr<function, mat2x4<f32>, read_write> = var
     ret
   }
@@ -798,8 +798,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func(%mat2x4_1:i32):void -> %b1 {
-  %b1 = block {
+%f = func(%mat2x4_1:i32):void {
+  $B1: {
     %3:ptr<function, mat2x4<f32>, read_write> = var
     ret
   }
@@ -821,8 +821,8 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %f32:ptr<function, i32, read_write> = var
     %3:i32 = construct
     ret %3
@@ -848,8 +848,8 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %i32:ptr<function, i32, read_write> = var
     %3:i32 = construct
     ret %3
@@ -859,8 +859,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %i32_1:ptr<function, i32, read_write> = var
     %3:i32 = construct
     ret %3
@@ -883,8 +883,8 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %i32:i32 = add 1i, 2i
     ret %i32
   }
@@ -909,8 +909,8 @@
     });
 
     auto* src = R"(
-%f = func():f32 -> %b1 {
-  %b1 = block {
+%f = func():f32 {
+  $B1: {
     %f32:i32 = add 1i, 2i
     %3:f32 = construct %f32
     ret %3
@@ -920,8 +920,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():f32 -> %b1 {
-  %b1 = block {
+%f = func():f32 {
+  $B1: {
     %f32_1:i32 = add 1i, 2i
     %3:f32 = construct %f32_1
     ret %3
@@ -940,7 +940,7 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %function:ptr<private, i32, read_write> = var
 }
 
@@ -960,7 +960,7 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %private:ptr<private, i32, read_write> = var
 }
 
@@ -968,7 +968,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %private_1:ptr<private, i32, read_write> = var
 }
 
@@ -985,7 +985,7 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %read:ptr<private, i32, read_write> = var
 }
 
@@ -1005,7 +1005,7 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %read_write:ptr<private, i32, read_write> = var
 }
 
@@ -1013,7 +1013,7 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %read_write_1:ptr<private, i32, read_write> = var
 }
 
@@ -1037,12 +1037,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %min:ptr<private, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:i32 = max 1i, 2i
     ret %3
   }
@@ -1070,12 +1070,12 @@
     });
 
     auto* src = R"(
-%b1 = block {  # root
+$B1: {  # root
   %max:ptr<private, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:i32 = max 1i, 2i
     ret %3
   }
@@ -1084,12 +1084,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%b1 = block {  # root
+$B1: {  # root
   %max_1:ptr<private, i32, read_write> = var
 }
 
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:i32 = max 1i, 2i
     ret %3
   }
@@ -1118,12 +1118,12 @@
   f:f32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, s, read_write> = var
 }
 
-%f32 = func():void -> %b2 {
-  %b2 = block {
+%f32 = func():void {
+  $B2: {
     ret
   }
 }
@@ -1135,12 +1135,12 @@
   f:f32 @offset(0)
 }
 
-%b1 = block {  # root
+$B1: {  # root
   %1:ptr<private, s, read_write> = var
 }
 
-%f32_1 = func():void -> %b2 {
-  %b2 = block {
+%f32_1 = func():void {
+  $B2: {
     ret
   }
 }
diff --git a/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc b/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
index d9ac335..4449bd8 100644
--- a/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
+++ b/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
@@ -62,8 +62,8 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
@@ -76,8 +76,8 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
@@ -110,13 +110,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = add 1i, 2i
     %5:i32 = add 3i, 4i
     %6:i32 = add %4, %5
@@ -148,13 +148,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = call %a, 1i
     %5:i32 = add 2i, 3i
     %6:i32 = add %4, %5
@@ -186,13 +186,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = add 1i, 2i
     %5:i32 = call %a, 3i
     %6:i32 = add %4, %5
@@ -224,13 +224,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = call %a, 1i
     %5:i32 = call %a, 2i
     %6:i32 = add %4, %5
@@ -262,13 +262,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = add 3i, 4i
     %5:i32 = add 1i, 2i
     %6:i32 = add %5, %4
@@ -300,13 +300,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = add 2i, 3i
     %5:i32 = call %a, 1i
     %6:i32 = add %5, %4
@@ -338,13 +338,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = call %a, 3i
     %5:i32 = add 1i, 2i
     %6:i32 = add %5, %4
@@ -376,13 +376,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = call %a, 2i
     %5:i32 = call %a, 1i
     %6:i32 = add %5, %4
@@ -394,13 +394,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func():i32 -> %b2 {
-  %b2 = block {
+%b = func():i32 {
+  $B2: {
     %4:i32 = call %a, 2i
     %5:i32 = let %4
     %6:i32 = call %a, 1i
@@ -438,18 +438,18 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 1i
     %9:i32 = call %a, 2i
     %10:i32 = call %a, 3i
@@ -488,18 +488,18 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 2i
     %9:i32 = call %a, 1i
     %10:i32 = call %a, 3i
@@ -512,18 +512,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 2i
     %9:i32 = let %8
     %10:i32 = call %a, 1i
@@ -559,18 +559,18 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 1i
     %9:i32 = call %a, 3i
     %10:i32 = call %a, 2i
@@ -583,18 +583,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 1i
     %9:i32 = let %8
     %10:i32 = call %a, 3i
@@ -631,18 +631,18 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 3i
     %9:i32 = call %a, 1i
     %10:i32 = call %a, 2i
@@ -655,18 +655,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 3i
     %9:i32 = let %8
     %10:i32 = call %a, 1i
@@ -702,18 +702,18 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 2i
     %9:i32 = call %a, 3i
     %10:i32 = call %a, 1i
@@ -726,18 +726,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 2i
     %9:i32 = let %8
     %10:i32 = call %a, 3i
@@ -774,18 +774,18 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 3i
     %9:i32 = call %a, 2i
     %10:i32 = call %a, 1i
@@ -798,18 +798,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 0i
   }
 }
-%b = func(%4:i32, %5:i32, %6:i32):i32 -> %b2 {
-  %b2 = block {
+%b = func(%4:i32, %5:i32, %6:i32):i32 {
+  $B2: {
     ret 0i
   }
 }
-%c = func():i32 -> %b3 {
-  %b3 = block {
+%c = func():i32 {
+  $B3: {
     %8:i32 = call %a, 3i
     %9:i32 = let %8
     %10:i32 = call %a, 2i
@@ -840,13 +840,13 @@
     });
 
     auto* src = R"(
-%a = func():void -> %b1 {
-  %b1 = block {
+%a = func():void {
+  $B1: {
     ret
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -859,13 +859,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func():void -> %b1 {
-  %b1 = block {
+%a = func():void {
+  $B1: {
     ret
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -895,13 +895,13 @@
     });
 
     auto* src = R"(
-%a = func():i32 -> %b1 {
-  %b1 = block {
+%a = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -914,13 +914,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func():i32 -> %b1 {
-  %b1 = block {
+%a = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -950,13 +950,13 @@
     });
 
     auto* src = R"(
-%a = func():i32 -> %b1 {
-  %b1 = block {
+%a = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -970,13 +970,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func():i32 -> %b1 {
-  %b1 = block {
+%a = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -1006,13 +1006,13 @@
     });
 
     auto* src = R"(
-%a = func():i32 -> %b1 {
-  %b1 = block {
+%a = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -1026,13 +1026,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func():i32 -> %b1 {
-  %b1 = block {
+%a = func():i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %3:ptr<function, i32, read_write> = var
     store %3, 1i
     %4:i32 = load %3
@@ -1068,13 +1068,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 1i
     %6:i32 = call %a, 2i
@@ -1089,13 +1089,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 1i
     %6:i32 = call %a, 2i
@@ -1128,13 +1128,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 2i
     %6:i32 = call %a, 1i
@@ -1149,13 +1149,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 2i
     %6:i32 = let %5
@@ -1189,13 +1189,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 3i
     %6:i32 = call %a, 1i
@@ -1210,13 +1210,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 3i
     %6:i32 = let %5
@@ -1250,13 +1250,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 3i
     %6:i32 = call %a, 2i
@@ -1271,13 +1271,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():i32 -> %b2 {
-  %b2 = block {
+%f = func():i32 {
+  $B2: {
     %4:ptr<function, array<array<array<i32, 3>, 4>, 5>, read_write> = var
     %5:i32 = call %a, 3i
     %6:i32 = let %5
@@ -1312,13 +1312,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 1i
     %6:i32 = call %a, 2i
@@ -1332,13 +1332,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 1i
     %6:i32 = call %a, 2i
@@ -1370,13 +1370,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 2i
     %6:i32 = call %a, 1i
@@ -1390,13 +1390,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 2i
     %6:i32 = let %5
@@ -1429,13 +1429,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 3i
     %6:i32 = call %a, 1i
@@ -1449,13 +1449,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 3i
     %6:i32 = let %5
@@ -1488,13 +1488,13 @@
     });
 
     auto* src = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 3i
     %6:i32 = call %a, 2i
@@ -1508,13 +1508,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%a = func(%2:i32):i32 -> %b1 {
-  %b1 = block {
+%a = func(%2:i32):i32 {
+  $B1: {
     ret 1i
   }
 }
-%f = func():f32 -> %b2 {
-  %b2 = block {
+%f = func():f32 {
+  $B2: {
     %4:array<mat3x4<f32>, 5> = construct
     %5:i32 = call %a, 3i
     %6:i32 = let %5
@@ -1545,11 +1545,11 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:i32 = add 1i, 2i
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         ret %2
       }
     }
@@ -1580,13 +1580,13 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
     %4:i32 = add %3, 2i
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         ret %4
       }
     }
@@ -1598,14 +1598,14 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
     %4:i32 = add %3, 2i
     %5:i32 = let %4
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         ret %5
       }
     }
@@ -1629,11 +1629,11 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:bool = eq 1i, 2i
-    if %2 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %2 [t: $B2] {  # if_1
+      $B2: {  # true
         ret 3i
       }
     }
@@ -1645,11 +1645,11 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:bool = eq 1i, 2i
-    if %2 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %2 [t: $B2] {  # if_1
+      $B2: {  # true
         ret 3i
       }
     }
@@ -1676,13 +1676,13 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
     %4:bool = eq %3, 2i
-    if %4 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %4 [t: $B2] {  # if_1
+      $B2: {  # true
         ret 3i
       }
     }
@@ -1694,13 +1694,13 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
     %4:bool = eq %3, 2i
-    if %4 [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if %4 [t: $B2] {  # if_1
+      $B2: {  # true
         ret 3i
       }
     }
@@ -1729,13 +1729,13 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         store %2, 2i
         exit_if  # if_1
       }
@@ -1748,14 +1748,14 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
     %4:i32 = let %3
-    if true [t: %b2] {  # if_1
-      %b2 = block {  # true
+    if true [t: $B2] {  # if_1
+      $B2: {  # true
         store %2, 2i
         exit_if  # if_1
       }
@@ -1784,11 +1784,11 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:i32 = add 1i, 2i
-    switch 3i [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch 3i [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret %2
       }
     }
@@ -1820,13 +1820,13 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
     %4:i32 = add %3, 2i
-    switch 3i [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch 3i [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret %4
       }
     }
@@ -1838,14 +1838,14 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
     %4:i32 = add %3, 2i
     %5:i32 = let %4
-    switch 3i [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch 3i [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret %5
       }
     }
@@ -1870,11 +1870,11 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:i32 = add 1i, 2i
-    switch %2 [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch %2 [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret 3i
       }
     }
@@ -1886,11 +1886,11 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:i32 = add 1i, 2i
-    switch %2 [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch %2 [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret 3i
       }
     }
@@ -1917,12 +1917,12 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
-    switch %3 [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch %3 [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret 3i
       }
     }
@@ -1934,12 +1934,12 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var, 1i
     %3:i32 = load %2
-    switch %3 [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch %3 [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         ret 3i
       }
     }
@@ -1969,13 +1969,13 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
-    switch 1i [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch 1i [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         store %2, 2i
         exit_switch  # switch_1
       }
@@ -1988,14 +1988,14 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
     %4:i32 = let %3
-    switch 1i [c: (default, %b2)] {  # switch_1
-      %b2 = block {  # case
+    switch 1i [c: (default, $B2)] {  # switch_1
+      $B2: {  # case
         store %2, 2i
         exit_switch  # switch_1
       }
@@ -2028,16 +2028,16 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = add 1i, 2i
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         store %2, %3
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         exit_loop  # loop_1
       }
     }
@@ -2071,17 +2071,17 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = load %2
     %4:i32 = add %3, 2i
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         store %2, %4
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         exit_loop  # loop_1
       }
     }
@@ -2093,18 +2093,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = load %2
     %4:i32 = add %3, 2i
     %5:i32 = let %4
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         store %2, %5
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         exit_loop  # loop_1
       }
     }
@@ -2134,17 +2134,17 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         store %2, 2i
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         exit_loop  # loop_1
       }
     }
@@ -2156,18 +2156,18 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
     %4:i32 = let %3
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         store %2, 2i
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         exit_loop  # loop_1
       }
     }
@@ -2191,11 +2191,11 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:i32 = add 1i, 2i
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         ret %2
       }
     }
@@ -2225,13 +2225,13 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = load %2
     %4:i32 = add %3, 2i
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         ret %4
       }
     }
@@ -2243,14 +2243,14 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = load %2
     %4:i32 = add %3, 2i
     %5:i32 = let %4
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         ret %5
       }
     }
@@ -2279,13 +2279,13 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         store %2, 2i
         exit_loop  # loop_1
       }
@@ -2298,14 +2298,14 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
     %4:i32 = let %3
-    loop [b: %b2] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2] {  # loop_1
+      $B2: {  # body
         store %2, 2i
         exit_loop  # loop_1
       }
@@ -2331,16 +2331,16 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:i32 = add 1i, 2i
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         %3:bool = eq %2, 3i
-        break_if %3 %b2
+        break_if %3  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret 0i
@@ -2370,18 +2370,18 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = load %2
     %4:i32 = add %3, 2i
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         %5:bool = eq %4, 3i
-        break_if %5 %b2
+        break_if %5  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret 0i
@@ -2394,19 +2394,19 @@
     Run(ValueToLet);
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     %3:i32 = load %2
     %4:i32 = add %3, 2i
     %5:i32 = let %4
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         %6:bool = eq %5, 3i
-        break_if %6 %b2
+        break_if %6  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret 0i
@@ -2433,18 +2433,18 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         store %2, 2i
-        break_if true %b2
+        break_if true  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret %3
@@ -2455,19 +2455,19 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
     %3:i32 = load %2
     %4:i32 = let %3
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
-        continue %b3
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         store %2, 2i
-        break_if true %b2
+        break_if true  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret %4
@@ -2498,16 +2498,16 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %3:i32 = load %2
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %4:i32 = add %3, 1i
         store %2, %4
         exit_loop  # loop_1
@@ -2521,17 +2521,17 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
-    loop [i: %b2, b: %b3] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3] {  # loop_1
+      $B2: {  # initializer
         %3:i32 = load %2
         %4:i32 = let %3
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
+      $B3: {  # body
         %5:i32 = add %4, 1i
         store %2, %5
         exit_loop  # loop_1
@@ -2566,22 +2566,22 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
         %3:i32 = load %2
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
-        continue %b4
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %4:i32 = add %3, 1i
         store %2, %4
-        break_if true %b3
+        break_if true  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret 3i
@@ -2592,23 +2592,23 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
-    loop [i: %b2, b: %b3, c: %b4] {  # loop_1
-      %b2 = block {  # initializer
+    loop [i: $B2, b: $B3, c: $B4] {  # loop_1
+      $B2: {  # initializer
         %3:i32 = load %2
         %4:i32 = let %3
-        next_iteration %b3
+        next_iteration  # -> $B3
       }
-      %b3 = block {  # body
-        continue %b4
+      $B3: {  # body
+        continue  # -> $B4
       }
-      %b4 = block {  # continuing
+      $B4: {  # continuing
         %5:i32 = add %4, 1i
         store %2, %5
-        break_if true %b3
+        break_if true  # -> [t: exit_loop loop_1, f: $B3]
       }
     }
     ret 3i
@@ -2640,19 +2640,19 @@
     });
 
     auto* src = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %2
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         %4:i32 = add %3, 1i
         store %2, %4
-        break_if true %b2
+        break_if true  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret 3i
@@ -2663,20 +2663,20 @@
     EXPECT_EQ(src, str());
 
     auto* expect = R"(
-%f = func():i32 -> %b1 {
-  %b1 = block {
+%f = func():i32 {
+  $B1: {
     %2:ptr<function, i32, read_write> = var
     store %2, 1i
-    loop [b: %b2, c: %b3] {  # loop_1
-      %b2 = block {  # body
+    loop [b: $B2, c: $B3] {  # loop_1
+      $B2: {  # body
         %3:i32 = load %2
         %4:i32 = let %3
-        continue %b3
+        continue  # -> $B3
       }
-      %b3 = block {  # continuing
+      $B3: {  # continuing
         %5:i32 = add %4, 1i
         store %2, %5
-        break_if true %b2
+        break_if true  # -> [t: exit_loop loop_1, f: $B2]
       }
     }
     ret 3i
diff --git a/src/tint/utils/macros/foreach.h b/src/tint/utils/macros/foreach.h
index 9ec27cc..f234a38 100644
--- a/src/tint/utils/macros/foreach.h
+++ b/src/tint/utils/macros/foreach.h
@@ -39,13 +39,15 @@
 /// TINT_COUNT_ARGUMENTS_NTH_ARG is used by TINT_COUNT_ARGUMENTS to get the number of arguments in a
 /// variadic macro call.
 #define TINT_COUNT_ARGUMENTS_NTH_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, \
-                                     _15, _16, N, ...)                                            \
+                                     _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26,  \
+                                     _27, _28, _29, _30, _31, _32, N, ...)                        \
     N
 
 /// TINT_COUNT_ARGUMENTS evaluates to the number of arguments passed to the macro
-#define TINT_COUNT_ARGUMENTS(...)                                                                 \
-    TINT_MSVC_EXPAND_BUG(TINT_COUNT_ARGUMENTS_NTH_ARG(__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, \
-                                                      8, 7, 6, 5, 4, 3, 2, 1, 0))
+#define TINT_COUNT_ARGUMENTS(...)                                                                \
+    TINT_MSVC_EXPAND_BUG(TINT_COUNT_ARGUMENTS_NTH_ARG(                                           \
+        __VA_ARGS__, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, \
+        13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
 
 // Correctness checks.
 static_assert(1 == TINT_COUNT_ARGUMENTS(a), "TINT_COUNT_ARGUMENTS broken");
@@ -100,5 +102,88 @@
 #define TINT_FOREACH_15(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
     TINT_FOREACH_14(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14)          \
     CB(_15)
+#define TINT_FOREACH_16(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+    TINT_FOREACH_15(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15)          \
+    CB(_16)
+#define TINT_FOREACH_17(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17)                                                                       \
+    TINT_FOREACH_16(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16)     \
+    CB(_17)
+#define TINT_FOREACH_18(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18)                                                                  \
+    TINT_FOREACH_17(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17)                                                                           \
+    CB(_18)
+#define TINT_FOREACH_19(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19)                                                             \
+    TINT_FOREACH_18(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18)                                                                      \
+    CB(_19)
+#define TINT_FOREACH_20(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20)                                                        \
+    TINT_FOREACH_19(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19)                                                                 \
+    CB(_20)
+#define TINT_FOREACH_21(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21)                                                   \
+    TINT_FOREACH_20(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20)                                                            \
+    CB(_21)
+#define TINT_FOREACH_22(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22)                                              \
+    TINT_FOREACH_21(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21)                                                       \
+    CB(_22)
+#define TINT_FOREACH_23(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23)                                         \
+    TINT_FOREACH_22(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22)                                                  \
+    CB(_23)
+#define TINT_FOREACH_24(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24)                                    \
+    TINT_FOREACH_23(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23)                                             \
+    CB(_24)
+#define TINT_FOREACH_25(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25)                               \
+    TINT_FOREACH_24(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24)                                        \
+    CB(_25)
+#define TINT_FOREACH_26(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25, _26)                          \
+    TINT_FOREACH_25(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24, _25)                                   \
+    CB(_26)
+#define TINT_FOREACH_27(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27)                     \
+    TINT_FOREACH_26(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24, _25, _26)                              \
+    CB(_27)
+#define TINT_FOREACH_28(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28)                \
+    TINT_FOREACH_27(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27)                         \
+    CB(_28)
+#define TINT_FOREACH_29(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29)           \
+    TINT_FOREACH_28(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28)                    \
+    CB(_29)
+#define TINT_FOREACH_30(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30)      \
+    TINT_FOREACH_29(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29)               \
+    CB(_30)
+#define TINT_FOREACH_31(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+    TINT_FOREACH_30(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30)          \
+    CB(_31)
+#define TINT_FOREACH_32(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
+                        _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \
+                        _32)                                                                       \
+    TINT_FOREACH_31(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
+                    _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31)     \
+    CB(_32)
 
 #endif  // SRC_TINT_UTILS_MACROS_FOREACH_H_