|
| 1 | +// RUN: %target-sil-opt -enable-sil-verify-all -sil-print-debuginfo -sroa %s | %FileCheck --check-prefix=CHECK-SROA %s |
| 2 | +// RUN: %target-sil-opt -enable-sil-verify-all -sil-print-debuginfo -sroa -mem2reg %s -o %t.sil |
| 3 | +// RUN: %FileCheck --check-prefix=CHECK-MEM2REG %s --input-file=%t.sil |
| 4 | +// RUN: %target-swiftc_driver -Xfrontend -disable-debugger-shadow-copies -g -emit-ir %t.sil | %FileCheck --check-prefix=CHECK-IR %s |
| 5 | +// RUN: %target-swiftc_driver -Xfrontend -disable-debugger-shadow-copies -g -c %t.sil -o %t.o |
| 6 | +// RUN: %llvm-dwarfdump --debug-info %t.o | %FileCheck --check-prefix=CHECK-DWARF %s |
| 7 | +sil_stage canonical |
| 8 | + |
| 9 | +import Builtin |
| 10 | +import Swift |
| 11 | + |
| 12 | +sil_scope 2 { loc "sroa.swift":1:6 parent @foo : $@convention(thin) (Int, Int) -> Int } |
| 13 | +sil_scope 3 { loc "sroa.swift":2:7 parent 2 } |
| 14 | +sil_scope 4 { loc "sroa.swift":2:16 parent 2 } |
| 15 | + |
| 16 | +// foo(in_x:in_y:), loc "sroa.swift":1:6, scope 2 |
| 17 | +sil hidden @foo : $@convention(thin) (Int, Int) -> Int { |
| 18 | +bb0(%0 : $Int, %1 : $Int): |
| 19 | + debug_value %0 : $Int, let, name "in_x", argno 1, loc "sroa.swift":1:10, scope 2 |
| 20 | + debug_value %1 : $Int, let, name "in_y", argno 2, loc "sroa.swift":1:21, scope 2 |
| 21 | + |
| 22 | + %4 = alloc_stack $(x: Int, y: Int), var, name "my_tup", loc "sroa.swift":2:7, scope 3 |
| 23 | + // Make sure SROA propagate the debug info to the splitted alloc_stack instructions |
| 24 | + // CHECK-SROA: alloc_stack $Builtin.Int64, var |
| 25 | + // CHECK-SROA-SAME: (name "my_tup", loc "sroa.swift":2:7 |
| 26 | + // CHECK-SROA-SAME: type $*(x: Int, y: Int), expr op_tuple_fragment:$(x: Int, y: Int):0:op_fragment:#Int._value |
| 27 | + // CHECK-SROA-SAME: loc * "<compiler-generated>":0:0 |
| 28 | + // CHECK-SROA: alloc_stack $Builtin.Int64, var |
| 29 | + // CHECK-SROA-SAME: (name "my_tup", loc "sroa.swift":2:7 |
| 30 | + // CHECK-SROA-SAME: type $*(x: Int, y: Int), expr op_tuple_fragment:$(x: Int, y: Int):1:op_fragment:#Int._value |
| 31 | + // CHECK-SROA-SAME: loc * "<compiler-generated>":0:0 |
| 32 | + |
| 33 | + // Make sure the struct fields' SSA values are properly connected to the source variables via op_fragment |
| 34 | + %5 = tuple_element_addr %4 : $*(x: Int, y: Int), 0, loc "sroa.swift":2:16, scope 4 |
| 35 | + %6 = tuple_element_addr %4 : $*(x: Int, y: Int), 1, loc "sroa.swift":2:16, scope 4 |
| 36 | + %7 = integer_literal $Builtin.Int64, 0, loc "sroa.swift":2:20, scope 4 |
| 37 | + %8 = struct $Int (%7 : $Builtin.Int64), loc "sroa.swift":2:20, scope 4 |
| 38 | + // CHECK-MEM2REG: %[[FIELD_X:[0-9]+]] = struct_extract %[[INT_X:[0-9]+]] : $Int, #Int._value, loc "sroa.swift":2:20 |
| 39 | + // CHECK-MEM2REG: debug_value %[[FIELD_X]] : $Builtin.Int64, var, (name "my_tup", loc "sroa.swift":2:7, scope 3), type $*(x: Int, y: Int), expr op_tuple_fragment:$(x: Int, y: Int):0:op_fragment:#Int._value |
| 40 | + store %8 to %5 : $*Int, loc "sroa.swift":2:20, scope 4 |
| 41 | + %10 = integer_literal $Builtin.Int64, 0, loc "sroa.swift":2:26, scope 4 |
| 42 | + %11 = struct $Int (%10 : $Builtin.Int64), loc "sroa.swift":2:26, scope 4 |
| 43 | + // CHECK-MEM2REG: %[[FIELD_Y:[0-9]+]] = struct_extract %[[INT_Y:[0-9]+]] : $Int, #Int._value, loc "sroa.swift":2:26 |
| 44 | + // CHECK-MEM2REG: debug_value %[[FIELD_Y]] : $Builtin.Int64, var, (name "my_tup", loc "sroa.swift":2:7, scope 3), type $*(x: Int, y: Int), expr op_tuple_fragment:$(x: Int, y: Int):1:op_fragment:#Int._value |
| 45 | + store %11 to %6 : $*Int, loc "sroa.swift":2:26, scope 4 |
| 46 | + |
| 47 | + %14 = tuple_element_addr %4 : $*(x: Int, y: Int), 0, loc "sroa.swift":3:12, scope 3 |
| 48 | + store %0 to %14 : $*Int, loc "sroa.swift":3:12, scope 3 |
| 49 | + %18 = tuple_element_addr %4 : $*(x: Int, y: Int), 1, loc "sroa.swift":4:12, scope 3 |
| 50 | + store %1 to %18 : $*Int, loc "sroa.swift":4:12, scope 3 |
| 51 | + |
| 52 | + // CHECK-IR: call void @llvm.dbg.value(metadata i64 %0 |
| 53 | + // CHECK-IR-SAME: metadata ![[MY_TUP_MD:[0-9]+]] |
| 54 | + // CHECK-IR-SAME: !DIExpression(DW_OP_LLVM_fragment, 0, 64) |
| 55 | + // CHECK-IR: call void @llvm.dbg.value(metadata i64 %1 |
| 56 | + // CHECK-IR-SAME: metadata ![[MY_TUP_MD]] |
| 57 | + // CHECK-IR-SAME: !DIExpression(DW_OP_LLVM_fragment, 64, 64) |
| 58 | + |
| 59 | + // CHECK-IR: call void @llvm.dbg.value(metadata i64 %0, metadata ![[ARG1_MD:[0-9]+]] |
| 60 | + // CHECK-IR: call void @llvm.dbg.value(metadata i64 %1, metadata ![[ARG2_MD:[0-9]+]] |
| 61 | + |
| 62 | + dealloc_stack %4 : $*(x: Int, y: Int), loc "sroa.swift":2:7, scope 3 |
| 63 | + return %0 : $Int, loc "sroa.swift":5:3, scope 3 |
| 64 | +} // end sil function 'foo' |
| 65 | + |
| 66 | + |
| 67 | +// CHECK-IR: ![[ARG1_MD]] = !DILocalVariable(name: "in_x", arg: 1 |
| 68 | +// CHECK-IR-SAME: line: 1 |
| 69 | +// CHECK-IR: ![[ARG2_MD]] = !DILocalVariable(name: "in_y", arg: 2 |
| 70 | +// CHECK-IR-SAME: line: 1 |
| 71 | + |
| 72 | +// CHECK-IR: ![[MY_TUP_MD]] = !DILocalVariable(name: "my_tup" |
| 73 | +// CHECK-IR-SAME: line: 2 |
| 74 | + |
| 75 | +// CHECK-DWARF-LABEL: DW_AT_name ("foo") |
| 76 | +// CHECK-DWARF: DW_TAG_variable |
| 77 | +// CHECK-DWARF: DW_AT_name ("my_tup") |
| 78 | +// Shouldn't be marked artificial |
| 79 | +// CHECK-DWARF-NOT: DW_AT_artificial (true) |
| 80 | +// CHECK-DWARF: DW_TAG_{{.*}} |
0 commit comments