mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
Using the computed value representation, fix lowering of struct and tuple values to use the value representation rather than the object representation. Fixes an issue found in the review of #3257. This currently causes us to compute value representations of all types as they are created, which generates substantially more SemIR to represent types. We can get some of that back by deferring computation of the value representation until the type is required to be complete, but some of the additional cost here will persist with this approach. I also considered making the computation of the value representation type be something that lives entirely within the lowering phase, but I think that's not the right approach in the longer term, because the value representation will be semantically visible and relevant once we start allowing it to be customized. We should consider moving the nodes that exist to compute canonical non-local types, including value representations, out into a separate global block. That will clean up the SemIR representation substantially, and make the SemIR produced for a function not depend on which types we happen to have encountered beforehand. But that's not being done in this PR. --------- Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
59 lines
2.9 KiB
Plaintext
59 lines
2.9 KiB
Plaintext
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
// AUTOUPDATE
|
|
|
|
fn F(arr: [i32; 3], i: i32) -> i32 {
|
|
return arr[i];
|
|
}
|
|
|
|
fn G() -> i32 {
|
|
return F((1, 2, 3), 1);
|
|
}
|
|
|
|
// CHECK:STDOUT: file "function_param.carbon" {
|
|
// CHECK:STDOUT: %F: <function> = fn_decl @F
|
|
// CHECK:STDOUT: %G: <function> = fn_decl @G
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @F(%arr: [i32; 3], %i: i32) -> i32 {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: %arr.ref: [i32; 3] = name_reference "arr", %arr
|
|
// CHECK:STDOUT: %i.ref: i32 = name_reference "i", %i
|
|
// CHECK:STDOUT: %.loc8_15.1: ref [i32; 3] = value_as_reference %arr.ref
|
|
// CHECK:STDOUT: %.loc8_15.2: ref i32 = array_index %.loc8_15.1, %i.ref
|
|
// CHECK:STDOUT: %.loc8_15.3: i32 = bind_value %.loc8_15.2
|
|
// CHECK:STDOUT: return %.loc8_15.3
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @G() -> i32 {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: %F.ref: <function> = name_reference "F", package.%F
|
|
// 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: type = ptr_type (i32, i32, i32)
|
|
// CHECK:STDOUT: %.loc12_20.3: (i32, i32, i32) = tuple_literal (%.loc12_13, %.loc12_16, %.loc12_19)
|
|
// CHECK:STDOUT: %.loc12_23: i32 = int_literal 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 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 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 to %.loc12_20.12
|
|
// CHECK:STDOUT: %.loc12_20.14: init [i32; 3] = array_init %.loc12_20.3, (%.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.ref(%.loc12_20.16, %.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
|
|
// CHECK:STDOUT: return %.loc12_11.4
|
|
// CHECK:STDOUT: }
|