Add a separate store for computed constant values. (#3362)

This moves the instructions generated for type values out of the block
in which they happen to first be referenced, and into shared storage.
This commit is contained in:
Richard Smith
2023-11-04 23:48:13 +00:00
committed by GitHub
parent a0bacbb26b
commit 184eafd521
130 changed files with 1075 additions and 625 deletions
+5 -1
View File
@@ -12,8 +12,12 @@ fn Main() {
Echo({});
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc7_13.1: type = struct_type {}
// CHECK:STDOUT: %.loc7_13.2: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "empty_struct.carbon" {
// CHECK:STDOUT: %.loc7: type = tuple_type ()
// CHECK:STDOUT: %Echo: <function> = fn_decl @Echo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
// CHECK:STDOUT: }
@@ -12,6 +12,10 @@ fn Main() {
Echo(());
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc7: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "empty_tuple.carbon" {
// CHECK:STDOUT: %Echo: <function> = fn_decl @Echo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -11,6 +11,10 @@ fn Run() {
var x: i32 = "hello"();
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.1: type = ptr_type String
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "fail_not_callable.carbon" {
// CHECK:STDOUT: %Run: <function> = fn_decl @Run
// CHECK:STDOUT: }
@@ -19,7 +23,6 @@ fn Run() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %x.var: ref i32 = var "x"
// CHECK:STDOUT: %x: ref i32 = bind_name "x", %x.var
// CHECK:STDOUT: %.1: type = ptr_type String
// CHECK:STDOUT: %.loc11: String = string_literal "hello"
// CHECK:STDOUT: assign %x.var, <error>
// CHECK:STDOUT: return
@@ -55,6 +55,10 @@ fn Main() {
Run2(0);
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc18: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "fail_param_count.carbon" {
// CHECK:STDOUT: %Run0: <function> = fn_decl @Run0
// CHECK:STDOUT: %Run1: <function> = fn_decl @Run1
@@ -81,8 +85,7 @@ fn Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Run0.ref.loc18: <function> = name_reference "Run0", file.%Run0
// CHECK:STDOUT: %.loc18_8: i32 = int_literal 1
// CHECK:STDOUT: %.loc18_7.1: type = tuple_type ()
// CHECK:STDOUT: %.loc18_7.2: init () = call %Run0.ref.loc18(<invalid>)
// CHECK:STDOUT: %.loc18_7: init () = call %Run0.ref.loc18(<invalid>)
// CHECK:STDOUT: %Run0.ref.loc25: <function> = name_reference "Run0", file.%Run0
// CHECK:STDOUT: %.loc25_8: i32 = int_literal 0
// CHECK:STDOUT: %.loc25_11: i32 = int_literal 1
@@ -16,6 +16,10 @@ fn F() {
G(1.0);
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc16: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "fail_param_type.carbon" {
// CHECK:STDOUT: %G: <function> = fn_decl @G
// CHECK:STDOUT: %F: <function> = fn_decl @F
@@ -30,7 +34,6 @@ fn F() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %G.ref: <function> = name_reference "G", file.%G
// CHECK:STDOUT: %.loc16_5: f64 = real_literal 10e-1
// CHECK:STDOUT: %.loc16_4.1: type = tuple_type ()
// CHECK:STDOUT: %.loc16_4.2: init () = call %G.ref(<invalid>)
// CHECK:STDOUT: %.loc16_4: init () = call %G.ref(<invalid>)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -11,6 +11,10 @@ fn Main() {
Foo(1 + 2 + 3, 4 + 5, 6);
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc11: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "more_param_ir.carbon" {
// CHECK:STDOUT: %Foo: <function> = fn_decl @Foo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -33,7 +37,6 @@ fn Main() {
// CHECK:STDOUT: %.loc11_22: i32 = int_literal 5
// CHECK:STDOUT: %.loc11_20: i32 = add %.loc11_18, %.loc11_22
// CHECK:STDOUT: %.loc11_25: i32 = int_literal 6
// CHECK:STDOUT: %.loc11_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc11_6.2: init () = call %Foo.ref(%.loc11_13, %.loc11_20, %.loc11_25)
// CHECK:STDOUT: %.loc11_6: init () = call %Foo.ref(%.loc11_13, %.loc11_20, %.loc11_25)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
+5 -2
View File
@@ -10,6 +10,10 @@ fn Main() {
Foo(1);
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc10: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "params_one.carbon" {
// CHECK:STDOUT: %Foo: <function> = fn_decl @Foo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -24,7 +28,6 @@ fn Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call %Foo.ref(%.loc10_7)
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref(%.loc10_7)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -11,6 +11,10 @@ fn Main() {
Foo(1,);
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc10: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "params_one_comma.carbon" {
// CHECK:STDOUT: %Foo: <function> = fn_decl @Foo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -25,8 +29,7 @@ fn Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref.loc10: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call %Foo.ref.loc10(%.loc10_7)
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref.loc10(%.loc10_7)
// CHECK:STDOUT: %Foo.ref.loc11: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %.loc11_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc11_6: init () = call %Foo.ref.loc11(%.loc11_7)
+5 -2
View File
@@ -10,6 +10,10 @@ fn Main() {
Foo(1, 2);
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc10: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "params_two.carbon" {
// CHECK:STDOUT: %Foo: <function> = fn_decl @Foo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -25,7 +29,6 @@ fn Main() {
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call %Foo.ref(%.loc10_7, %.loc10_10)
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref(%.loc10_7, %.loc10_10)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -11,6 +11,10 @@ fn Main() {
Foo(1, 2,);
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc10: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "params_two_comma.carbon" {
// CHECK:STDOUT: %Foo: <function> = fn_decl @Foo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -26,8 +30,7 @@ fn Main() {
// CHECK:STDOUT: %Foo.ref.loc10: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call %Foo.ref.loc10(%.loc10_7, %.loc10_10)
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref.loc10(%.loc10_7, %.loc10_10)
// CHECK:STDOUT: %Foo.ref.loc11: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %.loc11_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc11_10: i32 = int_literal 2
+5 -2
View File
@@ -10,6 +10,10 @@ fn Main() {
Foo();
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc10: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "params_zero.carbon" {
// CHECK:STDOUT: %Foo: <function> = fn_decl @Foo
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -23,7 +27,6 @@ fn Main() {
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call %Foo.ref()
// CHECK:STDOUT: %.loc10: init () = call %Foo.ref()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -11,6 +11,10 @@ fn Main() {
var b: () = MakeImplicitEmptyTuple();
}
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.loc11: type = tuple_type ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file "return_implicit.carbon" {
// CHECK:STDOUT: %MakeImplicitEmptyTuple: <function> = fn_decl @MakeImplicitEmptyTuple
// CHECK:STDOUT: %Main: <function> = fn_decl @Main
@@ -23,8 +27,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc11_11.1: type = tuple_type ()
// CHECK:STDOUT: %.loc11_11.2: () = tuple_literal ()
// CHECK:STDOUT: %.loc11_11: () = tuple_literal ()
// CHECK:STDOUT: %b.var: ref () = var "b"
// CHECK:STDOUT: %b: ref () = bind_name "b", %b.var
// CHECK:STDOUT: %MakeImplicitEmptyTuple.ref: <function> = name_reference "MakeImplicitEmptyTuple", file.%MakeImplicitEmptyTuple