Add formatted textual IR output (#3056)

Add a textual IR format to the toolchain.

The exact details of the format are somewhat arbitrary right now, and I
expect them to change as we refine the semantics IR model, but at the
moment they're somewhat directly following the current structure of the
IR.

Semantics tests currently test both the "raw" format, which shows the
details of the representation, and the textual format, which is somewhat
higher level. We may want to revisit that decision once the textual
format is a bit more stable, and test only the textual format in most of
these tests, but for now it seems prudent to keep both sets of tests.

---------

Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
This commit is contained in:
Richard Smith
2023-08-10 19:41:39 +00:00
committed by GitHub
co-authored by Chandler Carruth
parent fc5a9541ce
commit 6cbf280a68
140 changed files with 3127 additions and 64 deletions
@@ -75,3 +75,22 @@ fn Main() {
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7_20: {} = struct_value ()
// CHECK:STDOUT: %.loc7_1 = fn_decl @Echo
// CHECK:STDOUT: %.loc11 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: {}) -> {} {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return %a
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc12_9.1: {} = struct_value ()
// CHECK:STDOUT: %.loc12_9.2: {} = stub_reference %.loc12_9.1
// CHECK:STDOUT: %.loc12_7: {} = call @Echo(%.loc12_9.2)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -77,3 +77,22 @@ fn Main() {
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7_20: () = tuple_value ()
// CHECK:STDOUT: %.loc7_1 = fn_decl @Echo
// CHECK:STDOUT: %.loc11 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: ()) -> () {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return %a
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc12_9.1: () = tuple_value ()
// CHECK:STDOUT: %.loc12_9.2: () = stub_reference %.loc12_9.1
// CHECK:STDOUT: %.loc12_7: () = call @Echo(%.loc12_9.2)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -178,3 +178,42 @@ fn Main() {
// CHECK:STDOUT: node+24,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Run0
// CHECK:STDOUT: %.loc8 = fn_decl @Run1
// CHECK:STDOUT: %.loc9 = fn_decl @Run2
// CHECK:STDOUT: %.loc11 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run0() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run1(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run2(%a: i32, %b: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc18_8.1: i32 = int_value 1
// CHECK:STDOUT: %.loc18_8.2: i32 = stub_reference %.loc18_8.1
// CHECK:STDOUT: %.loc25_8.1: i32 = int_value 0
// CHECK:STDOUT: %.loc25_8.2: i32 = stub_reference %.loc25_8.1
// CHECK:STDOUT: %.loc25_11.1: i32 = int_value 1
// CHECK:STDOUT: %.loc25_11.2: i32 = stub_reference %.loc25_11.1
// CHECK:STDOUT: %.loc40_8.1: i32 = int_value 0
// CHECK:STDOUT: %.loc40_8.2: i32 = stub_reference %.loc40_8.1
// CHECK:STDOUT: %.loc40_11.1: i32 = int_value 1
// CHECK:STDOUT: %.loc40_11.2: i32 = stub_reference %.loc40_11.1
// CHECK:STDOUT: %.loc55_8.1: i32 = int_value 0
// CHECK:STDOUT: %.loc55_8.2: i32 = stub_reference %.loc55_8.1
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -73,3 +73,20 @@ fn Main() {
// CHECK:STDOUT: node+6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Run
// CHECK:STDOUT: %.loc9 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc16_7.1: f64 = real_value 10e-1
// CHECK:STDOUT: %.loc16_7.2: f64 = stub_reference %.loc16_7.1
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -64,3 +64,22 @@ fn Run() {
// CHECK:STDOUT: node+8,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc9 = fn_decl @Run
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo() -> f64 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc7: f64 = real_value 10e-1
// CHECK:STDOUT: return %.loc7
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %x: i32 = var
// CHECK:STDOUT: %.loc13: f64 = call @Foo()
// CHECK:STDOUT: assign %x, <error>
// CHECK:STDOUT: return
// CHECK:STDOUT: }
+20
View File
@@ -77,3 +77,23 @@ fn Main() {
// CHECK:STDOUT: node+8,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Echo
// CHECK:STDOUT: %.loc11 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: i32) -> i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return %a
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %b: i32 = var
// CHECK:STDOUT: %.loc12_21.1: i32 = int_value 1
// CHECK:STDOUT: %.loc12_21.2: i32 = stub_reference %.loc12_21.1
// CHECK:STDOUT: %.loc12_20: i32 = call @Echo(%.loc12_21.2)
// CHECK:STDOUT: assign %b, %.loc12_20
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -113,3 +113,32 @@ fn Main() {
// CHECK:STDOUT: node+20,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc9 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32, %b: i32, %c: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc11_7: i32 = int_value 1
// CHECK:STDOUT: %.loc11_11: i32 = int_value 2
// CHECK:STDOUT: %.loc11_9: i32 = add %.loc11_7, %.loc11_11
// CHECK:STDOUT: %.loc11_15: i32 = int_value 3
// CHECK:STDOUT: %.loc11_13.1: i32 = add %.loc11_9, %.loc11_15
// CHECK:STDOUT: %.loc11_13.2: i32 = stub_reference %.loc11_13.1
// CHECK:STDOUT: %.loc11_18: i32 = int_value 4
// CHECK:STDOUT: %.loc11_22: i32 = int_value 5
// CHECK:STDOUT: %.loc11_20.1: i32 = add %.loc11_18, %.loc11_22
// CHECK:STDOUT: %.loc11_20.2: i32 = stub_reference %.loc11_20.1
// CHECK:STDOUT: %.loc11_25.1: i32 = int_value 6
// CHECK:STDOUT: %.loc11_25.2: i32 = stub_reference %.loc11_25.1
// CHECK:STDOUT: %.loc11_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc11_6.2: () = call @Foo(%.loc11_13.2, %.loc11_20.2, %.loc11_25.2)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -73,3 +73,22 @@ fn Main() {
// CHECK:STDOUT: node+6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc9 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc10_7.1: i32 = int_value 1
// CHECK:STDOUT: %.loc10_7.2: i32 = stub_reference %.loc10_7.1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: () = call @Foo(%.loc10_7.2)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -84,3 +84,25 @@ fn Main() {
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc9 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc10_7.1: i32 = int_value 1
// CHECK:STDOUT: %.loc10_7.2: i32 = stub_reference %.loc10_7.1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: () = call @Foo(%.loc10_7.2)
// CHECK:STDOUT: %.loc11_7.1: i32 = int_value 1
// CHECK:STDOUT: %.loc11_7.2: i32 = stub_reference %.loc11_7.1
// CHECK:STDOUT: %.loc11_6: () = call @Foo(%.loc11_7.2)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -85,3 +85,24 @@ fn Main() {
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc9 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32, %b: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc10_7.1: i32 = int_value 1
// CHECK:STDOUT: %.loc10_7.2: i32 = stub_reference %.loc10_7.1
// CHECK:STDOUT: %.loc10_10.1: i32 = int_value 2
// CHECK:STDOUT: %.loc10_10.2: i32 = stub_reference %.loc10_10.1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: () = call @Foo(%.loc10_7.2, %.loc10_10.2)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -102,3 +102,29 @@ fn Main() {
// CHECK:STDOUT: node+16,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc9 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32, %b: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc10_7.1: i32 = int_value 1
// CHECK:STDOUT: %.loc10_7.2: i32 = stub_reference %.loc10_7.1
// CHECK:STDOUT: %.loc10_10.1: i32 = int_value 2
// CHECK:STDOUT: %.loc10_10.2: i32 = stub_reference %.loc10_10.1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: () = call @Foo(%.loc10_7.2, %.loc10_10.2)
// CHECK:STDOUT: %.loc11_7.1: i32 = int_value 1
// CHECK:STDOUT: %.loc11_7.2: i32 = stub_reference %.loc11_7.1
// CHECK:STDOUT: %.loc11_10.1: i32 = int_value 2
// CHECK:STDOUT: %.loc11_10.2: i32 = stub_reference %.loc11_10.1
// CHECK:STDOUT: %.loc11_6: () = call @Foo(%.loc11_7.2, %.loc11_10.2)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -54,3 +54,20 @@ fn Main() {
// CHECK:STDOUT: node+5,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc9 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: () = call @Foo()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -64,3 +64,23 @@ fn Main() {
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @MakeImplicitEmptyTuple
// CHECK:STDOUT: %.loc10 = fn_decl @Main
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @MakeImplicitEmptyTuple() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc11_11.1: type = tuple_type ()
// CHECK:STDOUT: %.loc11_11.2: () = tuple_value ()
// CHECK:STDOUT: %b: () = var
// CHECK:STDOUT: %.loc11_37: () = call @MakeImplicitEmptyTuple()
// CHECK:STDOUT: assign %b, %.loc11_37
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -48,3 +48,17 @@ fn G() { F(); }
// CHECK:STDOUT: node+4,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @F
// CHECK:STDOUT: %.loc9 = fn_decl @G
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @G() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc9_11.1: type = tuple_type ()
// CHECK:STDOUT: %.loc9_11.2: () = call @F()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -57,3 +57,12 @@ fn Bar(a: i32, a: i32) {}
// CHECK:STDOUT: node+5,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc13 = fn_decl @Bar
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Bar(%a.loc13_8: i32, %a.loc13_16: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -53,3 +53,24 @@ fn Baz() {}
// CHECK:STDOUT: node+5,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc8 = fn_decl @Bar
// CHECK:STDOUT: %.loc9 = fn_decl @Baz
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Bar() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Baz() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -46,3 +46,12 @@ fn Foo(a: i32) {}
// CHECK:STDOUT: node+3,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -46,3 +46,12 @@ fn Foo(a: i32,) {}
// CHECK:STDOUT: node+3,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -52,3 +52,12 @@ fn Foo(a: i32, b: i32) {}
// CHECK:STDOUT: node+5,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32, %b: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -52,3 +52,12 @@ fn Foo(a: i32, b: i32,) {}
// CHECK:STDOUT: node+5,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32, %b: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -35,3 +35,12 @@ fn Foo() {}
// CHECK:STDOUT: node+1,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -64,3 +64,18 @@ fn Bar(a: i32) {}
// CHECK:STDOUT: node+7,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
// CHECK:STDOUT:
// CHECK:STDOUT: package {
// CHECK:STDOUT: %.loc7 = fn_decl @Foo
// CHECK:STDOUT: %.loc8 = fn_decl @Bar
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Foo(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Bar(%a: i32) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }