Treat the empty inst block as being canonical. (#4199)

TryEvalInst was assuming this to be the case when forming canonical
constants, but it previously wasn't.

This fixes an issue where we can end up with two identical-looking
constants for an empty struct value: one with an `Empty` block and
another with the canonical empty block.
This commit is contained in:
Richard Smith
2024-08-07 21:58:28 +00:00
committed by GitHub
parent 3d13b8f71c
commit 3c4c234d01
16 changed files with 107 additions and 131 deletions
@@ -68,13 +68,13 @@ fn Foo(n: ()) -> ((), ()) {
// CHECK:STDOUT: 'inst+20': {kind: TupleLiteral, arg0: block8, type: type(inst+8)}
// CHECK:STDOUT: 'inst+21': {kind: TupleAccess, arg0: inst+13, arg1: element0, type: type(inst+1)}
// CHECK:STDOUT: 'inst+22': {kind: TupleInit, arg0: block9, arg1: inst+21, type: type(inst+1)}
// CHECK:STDOUT: 'inst+23': {kind: TupleValue, arg0: block10, type: type(inst+1)}
// CHECK:STDOUT: 'inst+23': {kind: TupleValue, arg0: empty, type: type(inst+1)}
// CHECK:STDOUT: 'inst+24': {kind: Converted, arg0: inst+18, arg1: inst+22, type: type(inst+1)}
// CHECK:STDOUT: 'inst+25': {kind: TupleAccess, arg0: inst+13, arg1: element1, type: type(inst+1)}
// CHECK:STDOUT: 'inst+26': {kind: TupleInit, arg0: empty, arg1: inst+25, type: type(inst+1)}
// CHECK:STDOUT: 'inst+27': {kind: Converted, arg0: inst+19, arg1: inst+26, type: type(inst+1)}
// CHECK:STDOUT: 'inst+28': {kind: TupleInit, arg0: block11, arg1: inst+13, type: type(inst+8)}
// CHECK:STDOUT: 'inst+29': {kind: TupleValue, arg0: block12, type: type(inst+8)}
// CHECK:STDOUT: 'inst+28': {kind: TupleInit, arg0: block10, arg1: inst+13, type: type(inst+8)}
// CHECK:STDOUT: 'inst+29': {kind: TupleValue, arg0: block11, type: type(inst+8)}
// CHECK:STDOUT: 'inst+30': {kind: Converted, arg0: inst+20, arg1: inst+28, type: type(inst+8)}
// CHECK:STDOUT: 'inst+31': {kind: ReturnExpr, arg0: inst+30, arg1: inst+13}
// CHECK:STDOUT: constant_values:
@@ -138,14 +138,13 @@ fn Foo(n: ()) -> ((), ()) {
// CHECK:STDOUT: 0: inst+18
// CHECK:STDOUT: 1: inst+19
// CHECK:STDOUT: block9: {}
// CHECK:STDOUT: block10: {}
// CHECK:STDOUT: block11:
// CHECK:STDOUT: block10:
// CHECK:STDOUT: 0: inst+24
// CHECK:STDOUT: 1: inst+27
// CHECK:STDOUT: block12:
// CHECK:STDOUT: block11:
// CHECK:STDOUT: 0: inst+23
// CHECK:STDOUT: 1: inst+23
// CHECK:STDOUT: block13:
// CHECK:STDOUT: block12:
// CHECK:STDOUT: 0: inst+0
// CHECK:STDOUT: 1: inst+14
// CHECK:STDOUT: ...
+2 -3
View File
@@ -86,7 +86,7 @@ fn Foo[T:! type](n: T) -> (T, ()) {
// CHECK:STDOUT: 'inst+26': {kind: InitializeFrom, arg0: inst+22, arg1: inst+25, type: type(symbolicConstant2)}
// CHECK:STDOUT: 'inst+27': {kind: TupleAccess, arg0: inst+15, arg1: element1, type: type(inst+8)}
// CHECK:STDOUT: 'inst+28': {kind: TupleInit, arg0: empty, arg1: inst+27, type: type(inst+8)}
// CHECK:STDOUT: 'inst+29': {kind: TupleValue, arg0: block15, type: type(inst+8)}
// CHECK:STDOUT: 'inst+29': {kind: TupleValue, arg0: empty, type: type(inst+8)}
// CHECK:STDOUT: 'inst+30': {kind: Converted, arg0: inst+23, arg1: inst+28, type: type(inst+8)}
// CHECK:STDOUT: 'inst+31': {kind: TupleInit, arg0: block14, arg1: inst+15, type: type(symbolicConstant3)}
// CHECK:STDOUT: 'inst+32': {kind: Converted, arg0: inst+24, arg1: inst+31, type: type(symbolicConstant3)}
@@ -170,8 +170,7 @@ fn Foo[T:! type](n: T) -> (T, ()) {
// CHECK:STDOUT: block14:
// CHECK:STDOUT: 0: inst+26
// CHECK:STDOUT: 1: inst+30
// CHECK:STDOUT: block15: {}
// CHECK:STDOUT: block16:
// CHECK:STDOUT: block15:
// CHECK:STDOUT: 0: inst+0
// CHECK:STDOUT: 1: inst+16
// CHECK:STDOUT: ...