Model the return slot as an output parameter (#4432)

Also fix `Param` insts to have meaningful names in pretty-printing, to
help clarify relationship with return slot.
This commit is contained in:
Geoff Romer
2024-10-23 16:53:34 +00:00
committed by GitHub
parent 5038218cea
commit 9266f867f9
463 changed files with 7401 additions and 4939 deletions
+9 -6
View File
@@ -39,7 +39,7 @@ var arr: [i32; Add(1, 2)];
// CHECK:STDOUT: import Core//prelude/operators/comparison
// CHECK:STDOUT: import Core//prelude/types/bool
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+9, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+15, loaded [template = constants.%Int32]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -54,6 +54,8 @@ var arr: [i32; Add(1, 2)];
// CHECK:STDOUT: %a.param_patt: i32 = param_pattern %a.patt, runtime_param0
// CHECK:STDOUT: %b.patt: i32 = binding_pattern b
// CHECK:STDOUT: %b.param_patt: i32 = param_pattern %b.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc11_11: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc11_11.1: type = value_of_initializer %int.make_type_32.loc11_11 [template = i32]
@@ -64,11 +66,12 @@ var arr: [i32; Add(1, 2)];
// CHECK:STDOUT: %int.make_type_32.loc11_27: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc11_27.1: type = value_of_initializer %int.make_type_32.loc11_27 [template = i32]
// CHECK:STDOUT: %.loc11_27.2: type = converted %int.make_type_32.loc11_27, %.loc11_27.1 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc11_9: i32 = param runtime_param0
// CHECK:STDOUT: %a: i32 = bind_name a, %param.loc11_9
// CHECK:STDOUT: %param.loc11_17: i32 = param runtime_param1
// CHECK:STDOUT: %b: i32 = bind_name b, %param.loc11_17
// CHECK:STDOUT: %a.param: i32 = param runtime_param0
// CHECK:STDOUT: %a: i32 = bind_name a, %a.param
// CHECK:STDOUT: %b.param: i32 = param runtime_param1
// CHECK:STDOUT: %b: i32 = bind_name b, %b.param
// CHECK:STDOUT: %return.param: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %int.make_type_32: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %Add.ref: %Add.type = name_ref Add, %Add.decl [template = constants.%Add]
@@ -32,7 +32,7 @@ fn Add(a: i32, b: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: import Core//prelude/operators/comparison
// CHECK:STDOUT: import Core//prelude/types/bool
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+9, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+15, loaded [template = constants.%Int32]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -46,6 +46,8 @@ fn Add(a: i32, b: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %a.param_patt: i32 = param_pattern %a.patt, runtime_param0
// CHECK:STDOUT: %b.patt: i32 = binding_pattern b
// CHECK:STDOUT: %b.param_patt: i32 = param_pattern %b.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc11_11: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc11_11.1: type = value_of_initializer %int.make_type_32.loc11_11 [template = i32]
@@ -56,11 +58,12 @@ fn Add(a: i32, b: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %int.make_type_32.loc11_27: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc11_27.1: type = value_of_initializer %int.make_type_32.loc11_27 [template = i32]
// CHECK:STDOUT: %.loc11_27.2: type = converted %int.make_type_32.loc11_27, %.loc11_27.1 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc11_9: i32 = param runtime_param0
// CHECK:STDOUT: %a: i32 = bind_name a, %param.loc11_9
// CHECK:STDOUT: %param.loc11_17: i32 = param runtime_param1
// CHECK:STDOUT: %b: i32 = bind_name b, %param.loc11_17
// CHECK:STDOUT: %a.param: i32 = param runtime_param0
// CHECK:STDOUT: %a: i32 = bind_name a, %a.param
// CHECK:STDOUT: %b.param: i32 = param runtime_param1
// CHECK:STDOUT: %b: i32 = bind_name b, %b.param
// CHECK:STDOUT: %return.param: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -63,7 +63,7 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: import Core//prelude/operators/comparison
// CHECK:STDOUT: import Core//prelude/types/bool
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+9, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+15, loaded [template = constants.%Int32]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -79,6 +79,8 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %n.param_patt: i32 = param_pattern %n.patt, runtime_param0
// CHECK:STDOUT: %m.patt: i32 = binding_pattern m
// CHECK:STDOUT: %m.param_patt: i32 = param_pattern %m.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc11_9: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc11_9.1: type = value_of_initializer %int.make_type_32.loc11_9 [template = i32]
@@ -89,17 +91,20 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %int.make_type_32.loc11_25: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc11_25.1: type = value_of_initializer %int.make_type_32.loc11_25 [template = i32]
// CHECK:STDOUT: %.loc11_25.2: type = converted %int.make_type_32.loc11_25, %.loc11_25.1 [template = i32]
// CHECK:STDOUT: %return.var.loc11: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc11_7: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc11: i32 = bind_name n, %param.loc11_7
// CHECK:STDOUT: %param.loc11_15: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc11: i32 = bind_name m, %param.loc11_15
// CHECK:STDOUT: %n.param.loc11: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc11: i32 = bind_name n, %n.param.loc11
// CHECK:STDOUT: %m.param.loc11: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc11: i32 = bind_name m, %m.param.loc11
// CHECK:STDOUT: %return.param.loc11: i32 = param runtime_param2
// CHECK:STDOUT: %.loc11_22: ref i32 = return_slot %return.param.loc11
// CHECK:STDOUT: }
// CHECK:STDOUT: %A.decl.loc19: %A.type = fn_decl @A [template = constants.%A] {
// CHECK:STDOUT: %n.patt: i32 = binding_pattern n
// CHECK:STDOUT: %n.param_patt: i32 = param_pattern %n.patt, runtime_param0
// CHECK:STDOUT: %m.patt: i32 = binding_pattern m
// CHECK:STDOUT: %m.param_patt: i32 = param_pattern %m.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc19_9: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc19_9.1: type = value_of_initializer %int.make_type_32.loc19_9 [template = i32]
@@ -110,17 +115,20 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %int.make_type_32.loc19_25: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc19_25.1: type = value_of_initializer %int.make_type_32.loc19_25 [template = i32]
// CHECK:STDOUT: %.loc19_25.2: type = converted %int.make_type_32.loc19_25, %.loc19_25.1 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc19_7: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc19: i32 = bind_name n, %param.loc19_7
// CHECK:STDOUT: %param.loc19_15: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc19: i32 = bind_name m, %param.loc19_15
// CHECK:STDOUT: %n.param.loc19: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc19: i32 = bind_name n, %n.param.loc19
// CHECK:STDOUT: %m.param.loc19: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc19: i32 = bind_name m, %m.param.loc19
// CHECK:STDOUT: %return.param.loc19: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param.loc19
// CHECK:STDOUT: }
// CHECK:STDOUT: %B.decl.loc21: %B.type = fn_decl @B [template = constants.%B] {
// CHECK:STDOUT: %n.patt: i32 = binding_pattern n
// CHECK:STDOUT: %n.param_patt: i32 = param_pattern %n.patt, runtime_param0
// CHECK:STDOUT: %m.patt: i32 = binding_pattern m
// CHECK:STDOUT: %m.param_patt: i32 = param_pattern %m.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc21_9: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc21_9.1: type = value_of_initializer %int.make_type_32.loc21_9 [template = i32]
@@ -131,17 +139,20 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %int.make_type_32.loc21_25: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc21_25.1: type = value_of_initializer %int.make_type_32.loc21_25 [template = i32]
// CHECK:STDOUT: %.loc21_25.2: type = converted %int.make_type_32.loc21_25, %.loc21_25.1 [template = i32]
// CHECK:STDOUT: %return.var.loc21: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc21_7: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc21: i32 = bind_name n, %param.loc21_7
// CHECK:STDOUT: %param.loc21_15: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc21: i32 = bind_name m, %param.loc21_15
// CHECK:STDOUT: %n.param.loc21: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc21: i32 = bind_name n, %n.param.loc21
// CHECK:STDOUT: %m.param.loc21: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc21: i32 = bind_name m, %m.param.loc21
// CHECK:STDOUT: %return.param.loc21: i32 = param runtime_param2
// CHECK:STDOUT: %.loc21_22: ref i32 = return_slot %return.param.loc21
// CHECK:STDOUT: }
// CHECK:STDOUT: %B.decl.loc29: %B.type = fn_decl @B [template = constants.%B] {
// CHECK:STDOUT: %n.patt: i32 = binding_pattern n
// CHECK:STDOUT: %n.param_patt: i32 = param_pattern %n.patt, runtime_param0
// CHECK:STDOUT: %m.patt: i32 = binding_pattern m
// CHECK:STDOUT: %m.param_patt: i32 = param_pattern %m.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc29_9: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc29_9.1: type = value_of_initializer %int.make_type_32.loc29_9 [template = i32]
@@ -152,17 +163,20 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %int.make_type_32.loc29_25: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc29_25.1: type = value_of_initializer %int.make_type_32.loc29_25 [template = i32]
// CHECK:STDOUT: %.loc29_25.2: type = converted %int.make_type_32.loc29_25, %.loc29_25.1 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc29_7: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc29: i32 = bind_name n, %param.loc29_7
// CHECK:STDOUT: %param.loc29_15: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc29: i32 = bind_name m, %param.loc29_15
// CHECK:STDOUT: %n.param.loc29: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc29: i32 = bind_name n, %n.param.loc29
// CHECK:STDOUT: %m.param.loc29: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc29: i32 = bind_name m, %m.param.loc29
// CHECK:STDOUT: %return.param.loc29: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param.loc29
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl.loc31: %C.type = fn_decl @C [template = constants.%C] {
// CHECK:STDOUT: %n.patt: i32 = binding_pattern n
// CHECK:STDOUT: %n.param_patt: i32 = param_pattern %n.patt, runtime_param0
// CHECK:STDOUT: %m.patt: i32 = binding_pattern m
// CHECK:STDOUT: %m.param_patt: i32 = param_pattern %m.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc31_9: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc31_9.1: type = value_of_initializer %int.make_type_32.loc31_9 [template = i32]
@@ -173,17 +187,20 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %int.make_type_32.loc31_25: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc31_25.1: type = value_of_initializer %int.make_type_32.loc31_25 [template = i32]
// CHECK:STDOUT: %.loc31_25.2: type = converted %int.make_type_32.loc31_25, %.loc31_25.1 [template = i32]
// CHECK:STDOUT: %return.var.loc31: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc31_7: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc31: i32 = bind_name n, %param.loc31_7
// CHECK:STDOUT: %param.loc31_15: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc31: i32 = bind_name m, %param.loc31_15
// CHECK:STDOUT: %n.param.loc31: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc31: i32 = bind_name n, %n.param.loc31
// CHECK:STDOUT: %m.param.loc31: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc31: i32 = bind_name m, %m.param.loc31
// CHECK:STDOUT: %return.param.loc31: i32 = param runtime_param2
// CHECK:STDOUT: %.loc31_22: ref i32 = return_slot %return.param.loc31
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl.loc38: %C.type = fn_decl @C [template = constants.%C] {
// CHECK:STDOUT: %n.patt: i32 = binding_pattern n
// CHECK:STDOUT: %n.param_patt: i32 = param_pattern %n.patt, runtime_param0
// CHECK:STDOUT: %m.patt: i32 = binding_pattern m
// CHECK:STDOUT: %m.param_patt: i32 = param_pattern %m.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc38_9: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc38_9.1: type = value_of_initializer %int.make_type_32.loc38_9 [template = i32]
@@ -194,11 +211,12 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd";
// CHECK:STDOUT: %int.make_type_32.loc38_25: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc38_25.1: type = value_of_initializer %int.make_type_32.loc38_25 [template = i32]
// CHECK:STDOUT: %.loc38_25.2: type = converted %int.make_type_32.loc38_25, %.loc38_25.1 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc38_7: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc38: i32 = bind_name n, %param.loc38_7
// CHECK:STDOUT: %param.loc38_15: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc38: i32 = bind_name m, %param.loc38_15
// CHECK:STDOUT: %n.param.loc38: i32 = param runtime_param0
// CHECK:STDOUT: %n.loc38: i32 = bind_name n, %n.param.loc38
// CHECK:STDOUT: %m.param.loc38: i32 = param runtime_param1
// CHECK:STDOUT: %m.loc38: i32 = bind_name m, %m.param.loc38
// CHECK:STDOUT: %return.param.loc38: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param.loc38
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
+17 -11
View File
@@ -53,7 +53,7 @@ var arr: [i32; 1.(I.F)(2)];
// CHECK:STDOUT: import Core//prelude/operators/comparison
// CHECK:STDOUT: import Core//prelude/types/bool
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+9, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref: %Int32.type = import_ref Core//prelude/types, inst+15, loaded [template = constants.%Int32]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -92,6 +92,8 @@ var arr: [i32; 1.(I.F)(2)];
// CHECK:STDOUT: %self.param_patt: @F.1.%Self (%Self) = param_pattern %self.patt, runtime_param0
// CHECK:STDOUT: %other.patt: @F.1.%Self (%Self) = binding_pattern other
// CHECK:STDOUT: %other.param_patt: @F.1.%Self (%Self) = param_pattern %other.patt, runtime_param1
// CHECK:STDOUT: %return.patt: @F.1.%Self (%Self) = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: @F.1.%Self (%Self) = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %Self.ref.loc12_14: %I.type = name_ref Self, @I.%Self [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %.loc12_14.1: type = facet_type_access %Self.ref.loc12_14 [symbolic = %Self (constants.%Self)]
@@ -102,11 +104,12 @@ var arr: [i32; 1.(I.F)(2)];
// CHECK:STDOUT: %Self.ref.loc12_36: %I.type = name_ref Self, @I.%Self [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %.loc12_36.1: type = facet_type_access %Self.ref.loc12_36 [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %.loc12_36.2: type = converted %Self.ref.loc12_36, %.loc12_36.1 [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %return: ref @F.1.%Self (%Self) = var <return slot>
// CHECK:STDOUT: %param.loc12_12: @F.1.%Self (%Self) = param runtime_param0
// CHECK:STDOUT: %self: @F.1.%Self (%Self) = bind_name self, %param.loc12_12
// CHECK:STDOUT: %param.loc12_25: @F.1.%Self (%Self) = param runtime_param1
// CHECK:STDOUT: %other: @F.1.%Self (%Self) = bind_name other, %param.loc12_25
// CHECK:STDOUT: %self.param: @F.1.%Self (%Self) = param runtime_param0
// CHECK:STDOUT: %self: @F.1.%Self (%Self) = bind_name self, %self.param
// CHECK:STDOUT: %other.param: @F.1.%Self (%Self) = param runtime_param1
// CHECK:STDOUT: %other: @F.1.%Self (%Self) = bind_name other, %other.param
// CHECK:STDOUT: %return.param: @F.1.%Self (%Self) = param runtime_param2
// CHECK:STDOUT: %return: ref @F.1.%Self (%Self) = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc12: %.2 = assoc_entity element0, %F.decl [template = constants.%.3]
// CHECK:STDOUT:
@@ -122,6 +125,8 @@ var arr: [i32; 1.(I.F)(2)];
// CHECK:STDOUT: %self.param_patt: i32 = param_pattern %self.patt, runtime_param0
// CHECK:STDOUT: %other.patt: i32 = binding_pattern other
// CHECK:STDOUT: %other.param_patt: i32 = param_pattern %other.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc16_14: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc16_14.1: type = value_of_initializer %int.make_type_32.loc16_14 [template = i32]
@@ -132,11 +137,12 @@ var arr: [i32; 1.(I.F)(2)];
// CHECK:STDOUT: %int.make_type_32.loc16_34: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc16_34.1: type = value_of_initializer %int.make_type_32.loc16_34 [template = i32]
// CHECK:STDOUT: %.loc16_34.2: type = converted %int.make_type_32.loc16_34, %.loc16_34.1 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc16_12: i32 = param runtime_param0
// CHECK:STDOUT: %self: i32 = bind_name self, %param.loc16_12
// CHECK:STDOUT: %param.loc16_24: i32 = param runtime_param1
// CHECK:STDOUT: %other: i32 = bind_name other, %param.loc16_24
// CHECK:STDOUT: %self.param: i32 = param runtime_param0
// CHECK:STDOUT: %self: i32 = bind_name self, %self.param
// CHECK:STDOUT: %other.param: i32 = param runtime_param1
// CHECK:STDOUT: %other: i32 = bind_name other, %other.param
// CHECK:STDOUT: %return.param: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc15_15: <witness> = interface_witness (%F.decl) [template = constants.%.4]
// CHECK:STDOUT:
@@ -49,8 +49,12 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: .Int32 = %Int32.decl
// CHECK:STDOUT: .Add = %Add.decl
// CHECK:STDOUT: }
// CHECK:STDOUT: %Int32.decl: %Int32.type = fn_decl @Int32 [template = constants.%Int32] {} {
// CHECK:STDOUT: %return: ref type = var <return slot>
// CHECK:STDOUT: %Int32.decl: %Int32.type = fn_decl @Int32 [template = constants.%Int32] {
// CHECK:STDOUT: %return.patt: type = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: type = param_pattern %return.patt, runtime_param0
// CHECK:STDOUT: } {
// CHECK:STDOUT: %return.param: type = param runtime_param0
// CHECK:STDOUT: %return: ref type = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %Add.decl: type = interface_decl @Add [template = constants.%Add.type] {} {}
// CHECK:STDOUT: }
@@ -62,6 +66,8 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: %self.param_patt: @Op.%Self (%Self) = param_pattern %self.patt, runtime_param0
// CHECK:STDOUT: %other.patt: @Op.%Self (%Self) = binding_pattern other
// CHECK:STDOUT: %other.param_patt: @Op.%Self (%Self) = param_pattern %other.patt, runtime_param1
// CHECK:STDOUT: %return.patt: @Op.%Self (%Self) = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: @Op.%Self (%Self) = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %Self.ref.loc7_15: %Add.type = name_ref Self, @Add.%Self [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %.loc7_15.1: type = facet_type_access %Self.ref.loc7_15 [symbolic = %Self (constants.%Self)]
@@ -72,11 +78,12 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: %Self.ref.loc7_37: %Add.type = name_ref Self, @Add.%Self [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %.loc7_37.1: type = facet_type_access %Self.ref.loc7_37 [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %.loc7_37.2: type = converted %Self.ref.loc7_37, %.loc7_37.1 [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %return: ref @Op.%Self (%Self) = var <return slot>
// CHECK:STDOUT: %param.loc7_13: @Op.%Self (%Self) = param runtime_param0
// CHECK:STDOUT: %self: @Op.%Self (%Self) = bind_name self, %param.loc7_13
// CHECK:STDOUT: %param.loc7_26: @Op.%Self (%Self) = param runtime_param1
// CHECK:STDOUT: %other: @Op.%Self (%Self) = bind_name other, %param.loc7_26
// CHECK:STDOUT: %self.param: @Op.%Self (%Self) = param runtime_param0
// CHECK:STDOUT: %self: @Op.%Self (%Self) = bind_name self, %self.param
// CHECK:STDOUT: %other.param: @Op.%Self (%Self) = param runtime_param1
// CHECK:STDOUT: %other: @Op.%Self (%Self) = bind_name other, %other.param
// CHECK:STDOUT: %return.param: @Op.%Self (%Self) = param runtime_param2
// CHECK:STDOUT: %return: ref @Op.%Self (%Self) = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc7: %.2 = assoc_entity element0, %Op.decl [template = constants.%.3]
// CHECK:STDOUT:
@@ -133,12 +140,12 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: .Add = %import_ref.2
// CHECK:STDOUT: import Core//default
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref.1: %Int32.type = import_ref Core//default, inst+2, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref.2: type = import_ref Core//default, inst+6, loaded [template = constants.%Add.type]
// CHECK:STDOUT: %import_ref.3 = import_ref Core//default, inst+8, unloaded
// CHECK:STDOUT: %import_ref.4: %.5 = import_ref Core//default, inst+33, loaded [template = constants.%.6]
// CHECK:STDOUT: %import_ref.5: %Op.type.2 = import_ref Core//default, inst+28, loaded [template = constants.%Op.2]
// CHECK:STDOUT: %import_ref.6 = import_ref Core//default, inst+28, unloaded
// CHECK:STDOUT: %import_ref.1: %Int32.type = import_ref Core//default, inst+5, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref.2: type = import_ref Core//default, inst+9, loaded [template = constants.%Add.type]
// CHECK:STDOUT: %import_ref.3 = import_ref Core//default, inst+11, unloaded
// CHECK:STDOUT: %import_ref.4: %.5 = import_ref Core//default, inst+39, loaded [template = constants.%.6]
// CHECK:STDOUT: %import_ref.5: %Op.type.2 = import_ref Core//default, inst+34, loaded [template = constants.%Op.2]
// CHECK:STDOUT: %import_ref.6 = import_ref Core//default, inst+34, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -181,15 +188,18 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: %self.param_patt: i32 = param_pattern %self.patt, runtime_param0
// CHECK:STDOUT: %other.patt: i32 = binding_pattern other
// CHECK:STDOUT: %other.param_patt: i32 = param_pattern %other.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %Self.ref.loc7_15: type = name_ref Self, @impl.%.loc6_6.2 [template = i32]
// CHECK:STDOUT: %Self.ref.loc7_28: type = name_ref Self, @impl.%.loc6_6.2 [template = i32]
// CHECK:STDOUT: %Self.ref.loc7_37: type = name_ref Self, @impl.%.loc6_6.2 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc7_13: i32 = param runtime_param0
// CHECK:STDOUT: %self: i32 = bind_name self, %param.loc7_13
// CHECK:STDOUT: %param.loc7_26: i32 = param runtime_param1
// CHECK:STDOUT: %other: i32 = bind_name other, %param.loc7_26
// CHECK:STDOUT: %self.param: i32 = param runtime_param0
// CHECK:STDOUT: %self: i32 = bind_name self, %self.param
// CHECK:STDOUT: %other.param: i32 = param runtime_param1
// CHECK:STDOUT: %other: i32 = bind_name other, %other.param
// CHECK:STDOUT: %return.param: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc6_22: <witness> = interface_witness (%Op.decl) [template = constants.%.2]
// CHECK:STDOUT:
@@ -36,14 +36,20 @@ var arr: [i32; Core.TestAdd(1, 2)] = (1, 2, 3);
// CHECK:STDOUT: .Int32 = %Int32.decl
// CHECK:STDOUT: .TestAdd = %TestAdd.decl
// CHECK:STDOUT: }
// CHECK:STDOUT: %Int32.decl: %Int32.type = fn_decl @Int32 [template = constants.%Int32] {} {
// CHECK:STDOUT: %return: ref type = var <return slot>
// CHECK:STDOUT: %Int32.decl: %Int32.type = fn_decl @Int32 [template = constants.%Int32] {
// CHECK:STDOUT: %return.patt: type = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: type = param_pattern %return.patt, runtime_param0
// CHECK:STDOUT: } {
// CHECK:STDOUT: %return.param: type = param runtime_param0
// CHECK:STDOUT: %return: ref type = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %TestAdd.decl: %TestAdd.type = fn_decl @TestAdd [template = constants.%TestAdd] {
// CHECK:STDOUT: %a.patt: i32 = binding_pattern a
// CHECK:STDOUT: %a.param_patt: i32 = param_pattern %a.patt, runtime_param0
// CHECK:STDOUT: %b.patt: i32 = binding_pattern b
// CHECK:STDOUT: %b.param_patt: i32 = param_pattern %b.patt, runtime_param1
// CHECK:STDOUT: %return.patt: i32 = return_slot_pattern
// CHECK:STDOUT: %return.param_patt: i32 = param_pattern %return.patt, runtime_param2
// CHECK:STDOUT: } {
// CHECK:STDOUT: %int.make_type_32.loc5_15: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc5_15.1: type = value_of_initializer %int.make_type_32.loc5_15 [template = i32]
@@ -54,11 +60,12 @@ var arr: [i32; Core.TestAdd(1, 2)] = (1, 2, 3);
// CHECK:STDOUT: %int.make_type_32.loc5_31: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: %.loc5_31.1: type = value_of_initializer %int.make_type_32.loc5_31 [template = i32]
// CHECK:STDOUT: %.loc5_31.2: type = converted %int.make_type_32.loc5_31, %.loc5_31.1 [template = i32]
// CHECK:STDOUT: %return: ref i32 = var <return slot>
// CHECK:STDOUT: %param.loc5_13: i32 = param runtime_param0
// CHECK:STDOUT: %a: i32 = bind_name a, %param.loc5_13
// CHECK:STDOUT: %param.loc5_21: i32 = param runtime_param1
// CHECK:STDOUT: %b: i32 = bind_name b, %param.loc5_21
// CHECK:STDOUT: %a.param: i32 = param runtime_param0
// CHECK:STDOUT: %a: i32 = bind_name a, %a.param
// CHECK:STDOUT: %b.param: i32 = param runtime_param1
// CHECK:STDOUT: %b: i32 = bind_name b, %b.param
// CHECK:STDOUT: %return.param: i32 = param runtime_param2
// CHECK:STDOUT: %return: ref i32 = return_slot %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -90,8 +97,8 @@ var arr: [i32; Core.TestAdd(1, 2)] = (1, 2, 3);
// CHECK:STDOUT: .TestAdd = %import_ref.2
// CHECK:STDOUT: import Core//core
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref.1: %Int32.type = import_ref Core//core, inst+2, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref.2: %TestAdd.type = import_ref Core//core, inst+24, loaded [template = constants.%TestAdd]
// CHECK:STDOUT: %import_ref.1: %Int32.type = import_ref Core//core, inst+5, loaded [template = constants.%Int32]
// CHECK:STDOUT: %import_ref.2: %TestAdd.type = import_ref Core//core, inst+30, loaded [template = constants.%TestAdd]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {