mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 07:54:41 +01:00
Add GlobalInit to blocks to emit initialization instructions for globals (#3687)
`GlobalInit` block is now static block within a `SemIR` which will be used to emit initialization instructions for variables in the `Package` scope. inst_block_stack now has additional methods to handle `GlobalInit` block separately, this block can be popped without being finalized allowing to accumulate between all instances of variables. At the end of the `check` phase, if this block is not empty , the function `__global_init` will be added with this block being inserted into it. This block is pushed to `inst_block_scope` at the end `BindName`, allowing instruction to be emitted into it, then popped at the semicolon (VariableDecl). This significantly changes the `SemIR` output, that's why this commit updates a lot of the test cases.
This commit is contained in:
+12
-7
@@ -21,17 +21,22 @@ var y: {} = x;
|
||||
// CHECK:STDOUT: %.loc7_9.2: type = converted %.loc7_9.1, constants.%.1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {} = var x
|
||||
// CHECK:STDOUT: %x: ref {} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc7_14.1: {} = struct_literal ()
|
||||
// CHECK:STDOUT: %.loc7_14.2: init {} = struct_init () to %x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_14.3: init {} = converted %.loc7_14.1, %.loc7_14.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign %x.var, %.loc7_14.3
|
||||
// CHECK:STDOUT: %.loc8_9.1: {} = struct_literal ()
|
||||
// CHECK:STDOUT: %.loc8_9.2: type = converted %.loc8_9.1, constants.%.1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %y.var: ref {} = var y
|
||||
// CHECK:STDOUT: %y: ref {} = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {} = name_ref x, %x
|
||||
// CHECK:STDOUT: %.loc8_13.1: init {} = struct_init () to %y.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc7_14.1: {} = struct_literal ()
|
||||
// CHECK:STDOUT: %.loc7_14.2: init {} = struct_init () to file.%x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_14.3: init {} = converted %.loc7_14.1, %.loc7_14.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign file.%x.var, %.loc7_14.3
|
||||
// CHECK:STDOUT: %x.ref: ref {} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: %.loc8_13.1: init {} = struct_init () to file.%y.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc8_13.2: init {} = converted %x.ref, %.loc8_13.1 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign %y.var, %.loc8_13.2
|
||||
// CHECK:STDOUT: assign file.%y.var, %.loc8_13.2
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -18,10 +18,15 @@ var x: {.a: i32} = {};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x} [template]
|
||||
// CHECK:STDOUT: %.loc10_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc10_21: {} = struct_literal ()
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10: {} = struct_literal ()
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -26,8 +26,13 @@ var x: {.a: {}} = {.b = {}};
|
||||
// CHECK:STDOUT: %.loc10_15: type = struct_type {.a: {}} [template = constants.%.2]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: {}} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: {}} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10_26: {} = struct_literal ()
|
||||
// CHECK:STDOUT: %.loc10_27: {.b: {}} = struct_literal (%.loc10_26)
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -24,8 +24,13 @@ var x: {} = {.a = 1};
|
||||
// CHECK:STDOUT: %.loc10_9.2: type = converted %.loc10_9.1, constants.%.1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {} = var x
|
||||
// CHECK:STDOUT: %x: ref {} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10_19: i32 = int_literal 1 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc10_20: {.a: i32} = struct_literal (%.loc10_19)
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+13
-8
@@ -65,19 +65,24 @@ var y: {.b: i32, .c: i32} = {.b = 3, .b = 4};
|
||||
// CHECK:STDOUT: %.loc29_22: i32 = int_literal 1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc29_32: i32 = int_literal 2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %w: i32 = bind_name w, <error>
|
||||
// CHECK:STDOUT: %.loc37_16: type = struct_type {.a: i32} [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc37: type = struct_type {.a: i32} [template = constants.%.2]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc37_26: i32 = int_literal 1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc37_34: i32 = int_literal 2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: %.loc45_25: type = struct_type {.b: i32, .c: i32} [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc45: type = struct_type {.b: i32, .c: i32} [template = constants.%.4]
|
||||
// CHECK:STDOUT: %y.var: ref {.b: i32, .c: i32} = var y
|
||||
// CHECK:STDOUT: %y: ref {.b: i32, .c: i32} = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %.loc45_35: i32 = int_literal 3 [template = constants.%.6]
|
||||
// CHECK:STDOUT: %.loc45_43: i32 = int_literal 4 [template = constants.%.7]
|
||||
// CHECK:STDOUT: assign %y.var, <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F() -> <error>;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc37_26: i32 = int_literal 1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc37_34: i32 = int_literal 2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: %.loc45_35: i32 = int_literal 3 [template = constants.%.6]
|
||||
// CHECK:STDOUT: %.loc45_43: i32 = int_literal 4 [template = constants.%.7]
|
||||
// CHECK:STDOUT: assign file.%y.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -24,16 +24,21 @@ var y: {.b: i32} = x;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x, .y = %y} [template]
|
||||
// CHECK:STDOUT: %.loc10_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc10_26: i32 = int_literal 1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc10_27: {.b: i32} = struct_literal (%.loc10_26)
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: %.loc15: type = struct_type {.b: i32} [template = constants.%.3]
|
||||
// CHECK:STDOUT: %y.var: ref {.b: i32} = var y
|
||||
// CHECK:STDOUT: %y: ref {.b: i32} = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32} = name_ref x, %x
|
||||
// CHECK:STDOUT: assign %y.var, <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10_26: i32 = int_literal 1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc10_27: {.b: i32} = struct_literal (%.loc10_26)
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: assign file.%y.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -19,11 +19,16 @@ var x: {.a: i32} = {.b = 1.0};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x} [template]
|
||||
// CHECK:STDOUT: %.loc10_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10_26: f64 = real_literal 10e-1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc10_29: {.b: f64} = struct_literal (%.loc10_26)
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -20,17 +20,22 @@ var y: i32 = x.b;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x, .y = %y} [template]
|
||||
// CHECK:STDOUT: %.loc7_16: type = struct_type {.a: f64} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc7: type = struct_type {.a: f64} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: f64} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: f64} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc7_26: f64 = real_literal 40e-1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc7_29.1: {.a: f64} = struct_literal (%.loc7_26)
|
||||
// CHECK:STDOUT: %.loc7_29.2: init {.a: f64} = struct_init (%.loc7_26) to %x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_29.3: init {.a: f64} = converted %.loc7_29.1, %.loc7_29.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign %x.var, %.loc7_29.3
|
||||
// CHECK:STDOUT: %y.var: ref i32 = var y
|
||||
// CHECK:STDOUT: %y: ref i32 = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: f64} = name_ref x, %x
|
||||
// CHECK:STDOUT: assign %y.var, <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc7_26: f64 = real_literal 40e-1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc7_29.1: {.a: f64} = struct_literal (%.loc7_26)
|
||||
// CHECK:STDOUT: %.loc7_29.2: init {.a: f64} = struct_init (%.loc7_26) to file.%x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_29.3: init {.a: f64} = converted %.loc7_29.1, %.loc7_29.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign file.%x.var, %.loc7_29.3
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: f64} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: assign file.%y.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -32,13 +32,18 @@ var p: Incomplete* = &s.a;
|
||||
// CHECK:STDOUT: %s.var: ref <error> = var s
|
||||
// CHECK:STDOUT: %s: ref <error> = bind_name s, %s.var
|
||||
// CHECK:STDOUT: %Incomplete.ref.loc17: type = name_ref Incomplete, constants.%Incomplete [template = constants.%Incomplete]
|
||||
// CHECK:STDOUT: %.loc17_18: type = ptr_type Incomplete [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc17: type = ptr_type Incomplete [template = constants.%.2]
|
||||
// CHECK:STDOUT: %p.var: ref Incomplete* = var p
|
||||
// CHECK:STDOUT: %p: ref Incomplete* = bind_name p, %p.var
|
||||
// CHECK:STDOUT: %s.ref: ref <error> = name_ref s, %s
|
||||
// CHECK:STDOUT: %.loc17_22: <error> = addr_of <error> [template = <error>]
|
||||
// CHECK:STDOUT: assign %p.var, <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @Incomplete;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %s.ref: ref <error> = name_ref s, file.%s
|
||||
// CHECK:STDOUT: %.loc17: <error> = addr_of <error> [template = <error>]
|
||||
// CHECK:STDOUT: assign file.%p.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -20,17 +20,22 @@ var y: i32 = x.b;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x, .y = %y} [template]
|
||||
// CHECK:STDOUT: %.loc7_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc7: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc7_26: i32 = int_literal 4 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc7_27.1: {.a: i32} = struct_literal (%.loc7_26)
|
||||
// CHECK:STDOUT: %.loc7_27.2: init {.a: i32} = struct_init (%.loc7_26) to %x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_27.3: init {.a: i32} = converted %.loc7_27.1, %.loc7_27.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign %x.var, %.loc7_27.3
|
||||
// CHECK:STDOUT: %y.var: ref i32 = var y
|
||||
// CHECK:STDOUT: %y: ref i32 = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32} = name_ref x, %x
|
||||
// CHECK:STDOUT: assign %y.var, <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc7_26: i32 = int_literal 4 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc7_27.1: {.a: i32} = struct_literal (%.loc7_26)
|
||||
// CHECK:STDOUT: %.loc7_27.2: init {.a: i32} = struct_init (%.loc7_26) to file.%x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_27.3: init {.a: i32} = converted %.loc7_27.1, %.loc7_27.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign file.%x.var, %.loc7_27.3
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: assign file.%y.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -20,11 +20,16 @@ var x: {.a: i32, .b: i32} = {.a = 1};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x} [template]
|
||||
// CHECK:STDOUT: %.loc10_25: type = struct_type {.a: i32, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32, .b: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32, .b: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10_35: i32 = int_literal 1 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc10_36: {.a: i32} = struct_literal (%.loc10_35)
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+8
-3
@@ -17,10 +17,15 @@ var x: {.a: i32} = {.a: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x} [template]
|
||||
// CHECK:STDOUT: %.loc10_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc10_28: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: assign %x.var, <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: assign file.%x.var, <error>
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+32
-22
@@ -39,27 +39,31 @@ var b: {.a: {.b: i32, .c: (i32,)}, .d: i32} = b_ref;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.a_ref = %a_ref, .b_ref = %b_ref} [template]
|
||||
// CHECK:STDOUT: %.loc4_20: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc4: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %a_ref.var: ref {.a: i32} = var a_ref
|
||||
// CHECK:STDOUT: %a_ref: ref {.a: i32} = bind_name a_ref, %a_ref.var
|
||||
// CHECK:STDOUT: %.loc4_30: i32 = int_literal 0 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc4_31.1: {.a: i32} = struct_literal (%.loc4_30)
|
||||
// CHECK:STDOUT: %.loc4_31.2: init {.a: i32} = struct_init (%.loc4_30) to %a_ref.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc4_31.3: init {.a: i32} = converted %.loc4_31.1, %.loc4_31.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign %a_ref.var, %.loc4_31.3
|
||||
// CHECK:STDOUT: %.loc5_36.1: (type,) = tuple_literal (i32)
|
||||
// CHECK:STDOUT: %.loc5_36.2: type = converted %.loc5_36.1, constants.%.5 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc5_37: type = struct_type {.b: i32, .c: (i32,)} [template = constants.%.6]
|
||||
// CHECK:STDOUT: %.loc5_47: type = struct_type {.a: {.b: i32, .c: (i32,)}, .d: i32} [template = constants.%.7]
|
||||
// CHECK:STDOUT: %b_ref.var: ref {.a: {.b: i32, .c: (i32,)}, .d: i32} = var b_ref
|
||||
// CHECK:STDOUT: %b_ref: ref {.a: {.b: i32, .c: (i32,)}, .d: i32} = bind_name b_ref, %b_ref.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc4_30: i32 = int_literal 0 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc4_31.1: {.a: i32} = struct_literal (%.loc4_30)
|
||||
// CHECK:STDOUT: %.loc4_31.2: init {.a: i32} = struct_init (%.loc4_30) to file.%a_ref.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc4_31.3: init {.a: i32} = converted %.loc4_31.1, %.loc4_31.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign file.%a_ref.var, %.loc4_31.3
|
||||
// CHECK:STDOUT: %.loc6_17: i32 = int_literal 0 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc6_26: i32 = int_literal 0 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc6_28.1: (i32,) = tuple_literal (%.loc6_26)
|
||||
// CHECK:STDOUT: %.loc6_29.1: {.b: i32, .c: (i32,)} = struct_literal (%.loc6_17, %.loc6_28.1)
|
||||
// CHECK:STDOUT: %.loc6_37: i32 = int_literal 0 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc6_38.1: {.a: {.b: i32, .c: (i32,)}, .d: i32} = struct_literal (%.loc6_29.1, %.loc6_37)
|
||||
// CHECK:STDOUT: %.loc6_38.2: ref {.b: i32, .c: (i32,)} = struct_access %b_ref.var, element0
|
||||
// CHECK:STDOUT: %.loc6_38.2: ref {.b: i32, .c: (i32,)} = struct_access file.%b_ref.var, element0
|
||||
// CHECK:STDOUT: %.loc6_29.2: ref i32 = struct_access %.loc6_38.2, element0
|
||||
// CHECK:STDOUT: %.loc6_29.3: init i32 = initialize_from %.loc6_17 to %.loc6_29.2 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc6_29.4: ref (i32,) = struct_access %.loc6_38.2, element1
|
||||
@@ -68,11 +72,12 @@ var b: {.a: {.b: i32, .c: (i32,)}, .d: i32} = b_ref;
|
||||
// CHECK:STDOUT: %.loc6_29.5: init (i32,) = initialize_from %.loc6_28.3 to %.loc6_29.4 [template = constants.%.11]
|
||||
// CHECK:STDOUT: %.loc6_29.6: init {.b: i32, .c: (i32,)} = struct_init (%.loc6_29.3, %.loc6_29.5) to %.loc6_38.2 [template = constants.%.12]
|
||||
// CHECK:STDOUT: %.loc6_29.7: init {.b: i32, .c: (i32,)} = converted %.loc6_29.1, %.loc6_29.6 [template = constants.%.12]
|
||||
// CHECK:STDOUT: %.loc6_38.3: ref i32 = struct_access %b_ref.var, element1
|
||||
// CHECK:STDOUT: %.loc6_38.3: ref i32 = struct_access file.%b_ref.var, element1
|
||||
// CHECK:STDOUT: %.loc6_38.4: init i32 = initialize_from %.loc6_37 to %.loc6_38.3 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc6_38.5: init {.a: {.b: i32, .c: (i32,)}, .d: i32} = struct_init (%.loc6_29.7, %.loc6_38.4) to %b_ref.var [template = constants.%.13]
|
||||
// CHECK:STDOUT: %.loc6_38.5: init {.a: {.b: i32, .c: (i32,)}, .d: i32} = struct_init (%.loc6_29.7, %.loc6_38.4) to file.%b_ref.var [template = constants.%.13]
|
||||
// CHECK:STDOUT: %.loc6_38.6: init {.a: {.b: i32, .c: (i32,)}, .d: i32} = converted %.loc6_38.1, %.loc6_38.5 [template = constants.%.13]
|
||||
// CHECK:STDOUT: assign %b_ref.var, %.loc6_38.6
|
||||
// CHECK:STDOUT: assign file.%b_ref.var, %.loc6_38.6
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- implicit.impl.carbon
|
||||
@@ -92,26 +97,30 @@ var b: {.a: {.b: i32, .c: (i32,)}, .d: i32} = b_ref;
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.a_ref = %import_ref.1, .b_ref = %import_ref.2, .a = %a, .b = %b} [template]
|
||||
// CHECK:STDOUT: %import_ref.1: ref {.a: i32} = import_ref ir1, inst+6, used
|
||||
// CHECK:STDOUT: %import_ref.2: ref {.a: {.b: i32, .c: (i32,)}, .d: i32} = import_ref ir1, inst+37, used
|
||||
// CHECK:STDOUT: %.loc4_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc4: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %a.var: ref {.a: i32} = var a
|
||||
// CHECK:STDOUT: %a: ref {.a: i32} = bind_name a, %a.var
|
||||
// CHECK:STDOUT: %a_ref.ref: ref {.a: i32} = name_ref a_ref, %import_ref.1
|
||||
// CHECK:STDOUT: %.loc4_20.1: ref i32 = struct_access %a_ref.ref, element0
|
||||
// CHECK:STDOUT: %.loc4_20.2: i32 = bind_value %.loc4_20.1
|
||||
// CHECK:STDOUT: %.loc4_20.3: init {.a: i32} = struct_init (%.loc4_20.2) to %a.var
|
||||
// CHECK:STDOUT: %.loc4_20.4: init {.a: i32} = converted %a_ref.ref, %.loc4_20.3
|
||||
// CHECK:STDOUT: assign %a.var, %.loc4_20.4
|
||||
// CHECK:STDOUT: %.loc5_32.1: (type,) = tuple_literal (i32)
|
||||
// CHECK:STDOUT: %.loc5_32.2: type = converted %.loc5_32.1, constants.%.3 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc5_33: type = struct_type {.b: i32, .c: (i32,)} [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc5_43: type = struct_type {.a: {.b: i32, .c: (i32,)}, .d: i32} [template = constants.%.5]
|
||||
// CHECK:STDOUT: %b.var: ref {.a: {.b: i32, .c: (i32,)}, .d: i32} = var b
|
||||
// CHECK:STDOUT: %b: ref {.a: {.b: i32, .c: (i32,)}, .d: i32} = bind_name b, %b.var
|
||||
// CHECK:STDOUT: %b_ref.ref: ref {.a: {.b: i32, .c: (i32,)}, .d: i32} = name_ref b_ref, %import_ref.2
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %a_ref.ref: ref {.a: i32} = name_ref a_ref, file.%import_ref.1
|
||||
// CHECK:STDOUT: %.loc4_20.1: ref i32 = struct_access %a_ref.ref, element0
|
||||
// CHECK:STDOUT: %.loc4_20.2: i32 = bind_value %.loc4_20.1
|
||||
// CHECK:STDOUT: %.loc4_20.3: init {.a: i32} = struct_init (%.loc4_20.2) to file.%a.var
|
||||
// CHECK:STDOUT: %.loc4_20.4: init {.a: i32} = converted %a_ref.ref, %.loc4_20.3
|
||||
// CHECK:STDOUT: assign file.%a.var, %.loc4_20.4
|
||||
// CHECK:STDOUT: %b_ref.ref: ref {.a: {.b: i32, .c: (i32,)}, .d: i32} = name_ref b_ref, file.%import_ref.2
|
||||
// CHECK:STDOUT: %.loc5_47.1: ref {.b: i32, .c: (i32,)} = struct_access %b_ref.ref, element0
|
||||
// CHECK:STDOUT: %.loc5_47.2: ref i32 = struct_access %.loc5_47.1, element0
|
||||
// CHECK:STDOUT: %.loc5_47.3: i32 = bind_value %.loc5_47.2
|
||||
// CHECK:STDOUT: %.loc5_47.4: ref {.b: i32, .c: (i32,)} = struct_access %b.var, element0
|
||||
// CHECK:STDOUT: %.loc5_47.4: ref {.b: i32, .c: (i32,)} = struct_access file.%b.var, element0
|
||||
// CHECK:STDOUT: %.loc5_47.5: ref i32 = struct_access %.loc5_47.4, element0
|
||||
// CHECK:STDOUT: %.loc5_47.6: init i32 = initialize_from %.loc5_47.3 to %.loc5_47.5
|
||||
// CHECK:STDOUT: %.loc5_47.7: ref (i32,) = struct_access %.loc5_47.1, element1
|
||||
@@ -125,10 +134,11 @@ var b: {.a: {.b: i32, .c: (i32,)}, .d: i32} = b_ref;
|
||||
// CHECK:STDOUT: %.loc5_47.15: init {.b: i32, .c: (i32,)} = converted %.loc5_47.1, %.loc5_47.14
|
||||
// CHECK:STDOUT: %.loc5_47.16: ref i32 = struct_access %b_ref.ref, element1
|
||||
// CHECK:STDOUT: %.loc5_47.17: i32 = bind_value %.loc5_47.16
|
||||
// CHECK:STDOUT: %.loc5_47.18: ref i32 = struct_access %b.var, element1
|
||||
// CHECK:STDOUT: %.loc5_47.18: ref i32 = struct_access file.%b.var, element1
|
||||
// CHECK:STDOUT: %.loc5_47.19: init i32 = initialize_from %.loc5_47.17 to %.loc5_47.18
|
||||
// CHECK:STDOUT: %.loc5_47.20: init {.a: {.b: i32, .c: (i32,)}, .d: i32} = struct_init (%.loc5_47.15, %.loc5_47.19) to %b.var
|
||||
// CHECK:STDOUT: %.loc5_47.20: init {.a: {.b: i32, .c: (i32,)}, .d: i32} = struct_init (%.loc5_47.15, %.loc5_47.19) to file.%b.var
|
||||
// CHECK:STDOUT: %.loc5_47.21: init {.a: {.b: i32, .c: (i32,)}, .d: i32} = converted %b_ref.ref, %.loc5_47.20
|
||||
// CHECK:STDOUT: assign %b.var, %.loc5_47.21
|
||||
// CHECK:STDOUT: assign file.%b.var, %.loc5_47.21
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+18
-13
@@ -20,29 +20,34 @@ var z: i32 = y;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x, .y = %y, .z = %z} [template]
|
||||
// CHECK:STDOUT: %.loc7_25: type = struct_type {.a: f64, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc7: type = struct_type {.a: f64, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: f64, .b: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: f64, .b: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %y.var: ref i32 = var y
|
||||
// CHECK:STDOUT: %y: ref i32 = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %z.var: ref i32 = var z
|
||||
// CHECK:STDOUT: %z: ref i32 = bind_name z, %z.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc7_35: f64 = real_literal 0e-1 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_45: i32 = int_literal 1 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc7_46.1: {.a: f64, .b: i32} = struct_literal (%.loc7_35, %.loc7_45)
|
||||
// CHECK:STDOUT: %.loc7_46.2: ref f64 = struct_access %x.var, element0
|
||||
// CHECK:STDOUT: %.loc7_46.2: ref f64 = struct_access file.%x.var, element0
|
||||
// CHECK:STDOUT: %.loc7_46.3: init f64 = initialize_from %.loc7_35 to %.loc7_46.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_46.4: ref i32 = struct_access %x.var, element1
|
||||
// CHECK:STDOUT: %.loc7_46.4: ref i32 = struct_access file.%x.var, element1
|
||||
// CHECK:STDOUT: %.loc7_46.5: init i32 = initialize_from %.loc7_45 to %.loc7_46.4 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc7_46.6: init {.a: f64, .b: i32} = struct_init (%.loc7_46.3, %.loc7_46.5) to %x.var [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc7_46.6: init {.a: f64, .b: i32} = struct_init (%.loc7_46.3, %.loc7_46.5) to file.%x.var [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc7_46.7: init {.a: f64, .b: i32} = converted %.loc7_46.1, %.loc7_46.6 [template = constants.%.5]
|
||||
// CHECK:STDOUT: assign %x.var, %.loc7_46.7
|
||||
// CHECK:STDOUT: %y.var: ref i32 = var y
|
||||
// CHECK:STDOUT: %y: ref i32 = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: f64, .b: i32} = name_ref x, %x
|
||||
// CHECK:STDOUT: assign file.%x.var, %.loc7_46.7
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: f64, .b: i32} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: %.loc8_15.1: ref i32 = struct_access %x.ref, element1
|
||||
// CHECK:STDOUT: %.loc8_15.2: i32 = bind_value %.loc8_15.1
|
||||
// CHECK:STDOUT: assign %y.var, %.loc8_15.2
|
||||
// CHECK:STDOUT: %z.var: ref i32 = var z
|
||||
// CHECK:STDOUT: %z: ref i32 = bind_name z, %z.var
|
||||
// CHECK:STDOUT: %y.ref: ref i32 = name_ref y, %y
|
||||
// CHECK:STDOUT: assign file.%y.var, %.loc8_15.2
|
||||
// CHECK:STDOUT: %y.ref: ref i32 = name_ref y, file.%y
|
||||
// CHECK:STDOUT: %.loc9: i32 = bind_value %y.ref
|
||||
// CHECK:STDOUT: assign %z.var, %.loc9
|
||||
// CHECK:STDOUT: assign file.%z.var, %.loc9
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+15
-10
@@ -17,22 +17,27 @@ var y: {.a: i32} = x;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace {.x = %x, .y = %y} [template]
|
||||
// CHECK:STDOUT: %.loc7_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc7: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc7_26: i32 = int_literal 4 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc7_27.1: {.a: i32} = struct_literal (%.loc7_26)
|
||||
// CHECK:STDOUT: %.loc7_27.2: init {.a: i32} = struct_init (%.loc7_26) to %x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_27.3: init {.a: i32} = converted %.loc7_27.1, %.loc7_27.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign %x.var, %.loc7_27.3
|
||||
// CHECK:STDOUT: %.loc8_16: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc8: type = struct_type {.a: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %y.var: ref {.a: i32} = var y
|
||||
// CHECK:STDOUT: %y: ref {.a: i32} = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32} = name_ref x, %x
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc7_26: i32 = int_literal 4 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc7_27.1: {.a: i32} = struct_literal (%.loc7_26)
|
||||
// CHECK:STDOUT: %.loc7_27.2: init {.a: i32} = struct_init (%.loc7_26) to file.%x.var [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc7_27.3: init {.a: i32} = converted %.loc7_27.1, %.loc7_27.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: assign file.%x.var, %.loc7_27.3
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: %.loc8_20.1: ref i32 = struct_access %x.ref, element0
|
||||
// CHECK:STDOUT: %.loc8_20.2: i32 = bind_value %.loc8_20.1
|
||||
// CHECK:STDOUT: %.loc8_20.3: init {.a: i32} = struct_init (%.loc8_20.2) to %y.var
|
||||
// CHECK:STDOUT: %.loc8_20.3: init {.a: i32} = struct_init (%.loc8_20.2) to file.%y.var
|
||||
// CHECK:STDOUT: %.loc8_20.4: init {.a: i32} = converted %x.ref, %.loc8_20.3
|
||||
// CHECK:STDOUT: assign %y.var, %.loc8_20.4
|
||||
// CHECK:STDOUT: assign file.%y.var, %.loc8_20.4
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+23
-18
@@ -27,38 +27,43 @@ var y: {.a: i32, .b: (i32,)} = x;
|
||||
// CHECK:STDOUT: %.loc7_28: type = struct_type {.a: i32, .b: (i32,)} [template = constants.%.3]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32, .b: (i32,)} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32, .b: (i32,)} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc7_38: i32 = int_literal 1 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc7_47: i32 = int_literal 2 [template = constants.%.6]
|
||||
// CHECK:STDOUT: %.loc7_49.1: (i32,) = tuple_literal (%.loc7_47)
|
||||
// CHECK:STDOUT: %.loc7_50.1: {.a: i32, .b: (i32,)} = struct_literal (%.loc7_38, %.loc7_49.1)
|
||||
// CHECK:STDOUT: %.loc7_50.2: ref i32 = struct_access %x.var, element0
|
||||
// CHECK:STDOUT: %.loc7_50.3: init i32 = initialize_from %.loc7_38 to %.loc7_50.2 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc7_50.4: ref (i32,) = struct_access %x.var, element1
|
||||
// CHECK:STDOUT: %.loc7_49.2: init (i32,) = tuple_init (%.loc7_47) to %.loc7_50.4 [template = constants.%.7]
|
||||
// CHECK:STDOUT: %.loc7_49.3: init (i32,) = converted %.loc7_49.1, %.loc7_49.2 [template = constants.%.7]
|
||||
// CHECK:STDOUT: %.loc7_50.5: init (i32,) = initialize_from %.loc7_49.3 to %.loc7_50.4 [template = constants.%.7]
|
||||
// CHECK:STDOUT: %.loc7_50.6: init {.a: i32, .b: (i32,)} = struct_init (%.loc7_50.3, %.loc7_50.5) to %x.var [template = constants.%.8]
|
||||
// CHECK:STDOUT: %.loc7_50.7: init {.a: i32, .b: (i32,)} = converted %.loc7_50.1, %.loc7_50.6 [template = constants.%.8]
|
||||
// CHECK:STDOUT: assign %x.var, %.loc7_50.7
|
||||
// CHECK:STDOUT: %.loc8_27.1: (type,) = tuple_literal (i32)
|
||||
// CHECK:STDOUT: %.loc8_27.2: type = converted %.loc8_27.1, constants.%.2 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc8_28: type = struct_type {.a: i32, .b: (i32,)} [template = constants.%.3]
|
||||
// CHECK:STDOUT: %y.var: ref {.a: i32, .b: (i32,)} = var y
|
||||
// CHECK:STDOUT: %y: ref {.a: i32, .b: (i32,)} = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32, .b: (i32,)} = name_ref x, %x
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc7_38: i32 = int_literal 1 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc7_47: i32 = int_literal 2 [template = constants.%.6]
|
||||
// CHECK:STDOUT: %.loc7_49.1: (i32,) = tuple_literal (%.loc7_47)
|
||||
// CHECK:STDOUT: %.loc7_50.1: {.a: i32, .b: (i32,)} = struct_literal (%.loc7_38, %.loc7_49.1)
|
||||
// CHECK:STDOUT: %.loc7_50.2: ref i32 = struct_access file.%x.var, element0
|
||||
// CHECK:STDOUT: %.loc7_50.3: init i32 = initialize_from %.loc7_38 to %.loc7_50.2 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc7_50.4: ref (i32,) = struct_access file.%x.var, element1
|
||||
// CHECK:STDOUT: %.loc7_49.2: init (i32,) = tuple_init (%.loc7_47) to %.loc7_50.4 [template = constants.%.7]
|
||||
// CHECK:STDOUT: %.loc7_49.3: init (i32,) = converted %.loc7_49.1, %.loc7_49.2 [template = constants.%.7]
|
||||
// CHECK:STDOUT: %.loc7_50.5: init (i32,) = initialize_from %.loc7_49.3 to %.loc7_50.4 [template = constants.%.7]
|
||||
// CHECK:STDOUT: %.loc7_50.6: init {.a: i32, .b: (i32,)} = struct_init (%.loc7_50.3, %.loc7_50.5) to file.%x.var [template = constants.%.8]
|
||||
// CHECK:STDOUT: %.loc7_50.7: init {.a: i32, .b: (i32,)} = converted %.loc7_50.1, %.loc7_50.6 [template = constants.%.8]
|
||||
// CHECK:STDOUT: assign file.%x.var, %.loc7_50.7
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32, .b: (i32,)} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: %.loc8_32.1: ref i32 = struct_access %x.ref, element0
|
||||
// CHECK:STDOUT: %.loc8_32.2: i32 = bind_value %.loc8_32.1
|
||||
// CHECK:STDOUT: %.loc8_32.3: ref i32 = struct_access %y.var, element0
|
||||
// CHECK:STDOUT: %.loc8_32.3: ref i32 = struct_access file.%y.var, element0
|
||||
// CHECK:STDOUT: %.loc8_32.4: init i32 = initialize_from %.loc8_32.2 to %.loc8_32.3
|
||||
// CHECK:STDOUT: %.loc8_32.5: ref (i32,) = struct_access %x.ref, element1
|
||||
// CHECK:STDOUT: %.loc8_32.6: ref i32 = tuple_access %.loc8_32.5, element0
|
||||
// CHECK:STDOUT: %.loc8_32.7: i32 = bind_value %.loc8_32.6
|
||||
// CHECK:STDOUT: %.loc8_32.8: ref (i32,) = struct_access %y.var, element1
|
||||
// CHECK:STDOUT: %.loc8_32.8: ref (i32,) = struct_access file.%y.var, element1
|
||||
// CHECK:STDOUT: %.loc8_32.9: init (i32,) = tuple_init (%.loc8_32.7) to %.loc8_32.8
|
||||
// CHECK:STDOUT: %.loc8_32.10: init (i32,) = converted %.loc8_32.5, %.loc8_32.9
|
||||
// CHECK:STDOUT: %.loc8_32.11: init (i32,) = initialize_from %.loc8_32.10 to %.loc8_32.8
|
||||
// CHECK:STDOUT: %.loc8_32.12: init {.a: i32, .b: (i32,)} = struct_init (%.loc8_32.4, %.loc8_32.11) to %y.var
|
||||
// CHECK:STDOUT: %.loc8_32.12: init {.a: i32, .b: (i32,)} = struct_init (%.loc8_32.4, %.loc8_32.11) to file.%y.var
|
||||
// CHECK:STDOUT: %.loc8_32.13: init {.a: i32, .b: (i32,)} = converted %x.ref, %.loc8_32.12
|
||||
// CHECK:STDOUT: assign %y.var, %.loc8_32.13
|
||||
// CHECK:STDOUT: assign file.%y.var, %.loc8_32.13
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+18
-13
@@ -32,33 +32,38 @@ var y: {.a: i32, .b: i32} = x;
|
||||
// CHECK:STDOUT: %.loc8: type = struct_type {.a: i32, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %v.ref: {.a: i32, .b: i32} = name_ref v, %v
|
||||
// CHECK:STDOUT: %w: {.a: i32, .b: i32} = bind_name w, %v.ref
|
||||
// CHECK:STDOUT: %.loc10_25: type = struct_type {.a: i32, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %x.var: ref {.a: i32, .b: i32} = var x
|
||||
// CHECK:STDOUT: %x: ref {.a: i32, .b: i32} = bind_name x, %x.var
|
||||
// CHECK:STDOUT: %.loc11: type = struct_type {.a: i32, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %y.var: ref {.a: i32, .b: i32} = var y
|
||||
// CHECK:STDOUT: %y: ref {.a: i32, .b: i32} = bind_name y, %y.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc10_35: i32 = int_literal 1 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc10_43: i32 = int_literal 2 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc10_44.1: {.a: i32, .b: i32} = struct_literal (%.loc10_35, %.loc10_43)
|
||||
// CHECK:STDOUT: %.loc10_44.2: ref i32 = struct_access %x.var, element0
|
||||
// CHECK:STDOUT: %.loc10_44.2: ref i32 = struct_access file.%x.var, element0
|
||||
// CHECK:STDOUT: %.loc10_44.3: init i32 = initialize_from %.loc10_35 to %.loc10_44.2 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc10_44.4: ref i32 = struct_access %x.var, element1
|
||||
// CHECK:STDOUT: %.loc10_44.4: ref i32 = struct_access file.%x.var, element1
|
||||
// CHECK:STDOUT: %.loc10_44.5: init i32 = initialize_from %.loc10_43 to %.loc10_44.4 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc10_44.6: init {.a: i32, .b: i32} = struct_init (%.loc10_44.3, %.loc10_44.5) to %x.var [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc10_44.6: init {.a: i32, .b: i32} = struct_init (%.loc10_44.3, %.loc10_44.5) to file.%x.var [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc10_44.7: init {.a: i32, .b: i32} = converted %.loc10_44.1, %.loc10_44.6 [template = constants.%.5]
|
||||
// CHECK:STDOUT: assign %x.var, %.loc10_44.7
|
||||
// CHECK:STDOUT: %.loc11_25: type = struct_type {.a: i32, .b: i32} [template = constants.%.1]
|
||||
// CHECK:STDOUT: %y.var: ref {.a: i32, .b: i32} = var y
|
||||
// CHECK:STDOUT: %y: ref {.a: i32, .b: i32} = bind_name y, %y.var
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32, .b: i32} = name_ref x, %x
|
||||
// CHECK:STDOUT: assign file.%x.var, %.loc10_44.7
|
||||
// CHECK:STDOUT: %x.ref: ref {.a: i32, .b: i32} = name_ref x, file.%x
|
||||
// CHECK:STDOUT: %.loc11_29.1: ref i32 = struct_access %x.ref, element0
|
||||
// CHECK:STDOUT: %.loc11_29.2: i32 = bind_value %.loc11_29.1
|
||||
// CHECK:STDOUT: %.loc11_29.3: ref i32 = struct_access %y.var, element0
|
||||
// CHECK:STDOUT: %.loc11_29.3: ref i32 = struct_access file.%y.var, element0
|
||||
// CHECK:STDOUT: %.loc11_29.4: init i32 = initialize_from %.loc11_29.2 to %.loc11_29.3
|
||||
// CHECK:STDOUT: %.loc11_29.5: ref i32 = struct_access %x.ref, element1
|
||||
// CHECK:STDOUT: %.loc11_29.6: i32 = bind_value %.loc11_29.5
|
||||
// CHECK:STDOUT: %.loc11_29.7: ref i32 = struct_access %y.var, element1
|
||||
// CHECK:STDOUT: %.loc11_29.7: ref i32 = struct_access file.%y.var, element1
|
||||
// CHECK:STDOUT: %.loc11_29.8: init i32 = initialize_from %.loc11_29.6 to %.loc11_29.7
|
||||
// CHECK:STDOUT: %.loc11_29.9: init {.a: i32, .b: i32} = struct_init (%.loc11_29.4, %.loc11_29.8) to %y.var
|
||||
// CHECK:STDOUT: %.loc11_29.9: init {.a: i32, .b: i32} = struct_init (%.loc11_29.4, %.loc11_29.8) to file.%y.var
|
||||
// CHECK:STDOUT: %.loc11_29.10: init {.a: i32, .b: i32} = converted %x.ref, %.loc11_29.9
|
||||
// CHECK:STDOUT: assign %y.var, %.loc11_29.10
|
||||
// CHECK:STDOUT: assign file.%y.var, %.loc11_29.10
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
Reference in New Issue
Block a user