xref: /llvm-project/mlir/test/Dialect/LLVMIR/mem2reg-dbginfo.mlir (revision 220cdf940e953002df1521bbd061d8e0b4ffed5c)
1// RUN: mlir-opt %s --pass-pipeline='builtin.module(llvm.func(mem2reg{region-simplify=false}))' | FileCheck %s
2
3llvm.func @use(i64)
4llvm.func @use_ptr(!llvm.ptr)
5
6#di_basic_type = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "ptr sized type", sizeInBits = 64>
7#di_file = #llvm.di_file<"test.ll" in "">
8#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C_plus_plus_14, file = #di_file, producer = "clang", isOptimized = false, emissionKind = Full>
9#di_subprogram = #llvm.di_subprogram<compileUnit = #di_compile_unit, scope = #di_file, name = "blah", linkageName = "blah", file = #di_file, line = 7, subprogramFlags = Definition>
10// CHECK: #[[$VAR:.*]] = #llvm.di_local_variable<{{.*}}name = "ptr sized var"{{.*}}>
11#di_local_variable = #llvm.di_local_variable<scope = #di_subprogram, name = "ptr sized var", file = #di_file, line = 7, arg = 1, type = #di_basic_type>
12#di_local_variable_2 = #llvm.di_local_variable<scope = #di_subprogram, name = "ptr sized var 2", file = #di_file, line = 7, arg = 1, type = #di_basic_type>
13
14// CHECK-LABEL: llvm.func @basic_store_load
15llvm.func @basic_store_load(%arg0: i64) -> i64 {
16  %0 = llvm.mlir.constant(1 : i32) : i32
17  // CHECK-NOT: = llvm.alloca
18  %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
19  // CHECK-NOT: llvm.store
20  llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr
21  // CHECK-NOT: llvm.intr.dbg.declare
22  llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr
23  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[LOADED:.*]] : i64
24  // CHECK-NOT: llvm.intr.dbg.value
25  // CHECK-NOT: llvm.intr.dbg.declare
26  // CHECK-NOT: llvm.store
27  %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64
28  // CHECK: llvm.return %[[LOADED]] : i64
29  llvm.return %2 : i64
30}
31
32// CHECK-LABEL: llvm.func @multiple_store_load
33llvm.func @multiple_store_load(%arg0: i64) -> i64 {
34  %0 = llvm.mlir.constant(1 : i32) : i32
35  // CHECK-NOT: = llvm.alloca
36  %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
37  // CHECK-NOT: llvm.intr.dbg.declare
38  llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr
39  // CHECK-NOT: llvm.store
40  llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr
41  // CHECK-NOT: llvm.intr.dbg.declare
42  llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr
43  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[LOADED:.*]] : i64
44  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[LOADED]] : i64
45  // CHECK-NOT: llvm.intr.dbg.value
46  // CHECK-NOT: llvm.intr.dbg.declare
47  // CHECK-NOT: llvm.store
48  %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64
49  // CHECK: llvm.return %[[LOADED]] : i64
50  llvm.return %2 : i64
51}
52
53// CHECK-LABEL: llvm.func @block_argument_value
54// CHECK-SAME: (%[[ARG0:.*]]: i64, {{.*}})
55llvm.func @block_argument_value(%arg0: i64, %arg1: i1) -> i64 {
56  %0 = llvm.mlir.constant(1 : i32) : i32
57  // CHECK-NOT: = llvm.alloca
58  %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
59  // CHECK-NOT: llvm.intr.dbg.declare
60  llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr
61  llvm.cond_br %arg1, ^bb1, ^bb2
62// CHECK: ^{{.*}}:
63^bb1:
64  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[ARG0]]
65  // CHECK-NOT: llvm.intr.dbg.value
66  llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr
67  llvm.br ^bb2
68// CHECK: ^{{.*}}(%[[BLOCKARG:.*]]: i64):
69^bb2:
70  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[BLOCKARG]]
71  %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64
72  llvm.return %2 : i64
73}
74
75// CHECK-LABEL: llvm.func @double_block_argument_value
76// CHECK-SAME: (%[[ARG0:.*]]: i64, {{.*}})
77llvm.func @double_block_argument_value(%arg0: i64, %arg1: i1) -> i64 {
78  %0 = llvm.mlir.constant(1 : i32) : i32
79  // CHECK-NOT: = llvm.alloca
80  %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
81  // CHECK-NOT: llvm.intr.dbg.declare
82  llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr
83  llvm.cond_br %arg1, ^bb1, ^bb2
84// CHECK: ^{{.*}}(%[[BLOCKARG1:.*]]: i64):
85^bb1:
86  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[BLOCKARG1]]
87  %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64
88  llvm.call @use(%2) : (i64) -> ()
89  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[ARG0]]
90  llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr
91  llvm.br ^bb2
92  // CHECK-NOT: llvm.intr.dbg.value
93// CHECK: ^{{.*}}(%[[BLOCKARG2:.*]]: i64):
94^bb2:
95  // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[BLOCKARG2]]
96  llvm.br ^bb1
97}
98
99// CHECK-LABEL: llvm.func @always_drop_promoted_declare
100// CHECK: %[[UNDEF:.*]] = llvm.mlir.undef
101// CHECK-NOT: = llvm.alloca
102// CHECK-NOT: llvm.intr.dbg.declare
103// CHECK: llvm.intr.dbg.value #{{.*}} = %[[UNDEF]]
104llvm.func @always_drop_promoted_declare() {
105  %0 = llvm.mlir.constant(1 : i32) : i32
106  %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
107  llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr
108  llvm.intr.dbg.value #di_local_variable = %1 : !llvm.ptr
109  llvm.return
110}
111
112// CHECK-LABEL: llvm.func @keep_dbg_if_not_promoted
113llvm.func @keep_dbg_if_not_promoted() {
114  %0 = llvm.mlir.constant(1 : i32) : i32
115  // CHECK: %[[ALLOCA:.*]] = llvm.alloca
116  %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
117  // CHECK-NOT: = llvm.alloca
118  // CHECK-NOT: llvm.intr.dbg.declare
119  // CHECK: llvm.intr.dbg.declare #[[$VAR]] = %[[ALLOCA]]
120  // CHECK-NOT: = llvm.alloca
121  // CHECK-NOT: llvm.intr.dbg.declare
122  // CHECK: llvm.call @use_ptr(%[[ALLOCA]])
123  llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr
124  %2 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
125  llvm.intr.dbg.declare #di_local_variable_2 = %2 : !llvm.ptr
126  llvm.call @use_ptr(%1) : (!llvm.ptr) -> ()
127  llvm.return
128}
129