xref: /llvm-project/mlir/test/Dialect/LLVMIR/global.mlir (revision cd12ffb622df5392020d0793e3fff7c3bf8385a2)
1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s
2
3// CHECK: llvm.mlir.global external @default_external
4llvm.mlir.global @default_external() : i64
5
6// CHECK: llvm.mlir.global external constant @default_external_constant
7llvm.mlir.global constant @default_external_constant(42) : i64
8
9// CHECK: llvm.mlir.global internal @global(42 : i64) {addr_space = 0 : i32} : i64
10llvm.mlir.global internal @global(42 : i64) : i64
11
12// CHECK: llvm.mlir.global private @aligned_global(42 : i64) {addr_space = 0 : i32, aligned = 64 : i64} : i64
13llvm.mlir.global private @aligned_global(42 : i64) {aligned = 64} : i64
14
15// CHECK: llvm.mlir.global private constant @aligned_global_const(42 : i64) {addr_space = 0 : i32, aligned = 32 : i64} : i64
16llvm.mlir.global private constant @aligned_global_const(42 : i64) {aligned = 32} : i64
17
18// CHECK: llvm.mlir.global internal constant @constant(3.700000e+01 : f64) {addr_space = 0 : i32} : f32
19llvm.mlir.global internal constant @constant(37.0) : f32
20
21// CHECK: llvm.mlir.global internal constant @".string"("foobar")
22llvm.mlir.global internal constant @".string"("foobar") : !llvm.array<6 x i8>
23
24// CHECK: llvm.mlir.global internal @string_notype("1234567")
25llvm.mlir.global internal @string_notype("1234567")
26
27// CHECK: llvm.mlir.global internal @global_undef()
28llvm.mlir.global internal @global_undef() : i64
29
30// CHECK: llvm.mlir.global internal @global_mega_initializer() {addr_space = 0 : i32} : i64 {
31// CHECK-NEXT:  %[[c:[0-9]+]] = llvm.mlir.constant(42 : i64) : i64
32// CHECK-NEXT:  llvm.return %[[c]] : i64
33// CHECK-NEXT: }
34llvm.mlir.global internal @global_mega_initializer() : i64 {
35  %c = llvm.mlir.constant(42 : i64) : i64
36  llvm.return %c : i64
37}
38
39// Check different linkage types.
40// CHECK: llvm.mlir.global private
41llvm.mlir.global private @private() : i64
42// CHECK: llvm.mlir.global internal
43llvm.mlir.global internal @internal() : i64
44// CHECK: llvm.mlir.global available_externally
45llvm.mlir.global available_externally @available_externally() : i64
46// CHECK: llvm.mlir.global linkonce
47llvm.mlir.global linkonce @linkonce() : i64
48// CHECK: llvm.mlir.global weak
49llvm.mlir.global weak @weak() : i64
50// CHECK: llvm.mlir.global common
51llvm.mlir.global common @common() : i64
52// CHECK: llvm.mlir.global appending
53llvm.mlir.global appending @appending() : !llvm.array<2 x i64>
54// CHECK: llvm.mlir.global extern_weak
55llvm.mlir.global extern_weak @extern_weak() : i64
56// CHECK: llvm.mlir.global linkonce_odr
57llvm.mlir.global linkonce_odr @linkonce_odr() : i64
58// CHECK: llvm.mlir.global weak_odr
59llvm.mlir.global weak_odr @weak_odr() : i64
60// CHECK: llvm.mlir.global external @has_thr_local(42 : i64) {addr_space = 0 : i32, thr_local} : i64
61llvm.mlir.global external @has_thr_local(42 : i64) {thr_local} : i64
62// CHECK: llvm.mlir.global external @has_dso_local(42 : i64) {addr_space = 0 : i32, dso_local} : i64
63llvm.mlir.global external @has_dso_local(42 : i64) {dso_local} : i64
64// CHECK: llvm.mlir.global external @has_addr_space(32 : i64) {addr_space = 3 : i32} : i64
65llvm.mlir.global external @has_addr_space(32 : i64) {addr_space = 3: i32} : i64
66
67// CHECK: llvm.comdat @__llvm_comdat
68llvm.comdat @__llvm_comdat {
69  // CHECK: llvm.comdat_selector @any any
70  llvm.comdat_selector @any any
71}
72// CHECK: llvm.mlir.global external @any() comdat(@__llvm_comdat::@any) {addr_space = 1 : i32} : i64
73llvm.mlir.global @any() comdat(@__llvm_comdat::@any) {addr_space = 1 : i32} : i64
74
75// CHECK-LABEL: references
76func.func @references() {
77  // CHECK: llvm.mlir.addressof @".string" : !llvm.ptr
78  %0 = llvm.mlir.addressof @".string" : !llvm.ptr
79
80  // CHECK: llvm.mlir.addressof @global : !llvm.ptr
81  %1 = llvm.mlir.addressof @global : !llvm.ptr
82
83  // CHECK: llvm.mlir.addressof @has_addr_space : !llvm.ptr<3>
84  %2 = llvm.mlir.addressof @has_addr_space : !llvm.ptr<3>
85
86  llvm.return
87}
88
89// CHECK: llvm.mlir.global private local_unnamed_addr constant @local(42 : i64) {addr_space = 0 : i32} : i64
90llvm.mlir.global private local_unnamed_addr constant @local(42 : i64) : i64
91
92// CHECK: llvm.mlir.global private unnamed_addr constant @foo(42 : i64) {addr_space = 0 : i32} : i64
93llvm.mlir.global private unnamed_addr constant @foo(42 : i64) : i64
94
95// CHECK: llvm.mlir.global internal constant @sectionvar("teststring") {addr_space = 0 : i32, section = ".mysection"}
96llvm.mlir.global internal constant @sectionvar("teststring")  {section = ".mysection"}: !llvm.array<10 x i8>
97
98// CHECK: llvm.mlir.global internal thread_local constant @thread_local(42 : i32)
99llvm.mlir.global internal thread_local constant @thread_local(42 : i32) : i32
100
101// Visibility types.
102// CHECK: llvm.mlir.global internal hidden constant @hidden(42 : i32)
103llvm.mlir.global internal hidden constant @hidden(42 : i32) : i32
104
105// CHECK: llvm.mlir.global internal protected unnamed_addr @protected(42 : i32)
106llvm.mlir.global internal protected unnamed_addr @protected(42 : i32) : i32
107
108// -----
109
110// expected-error @+1 {{op requires attribute 'sym_name'}}
111"llvm.mlir.global"() ({}) {linkage = #llvm.linkage<private>, type = i64, constant, global_type = i64, value = 42 : i64} : () -> ()
112
113// -----
114
115// expected-error @+1 {{requires attribute 'global_type'}}
116"llvm.mlir.global"() ({}) {sym_name = "foo", constant, value = 42 : i64} : () -> ()
117
118// -----
119
120// expected-error @+1 {{expects type to be a valid element type for an LLVM global}}
121llvm.mlir.global internal constant @constant(37.0) : !llvm.label
122
123// -----
124// expected-error @+1 {{'addr_space' failed to satisfy constraint: 32-bit signless integer attribute whose value is non-negative}}
125"llvm.mlir.global"() ({}) {sym_name = "foo", global_type = i64, value = 42 : i64, addr_space = -1 : i32, linkage = #llvm.linkage<private>} : () -> ()
126
127// -----
128
129// expected-error @+1 {{'addr_space' failed to satisfy constraint: 32-bit signless integer attribute whose value is non-negative}}
130"llvm.mlir.global"() ({}) {sym_name = "foo", global_type = i64, value = 42 : i64, addr_space = 1.0 : f32, linkage = #llvm.linkage<private>} : () -> ()
131
132// -----
133
134func.func @foo() {
135  // expected-error @+1 {{op symbol's parent must have the SymbolTable trait}}
136  llvm.mlir.global internal @bar(42) : i32
137
138  return
139}
140
141// -----
142
143// expected-error @+1 {{requires an i8 array type of the length equal to that of the string}}
144llvm.mlir.global internal constant @string("foobar") : !llvm.array<42 x i8>
145
146// -----
147
148// expected-error @+1 {{type can only be omitted for string globals}}
149llvm.mlir.global internal @i64_needs_type(0: i64)
150
151// -----
152
153// expected-error @+1 {{expected zero or one type}}
154llvm.mlir.global internal @more_than_one_type(0) : i64, i32
155
156// -----
157
158llvm.mlir.global internal @foo(0: i32) : i32
159
160func.func @bar() {
161  // expected-error @+1{{expected ':'}}
162  llvm.mlir.addressof @foo
163}
164
165// -----
166
167func.func @foo() {
168  // The attribute parser will consume the first colon-type, so we put two of
169  // them to trigger the attribute type mismatch error.
170  // expected-error @+1 {{invalid kind of attribute specified}}
171  llvm.mlir.addressof "foo" : i64 : !llvm.ptr
172  llvm.return
173}
174
175// -----
176
177func.func @foo() {
178  // expected-error @+1 {{must reference a global defined by 'llvm.mlir.global'}}
179  llvm.mlir.addressof @foo : !llvm.ptr
180  llvm.return
181}
182
183// -----
184
185// expected-error @+2 {{block with no terminator}}
186llvm.mlir.global internal @g() : i64 {
187  %c = llvm.mlir.constant(42 : i64) : i64
188}
189
190// -----
191
192// expected-error @+1 {{'llvm.mlir.global' op initializer region type 'i64' does not match global type 'i32'}}
193llvm.mlir.global internal @g() : i32 {
194  %c = llvm.mlir.constant(42 : i64) : i64
195  llvm.return %c : i64
196}
197
198// -----
199
200// expected-error @+1 {{'llvm.mlir.global' op cannot have both initializer value and region}}
201llvm.mlir.global internal @g(43 : i64) : i64 {
202  %c = llvm.mlir.constant(42 : i64) : i64
203  llvm.return %c : i64
204}
205
206// -----
207
208llvm.mlir.global internal @g(32 : i64) {addr_space = 3: i32} : i64
209func.func @mismatch_addr_space_implicit_global() {
210  // expected-error @+1 {{pointer address space must match address space of the referenced global}}
211  llvm.mlir.addressof @g : !llvm.ptr
212  llvm.return
213}
214
215// -----
216
217llvm.mlir.global internal @g(32 : i64) {addr_space = 3: i32} : i64
218
219func.func @mismatch_addr_space() {
220  // expected-error @+1 {{pointer address space must match address space of the referenced global}}
221  llvm.mlir.addressof @g : !llvm.ptr<4>
222  llvm.return
223}
224
225// -----
226
227llvm.func @ctor() {
228  llvm.return
229}
230
231// CHECK: llvm.mlir.global_ctors {ctors = [@ctor], priorities = [0 : i32]}
232llvm.mlir.global_ctors { ctors = [@ctor], priorities = [0 : i32]}
233
234// -----
235
236llvm.func @dtor() {
237  llvm.return
238}
239
240// CHECK: llvm.mlir.global_dtors {dtors = [@dtor], priorities = [0 : i32]}
241llvm.mlir.global_dtors { dtors = [@dtor], priorities = [0 : i32]}
242
243// -----
244
245// CHECK: llvm.mlir.global external @target_ext() {addr_space = 0 : i32} : !llvm.target<"spirv.Image", i32, 0>
246llvm.mlir.global @target_ext() : !llvm.target<"spirv.Image", i32, 0>
247
248// CHECK:       llvm.mlir.global external @target_ext_init() {addr_space = 0 : i32} : !llvm.target<"spirv.Image", i32, 0>
249// CHECK-NEXT:    %0 = llvm.mlir.zero : !llvm.target<"spirv.Image", i32, 0>
250// CHECK-NEXT:    llvm.return %0 : !llvm.target<"spirv.Image", i32, 0>
251// CHECK-NEXT:  }
252llvm.mlir.global @target_ext_init() : !llvm.target<"spirv.Image", i32, 0> {
253  %0 = llvm.mlir.zero : !llvm.target<"spirv.Image", i32, 0>
254  llvm.return %0 : !llvm.target<"spirv.Image", i32, 0>
255}
256
257// -----
258
259// expected-error @+1 {{global with target extension type can only be initialized with zero-initializer}}
260llvm.mlir.global @target_fail(0 : i64) : !llvm.target<"spirv.Image", i32, 0>
261
262// -----
263
264// CHECK-DAG: #[[TYPE:.*]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "uint64_t", sizeInBits = 64, encoding = DW_ATE_unsigned>
265// CHECK-DAG: #[[FILE:.*]] = #llvm.di_file<"not" in "existence">
266// CHECK-DAG: #[[CU:.*]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], producer = "MLIR", isOptimized = true, emissionKind = Full>
267// CHECK-DAG: #[[GVAR0:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_1", linkageName = "global_with_expr_1", file = #[[FILE]], line = 370, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8>
268// CHECK-DAG: #[[GVAR1:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_2", linkageName = "global_with_expr_2", file = #[[FILE]], line = 371, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8>
269// CHECK-DAG: #[[GVAR2:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_3", linkageName = "global_with_expr_3", file = #[[FILE]], line = 372, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8>
270// CHECK-DAG: #[[GVAR3:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_4", linkageName = "global_with_expr_4", file = #[[FILE]], line = 373, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8>
271// CHECK-DAG: #[[EXPR0:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR0]], expr = <>>
272// CHECK-DAG: #[[EXPR1:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR1]], expr = <[DW_OP_push_object_address, DW_OP_deref]>>
273// CHECK-DAG: #[[EXPR2:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR2]], expr = <[DW_OP_LLVM_arg(0), DW_OP_LLVM_arg(1), DW_OP_plus]>>
274// CHECK-DAG: #[[EXPR3:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR3]], expr = <[DW_OP_LLVM_convert(16, DW_ATE_signed)]>>
275// CHECK-DAG:   llvm.mlir.global external @global_with_expr1() {addr_space = 0 : i32, dbg_expr = [#[[EXPR0]]]} : i64
276// CHECK-DAG:   llvm.mlir.global external @global_with_expr2() {addr_space = 0 : i32, dbg_expr = [#[[EXPR1]]]} : i64
277// CHECK-DAG:   llvm.mlir.global external @global_with_expr3() {addr_space = 0 : i32, dbg_expr = [#[[EXPR2]]]} : i64
278// CHECK-DAG:   llvm.mlir.global external @global_with_expr4() {addr_space = 0 : i32, dbg_expr = [#[[EXPR3]]]} : i64
279
280#di_file = #llvm.di_file<"not" in "existence">
281#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file, producer = "MLIR", isOptimized = true, emissionKind = Full>
282#di_basic_type = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "uint64_t", sizeInBits = 64, encoding = DW_ATE_unsigned>
283llvm.mlir.global external @global_with_expr1() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_1", linkageName = "global_with_expr_1", file = #di_file, line = 370, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <>>]} : i64
284llvm.mlir.global external @global_with_expr2() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_2", linkageName = "global_with_expr_2", file = #di_file, line = 371, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <[DW_OP_push_object_address, DW_OP_deref]>>]} : i64
285llvm.mlir.global external @global_with_expr3() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_3", linkageName = "global_with_expr_3", file = #di_file, line = 372, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <[DW_OP_LLVM_arg(0), DW_OP_LLVM_arg(1), DW_OP_plus]>>]} : i64
286llvm.mlir.global external @global_with_expr4() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_4", linkageName = "global_with_expr_4", file = #di_file, line = 373, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <[DW_OP_LLVM_convert(16, DW_ATE_signed)]>>]} : i64
287