Explorar o código

Make function definitions allocate the body more lazily. (#2557)

Lazy allocation means that we can use a single node block for _all_ empty node blocks. The change in timing for when the definition node is emitted shouldn't affect semantic correctness; the signature is already present for recursive calls.
Jon Ross-Perkins %!s(int64=3) %!d(string=hai) anos
pai
achega
94cbb9d917
Modificáronse 23 ficheiros con 78 adicións e 117 borrados
  1. 0 12
      toolchain/semantics/semantics_node_block_stack.cpp
  2. 0 4
      toolchain/semantics/semantics_node_block_stack.h
  3. 6 11
      toolchain/semantics/semantics_parse_tree_handler.cpp
  4. 1 3
      toolchain/semantics/testdata/basics/fail_name_lookup.carbon
  5. 1 3
      toolchain/semantics/testdata/function/basic.carbon
  6. 3 9
      toolchain/semantics/testdata/function/order.carbon
  7. 1 3
      toolchain/semantics/testdata/function/params_one.carbon
  8. 1 3
      toolchain/semantics/testdata/function/params_one_comma.carbon
  9. 1 3
      toolchain/semantics/testdata/function/params_two.carbon
  10. 1 3
      toolchain/semantics/testdata/function/params_two_comma.carbon
  11. 5 5
      toolchain/semantics/testdata/operators/binary_op.carbon
  12. 5 5
      toolchain/semantics/testdata/operators/fail_type_mismatch.carbon
  13. 6 6
      toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon
  14. 4 4
      toolchain/semantics/testdata/return/literal.carbon
  15. 3 3
      toolchain/semantics/testdata/return/trivial.carbon
  16. 4 4
      toolchain/semantics/testdata/var/decl.carbon
  17. 5 5
      toolchain/semantics/testdata/var/decl_with_init.carbon
  18. 7 7
      toolchain/semantics/testdata/var/fail_duplicate_decl.carbon
  19. 5 5
      toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon
  20. 5 5
      toolchain/semantics/testdata/var/fail_init_with_self.carbon
  21. 4 4
      toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon
  22. 5 5
      toolchain/semantics/testdata/var/global_lookup_in_scope.carbon
  23. 5 5
      toolchain/semantics/testdata/var/lookup.carbon

+ 0 - 12
toolchain/semantics/semantics_node_block_stack.cpp

@@ -16,18 +16,6 @@ auto SemanticsNodeBlockStack::Push() -> void {
   stack_.push_back(SemanticsNodeBlockId::Invalid);
 }
 
-auto SemanticsNodeBlockStack::PushWithUnconditionalAlloc()
-    -> SemanticsNodeBlockId {
-  SemanticsNodeBlockId block_id(node_blocks_->size());
-  CARBON_VLOG() << "NodeBlock Push " << stack_.size() << ": " << block_id
-                << "\n";
-  CARBON_CHECK(stack_.size() < (1 << 20))
-      << "Excessive stack size: likely infinite loop";
-  node_blocks_->resize(block_id.index + 1);
-  stack_.push_back(block_id);
-  return block_id;
-}
-
 auto SemanticsNodeBlockStack::PeekForAdd() -> SemanticsNodeBlockId {
   auto& back = stack_.back();
   if (!back.is_valid()) {

+ 0 - 4
toolchain/semantics/semantics_node_block_stack.h

@@ -27,10 +27,6 @@ class SemanticsNodeBlockStack {
   // order to support lazy allocation.
   auto Push() -> void;
 
-  // Pushes a new node block.
-  // TODO: Try to remove this in favor of the lazy alloc in Push.
-  auto PushWithUnconditionalAlloc() -> SemanticsNodeBlockId;
-
   // Peeks at the top node block. This does not trigger lazy allocation, so the
   // returned node block may be invalid.
   auto Peek() -> SemanticsNodeBlockId { return stack_.back(); }

+ 6 - 11
toolchain/semantics/semantics_parse_tree_handler.cpp

@@ -306,10 +306,12 @@ auto SemanticsParseTreeHandler::HandleFunctionDefinition(
          ParseNodeKind::FunctionDefinitionStart) {
     node_stack_.PopAndIgnore();
   }
-  node_stack_.PopAndIgnore();
+  auto decl_id =
+      node_stack_.PopForNodeId(ParseNodeKind::FunctionDefinitionStart);
 
   PopScope();
-  node_block_stack_.Pop();
+  auto block_id = node_block_stack_.Pop();
+  AddNode(SemanticsNode::MakeFunctionDefinition(parse_node, decl_id, block_id));
   node_stack_.Push(parse_node);
 
   return true;
@@ -332,16 +334,9 @@ auto SemanticsParseTreeHandler::HandleFunctionDefinitionStart(
   // TODO: Propagate the type of the function.
   BindName(name_node, SemanticsNodeId::MakeInvalid(), decl_id);
 
-  // TODO: Consider approaches that allow lazy creation of the definition block.
-  auto outer_block = node_block_stack_.PeekForAdd();
-  auto def_block = node_block_stack_.PushWithUnconditionalAlloc();
-  auto node =
-      SemanticsNode::MakeFunctionDefinition(parse_node, decl_id, def_block);
-  CARBON_VLOG() << "AddNode " << outer_block << ": " << node << "\n";
-  semantics_->AddNode(outer_block, node);
-
+  node_block_stack_.Push();
   PushScope();
-  node_stack_.Push(parse_node);
+  node_stack_.Push(parse_node, decl_id);
 
   return true;
 }

+ 1 - 3
toolchain/semantics/testdata/basics/fail_name_lookup.carbon

@@ -20,7 +20,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -30,8 +30,6 @@
 // CHECK:STDOUT:     node5,
 // CHECK:STDOUT:     node6,
 // CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 
 fn Main() {

+ 1 - 3
toolchain/semantics/testdata/function/basic.carbon

@@ -20,7 +20,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -30,8 +30,6 @@
 // CHECK:STDOUT:     node5,
 // CHECK:STDOUT:     node6,
 // CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 
 fn Foo() {}

+ 3 - 9
toolchain/semantics/testdata/function/order.carbon

@@ -24,13 +24,13 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block3},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node10},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node10, arg1: block4},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node10, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -46,12 +46,6 @@
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 
 fn Foo() {}

+ 1 - 3
toolchain/semantics/testdata/function/params_one.carbon

@@ -23,7 +23,7 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node6, arg1: block4},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node6, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -40,8 +40,6 @@
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 
 fn Foo(a: i32) {}

+ 1 - 3
toolchain/semantics/testdata/function/params_one_comma.carbon

@@ -23,7 +23,7 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node6, arg1: block4},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node6, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -40,8 +40,6 @@
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 
 fn Foo(a: i32,) {}

