Remove nearly all uses of StubReferences. (#3249)

The speculative insertion of StubReferences after elements in an
argument list turned out to not be necessary, because we decided we want
to insert per-argument initialization steps after all arguments are
evaluated, rather than interleaving them. The StubReferences we insert
are causing some minor code complexity, so remove them.

We still create StubReferences when performing patch-ups of
already-emitted code, but we no longer ever need to look through them
when determining whether an initializer was a literal or when evaluating
a type expression.
This commit is contained in:
Richard Smith
2023-09-21 00:00:36 +00:00
committed by GitHub
parent 842b471e67
commit f389844893
66 changed files with 398 additions and 675 deletions
+19 -24
View File
@@ -25,31 +25,26 @@ fn G() -> i32 {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @G() -> i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc12_13.1: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_13.2: i32 = stub_reference %.loc12_13.1
// CHECK:STDOUT: %.loc12_16.1: i32 = int_literal 2
// CHECK:STDOUT: %.loc12_16.2: i32 = stub_reference %.loc12_16.1
// CHECK:STDOUT: %.loc12_19.1: i32 = int_literal 3
// CHECK:STDOUT: %.loc12_19.2: i32 = stub_reference %.loc12_19.1
// CHECK:STDOUT: %.loc12_13: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_16: i32 = int_literal 2
// CHECK:STDOUT: %.loc12_19: i32 = int_literal 3
// CHECK:STDOUT: %.loc12_20.1: type = tuple_type (i32, i32, i32)
// CHECK:STDOUT: %.loc12_20.2: (i32, i32, i32) = tuple_literal (%.loc12_13.2, %.loc12_16.2, %.loc12_19.2)
// CHECK:STDOUT: %.loc12_20.3: (i32, i32, i32) = stub_reference %.loc12_20.2
// CHECK:STDOUT: %.loc12_23.1: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_23.2: i32 = stub_reference %.loc12_23.1
// CHECK:STDOUT: %.loc12_20.4: ref [i32; 3] = temporary_storage
// CHECK:STDOUT: %.loc12_20.5: i32 = int_literal 0
// CHECK:STDOUT: %.loc12_20.6: ref i32 = array_index %.loc12_20.4, %.loc12_20.5
// CHECK:STDOUT: %.loc12_20.7: init i32 = initialize_from %.loc12_13.2 to %.loc12_20.6
// CHECK:STDOUT: %.loc12_20.8: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_20.9: ref i32 = array_index %.loc12_20.4, %.loc12_20.8
// CHECK:STDOUT: %.loc12_20.10: init i32 = initialize_from %.loc12_16.2 to %.loc12_20.9
// CHECK:STDOUT: %.loc12_20.11: i32 = int_literal 2
// CHECK:STDOUT: %.loc12_20.12: ref i32 = array_index %.loc12_20.4, %.loc12_20.11
// CHECK:STDOUT: %.loc12_20.13: init i32 = initialize_from %.loc12_19.2 to %.loc12_20.12
// CHECK:STDOUT: %.loc12_20.14: init [i32; 3] = array_init %.loc12_20.2, (%.loc12_20.7, %.loc12_20.10, %.loc12_20.13) to %.loc12_20.4
// CHECK:STDOUT: %.loc12_20.15: ref [i32; 3] = temporary %.loc12_20.4, %.loc12_20.14
// CHECK:STDOUT: %.loc12_20.16: [i32; 3] = bind_value %.loc12_20.15
// CHECK:STDOUT: %.loc12_11.1: init i32 = call @F(%.loc12_20.16, %.loc12_23.2)
// CHECK:STDOUT: %.loc12_20.2: (i32, i32, i32) = tuple_literal (%.loc12_13, %.loc12_16, %.loc12_19)
// CHECK:STDOUT: %.loc12_23: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_20.3: ref [i32; 3] = temporary_storage
// CHECK:STDOUT: %.loc12_20.4: i32 = int_literal 0
// CHECK:STDOUT: %.loc12_20.5: ref i32 = array_index %.loc12_20.3, %.loc12_20.4
// CHECK:STDOUT: %.loc12_20.6: init i32 = initialize_from %.loc12_13 to %.loc12_20.5
// CHECK:STDOUT: %.loc12_20.7: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_20.8: ref i32 = array_index %.loc12_20.3, %.loc12_20.7
// CHECK:STDOUT: %.loc12_20.9: init i32 = initialize_from %.loc12_16 to %.loc12_20.8
// CHECK:STDOUT: %.loc12_20.10: i32 = int_literal 2
// CHECK:STDOUT: %.loc12_20.11: ref i32 = array_index %.loc12_20.3, %.loc12_20.10
// CHECK:STDOUT: %.loc12_20.12: init i32 = initialize_from %.loc12_19 to %.loc12_20.11
// CHECK:STDOUT: %.loc12_20.13: init [i32; 3] = array_init %.loc12_20.2, (%.loc12_20.6, %.loc12_20.9, %.loc12_20.12) to %.loc12_20.3
// CHECK:STDOUT: %.loc12_20.14: ref [i32; 3] = temporary %.loc12_20.3, %.loc12_20.13
// CHECK:STDOUT: %.loc12_20.15: [i32; 3] = bind_value %.loc12_20.14
// CHECK:STDOUT: %.loc12_11.1: init i32 = call @F(%.loc12_20.15, %.loc12_23)
// CHECK:STDOUT: %.loc12_11.2: ref i32 = temporary_storage
// CHECK:STDOUT: %.loc12_11.3: ref i32 = temporary %.loc12_11.2, %.loc12_11.1
// CHECK:STDOUT: %.loc12_11.4: i32 = bind_value %.loc12_11.3