mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
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:
@@ -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: }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user