+ 1 - 3
toolchain/semantics/testdata/function/params_two.carbon

@@ -26,7 +26,7 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node8},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node8, arg1: block4},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node8, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -46,8 +46,6 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 
 fn Foo(a: i32, b: i32) {}

+ 1 - 3
toolchain/semantics/testdata/function/params_two_comma.carbon

@@ -26,7 +26,7 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node8},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node8, arg1: block4},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node8, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -46,8 +46,6 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 
 fn Foo(a: i32, b: i32,) {}

+ 5 - 5
toolchain/semantics/testdata/operators/binary_op.carbon

@@ -22,11 +22,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node7, arg1: node8, type: node2},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node9, type: node2},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node6, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -34,13 +34,13 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 5 - 5
toolchain/semantics/testdata/operators/fail_type_mismatch.carbon

@@ -21,11 +21,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: RealLiteral, type: node3},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node7, arg1: node8, type: node1},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node9, type: node1},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node6, arg1: node7, type: node1},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8, type: node1},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -33,13 +33,13 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 6 - 6
toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon

@@ -22,13 +22,13 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: RealLiteral, type: node3},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node7, arg1: node8, type: node1},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node6, arg1: node7, type: node1},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node9, arg1: node10, type: node1},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node11, type: node1},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node8, arg1: node9, type: node1},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node10, type: node1},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -36,15 +36,15 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 4 - 4
toolchain/semantics/testdata/return/literal.carbon

@@ -21,9 +21,9 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node7, type: node2},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node6, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -31,11 +31,11 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 3 - 3
toolchain/semantics/testdata/return/trivial.carbon

@@ -20,8 +20,8 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: Return},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -29,10 +29,10 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node7,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node7,
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 4 - 4
toolchain/semantics/testdata/var/decl.carbon

@@ -21,9 +21,9 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -31,11 +31,11 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 5 - 5
toolchain/semantics/testdata/var/decl_with_init.carbon

@@ -22,11 +22,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node6, arg1: node8, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -34,13 +34,13 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 7 - 7
toolchain/semantics/testdata/var/fail_duplicate_decl.carbon

@@ -23,15 +23,15 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node6, arg1: node8, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node11, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node10, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node13, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node6, arg1: node12, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -39,9 +39,10 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
@@ -49,7 +50,6 @@
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 5 - 5
toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon

@@ -21,11 +21,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
 // CHECK:STDOUT:   {kind: RealLiteral, type: node3},
-// CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node9, type: node1},
+// CHECK:STDOUT:   {kind: Assign, arg0: node6, arg1: node8, type: node1},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -33,13 +33,13 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 5 - 5
toolchain/semantics/testdata/var/fail_init_with_self.carbon

@@ -21,10 +21,10 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node1, type: node1},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node6, arg1: node1, type: node1},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -32,12 +32,12 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 4 - 4
toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon

@@ -22,9 +22,9 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: Assign, arg0: node9, arg1: node1, type: node1},
@@ -35,14 +35,14 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 5 - 5
toolchain/semantics/testdata/var/global_lookup_in_scope.carbon

@@ -27,10 +27,10 @@
 // CHECK:STDOUT:   {kind: Assign, arg0: node4, arg1: node6, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node8, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node11, arg1: node4, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node10, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node10, arg1: node4, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node8, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -42,12 +42,12 @@
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
+// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 

+ 5 - 5
toolchain/semantics/testdata/var/lookup.carbon

@@ -22,11 +22,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: block3, type: node0},
 // CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node4},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node6, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node6, arg1: node8, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node4, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -34,13 +34,13 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node4,
 // CHECK:STDOUT:     node5,
-// CHECK:STDOUT:     node6,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node6,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]