Deduplicate and canonicalize all constants. (#3611)

Rather than producing multiple constants with the same value, fold all
instances of a given constant to the same constant instruction.

A future PR will use this to replace the current type canonicalization
system.
This commit is contained in:
Richard Smith
2024-01-18 21:42:19 +00:00
committed by GitHub
parent 62db3e9ad0
commit 29c294880d
142 changed files with 1603 additions and 1185 deletions
+8 -6
View File
@@ -25,14 +25,16 @@ fn Run() -> i32 {
// CHECK:STDOUT: --- basic.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.1: type = struct_type {.k: i32} [template]
// CHECK:STDOUT: %.2: i32 = int_literal 4 [template]
// CHECK:STDOUT: %Class: type = class_type @Class [template]
// CHECK:STDOUT: %.1: type = unbound_element_type Class, i32 [template]
// CHECK:STDOUT: %.2: type = struct_type {.k: i32} [template]
// CHECK:STDOUT: %.3: i32 = int_literal 4 [template]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace package, {.Class = %Class.decl, .Run = %Run} [template]
// CHECK:STDOUT: %Class.decl = class_decl @Class, ()
// CHECK:STDOUT: %Class: type = class_type @Class [template]
// CHECK:STDOUT: %Class: type = class_type @Class [template = constants.%Class]
// CHECK:STDOUT: %G: <function> = fn_decl @G [template]
// CHECK:STDOUT: %Run: <function> = fn_decl @Run [template]
// CHECK:STDOUT: }
@@ -40,7 +42,7 @@ fn Run() -> i32 {
// CHECK:STDOUT: class @Class {
// CHECK:STDOUT: %F: <function> = fn_decl @F [template]
// CHECK:STDOUT: %G: <function> = fn_decl @G [template]
// CHECK:STDOUT: %.loc14_8.1: type = unbound_element_type Class, i32 [template]
// CHECK:STDOUT: %.loc14_8.1: type = unbound_element_type Class, i32 [template = constants.%.1]
// CHECK:STDOUT: %.loc14_8.2: <unbound element of class Class> = field_decl k, element0 [template]
// CHECK:STDOUT: %k: <unbound element of class Class> = bind_name k, %.loc14_8.2 [template = %.loc14_8.2]
// CHECK:STDOUT:
@@ -64,9 +66,9 @@ fn Run() -> i32 {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run() -> i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class [template = file.%Class]
// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class [template = constants.%Class]
// CHECK:STDOUT: %F.ref: <function> = name_ref F, @Class.%F [template = @Class.%F]
// CHECK:STDOUT: %.loc22_18: i32 = int_literal 4 [template = constants.%.2]
// CHECK:STDOUT: %.loc22_18: i32 = int_literal 4 [template = constants.%.3]
// CHECK:STDOUT: %.loc22_17.1: init i32 = call %F.ref(%.loc22_18)
// CHECK:STDOUT: %.loc22_20: i32 = value_of_initializer %.loc22_17.1
// CHECK:STDOUT: %.loc22_17.2: i32 = converted %.loc22_17.1, %.loc22_20