xref: /llvm-project/mlir/test/Target/LLVMIR/Import/global-variables.ll (revision cd12ffb622df5392020d0793e3fff7c3bf8385a2)
1; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
2
3%sub_struct = type {}
4%my_struct = type { %sub_struct, i64 }
5
6; CHECK:  llvm.mlir.global external @global_struct
7; CHECK-SAME:  {addr_space = 0 : i32, alignment = 8 : i64}
8; CHECK-SAME:  !llvm.struct<"my_struct", (struct<"sub_struct", ()>, i64)>
9@global_struct = external global %my_struct, align 8
10
11; CHECK:  llvm.mlir.global external @global_float
12; CHECK-SAME:  {addr_space = 0 : i32, alignment = 8 : i64} : f64
13@global_float = external global double, align 8
14
15; CHECK:  llvm.mlir.global internal constant @address_before
16; CHECK:  = llvm.mlir.addressof @global_int : !llvm.ptr
17@address_before = internal constant ptr @global_int
18
19; CHECK:  llvm.mlir.global external @global_int
20; CHECK-SAME:  {addr_space = 0 : i32, alignment = 8 : i64} : i32
21@global_int = external global i32, align 8
22
23; CHECK:  llvm.mlir.global internal constant @address_after
24; CHECK:  = llvm.mlir.addressof @global_int : !llvm.ptr
25@address_after = internal constant ptr @global_int
26
27; CHECK:  llvm.mlir.global internal @global_string("hello world")
28@global_string = internal global [11 x i8] c"hello world"
29
30; CHECK:  llvm.mlir.global external @global_vector
31; CHECK-SAME:  {addr_space = 0 : i32} : vector<8xi32>
32@global_vector = external global <8 x i32>
33
34; CHECK: llvm.mlir.global internal constant @global_gep_const_expr
35; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : !llvm.ptr {
36; CHECK-DAG:  %[[ADDR:[0-9]+]] = llvm.mlir.addressof @global_int : !llvm.ptr
37; CHECK-DAG:  %[[IDX:[0-9]+]] = llvm.mlir.constant(2 : i32) : i32
38; CHECK-DAG:  %[[GEP:[0-9]+]] = llvm.getelementptr %[[ADDR]][%[[IDX]]] : (!llvm.ptr, i32) -> !llvm.ptr
39; CHECK-DAG:  llvm.return %[[GEP]] : !llvm.ptr
40@global_gep_const_expr = internal constant ptr getelementptr (i32, ptr @global_int, i32 2)
41
42; // -----
43
44; Verifies that converting a reference to a global does not convert the global
45; a second time.
46
47; CHECK-LABEL: llvm.mlir.global external constant @reference
48; CHECK-NEXT: %[[ADDR:.*]] = llvm.mlir.addressof @simple
49; CHECK-NEXT: llvm.return %[[ADDR]]
50@reference = constant ptr @simple
51
52@simple = global { ptr } { ptr null }
53
54; // -----
55
56; CHECK-LABEL: llvm.mlir.global external @recursive
57; CHECK: %[[ADDR:.*]] = llvm.mlir.addressof @recursive
58; CHECK: llvm.return %[[ADDR]]
59@recursive = global ptr @recursive
60
61; // -----
62
63; alignment attribute.
64
65; CHECK:  llvm.mlir.global private @global_int_align_32
66; CHECK-SAME:  (42 : i64) {addr_space = 0 : i32, alignment = 32 : i64, dso_local} : i64
67@global_int_align_32 = private global i64 42, align 32
68
69; CHECK:  llvm.mlir.global private @global_int_align_64
70; CHECK-SAME:  (42 : i64) {addr_space = 0 : i32, alignment = 64 : i64, dso_local} : i64
71@global_int_align_64 = private global i64 42, align 64
72
73; // -----
74
75; dso_local attribute.
76
77%sub_struct = type {}
78%my_struct = type { %sub_struct, i64 }
79
80; CHECK:  llvm.mlir.global external @dso_local_var
81; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : !llvm.struct<"my_struct", (struct<"sub_struct", ()>, i64)>
82@dso_local_var = external dso_local global %my_struct
83
84; // -----
85
86; thread_local attribute.
87
88%sub_struct = type {}
89%my_struct = type { %sub_struct, i64 }
90
91; CHECK:  llvm.mlir.global external thread_local @thread_local_var
92; CHECK-SAME:  {addr_space = 0 : i32} : !llvm.struct<"my_struct", (struct<"sub_struct", ()>, i64)>
93@thread_local_var = external thread_local global %my_struct
94
95; // -----
96
97; addr_space attribute.
98
99; CHECK:  llvm.mlir.global external @addr_space_var
100; CHECK-SAME:  (0 : i32) {addr_space = 6 : i32} : i32
101@addr_space_var = addrspace(6) global i32 0
102
103; // -----
104
105; Linkage attributes.
106
107; CHECK:  llvm.mlir.global private @private
108; CHECK-SAME:  (42 : i32) {addr_space = 0 : i32, dso_local} : i32
109@private = private global i32 42
110
111; CHECK:  llvm.mlir.global internal @internal
112; CHECK-SAME:  (42 : i32) {addr_space = 0 : i32, dso_local} : i32
113@internal = internal global i32 42
114
115; CHECK:  llvm.mlir.global available_externally @available_externally
116; CHECK-SAME:  (42 : i32) {addr_space = 0 : i32}  : i32
117@available_externally = available_externally global i32 42
118
119; CHECK:  llvm.mlir.global linkonce @linkonce
120; CHECK-SAME:  (42 : i32) {addr_space = 0 : i32} : i32
121@linkonce = linkonce global i32 42
122
123; CHECK:  llvm.mlir.global weak @weak
124; CHECK-SAME:  (42 : i32) {addr_space = 0 : i32} : i32
125@weak = weak global i32 42
126
127; CHECK:  llvm.mlir.global common @common
128; CHECK-SAME:  (0 : i32) {addr_space = 0 : i32} : i32
129@common = common global i32 zeroinitializer
130
131; CHECK:  llvm.mlir.global appending @appending
132; CHECK-SAME:  (dense<[0, 1]> : tensor<2xi32>) {addr_space = 0 : i32} : !llvm.array<2 x i32>
133@appending = appending global [2 x i32] [i32 0, i32 1]
134
135; CHECK:  llvm.mlir.global extern_weak @extern_weak
136; CHECK-SAME:  {addr_space = 0 : i32} : i32
137@extern_weak = extern_weak global i32
138
139; CHECK:  llvm.mlir.global linkonce_odr @linkonce_odr
140; CHECK-SAME:  (42 : i32) {addr_space = 0 : i32} : i32
141@linkonce_odr = linkonce_odr global i32 42
142
143; CHECK:  llvm.mlir.global weak_odr @weak_odr
144; CHECK-SAME:  (42 : i32) {addr_space = 0 : i32} : i32
145@weak_odr = weak_odr global i32 42
146
147; CHECK:  llvm.mlir.global external @external
148; CHECK-SAME:  {addr_space = 0 : i32} : i32
149@external = external global i32
150
151; // -----
152
153; local_unnamed_addr and unnamed_addr attributes.
154
155; CHECK:  llvm.mlir.global private constant @no_unnamed_addr
156; CHECK-SAME:  (42 : i64) {addr_space = 0 : i32, dso_local} : i64
157@no_unnamed_addr = private constant i64 42
158
159; CHECK:  llvm.mlir.global private local_unnamed_addr constant @local_unnamed_addr
160; CHECK-SAME:  (42 : i64) {addr_space = 0 : i32, dso_local} : i64
161@local_unnamed_addr = private local_unnamed_addr constant i64 42
162
163; CHECK:  llvm.mlir.global private unnamed_addr constant @unnamed_addr
164; CHECK-SAME:  (42 : i64) {addr_space = 0 : i32, dso_local} : i64
165@unnamed_addr = private unnamed_addr constant i64 42
166
167; // -----
168
169; section attribute.
170
171; CHECK:  llvm.mlir.global internal constant @sectionvar("hello world")
172; CHECK-SAME:  {addr_space = 0 : i32, dso_local, section = ".mysection"}
173@sectionvar = internal constant [11 x i8] c"hello world", section ".mysection"
174
175; // -----
176
177; Sequential constants.
178
179; CHECK:  llvm.mlir.global internal constant @vector_constant
180; CHECK-SAME:  (dense<[1, 2]> : vector<2xi32>)
181; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : vector<2xi32>
182@vector_constant = internal constant <2 x i32> <i32 1, i32 2>
183
184; CHECK:  llvm.mlir.global internal constant @array_constant
185; CHECK-SAME:  (dense<[1.000000e+00, 2.000000e+00]> : tensor<2xf32>)
186; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : !llvm.array<2 x f32>
187@array_constant = internal constant [2 x float] [float 1., float 2.]
188
189; CHECK: llvm.mlir.global internal constant @nested_array_constant
190; CHECK-SAME-LITERAL:  (dense<[[1, 2], [3, 4]]> : tensor<2x2xi32>)
191; CHECK-SAME-LITERAL:  {addr_space = 0 : i32, dso_local} : !llvm.array<2 x array<2 x i32>>
192@nested_array_constant = internal constant [2 x [2 x i32]] [[2 x i32] [i32 1, i32 2], [2 x i32] [i32 3, i32 4]]
193
194; CHECK: llvm.mlir.global internal constant @nested_array_constant3
195; CHECK-SAME-LITERAL:  (dense<[[[1, 2], [3, 4]]]> : tensor<1x2x2xi32>)
196; CHECK-SAME-LITERAL:  {addr_space = 0 : i32, dso_local} : !llvm.array<1 x array<2 x array<2 x i32>>>
197@nested_array_constant3 = internal constant [1 x [2 x [2 x i32]]] [[2 x [2 x i32]] [[2 x i32] [i32 1, i32 2], [2 x i32] [i32 3, i32 4]]]
198
199; CHECK: llvm.mlir.global internal constant @nested_array_vector
200; CHECK-SAME-LITERAL:  (dense<[[[1, 2], [3, 4]]]> : vector<1x2x2xi32>)
201; CHECK-SAME-LITERAL:  {addr_space = 0 : i32, dso_local} : !llvm.array<1 x array<2 x vector<2xi32>>>
202@nested_array_vector = internal constant [1 x [2 x <2 x i32>]] [[2 x <2 x i32>] [<2 x i32> <i32 1, i32 2>, <2 x i32> <i32 3, i32 4>]]
203
204; CHECK:  llvm.mlir.global internal constant @vector_constant_zero
205; CHECK-SAME:  (dense<0> : vector<2xi24>)
206; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : vector<2xi24>
207@vector_constant_zero = internal constant <2 x i24> zeroinitializer
208
209; CHECK:  llvm.mlir.global internal constant @array_constant_zero
210; CHECK-SAME:  (dense<0.000000e+00> : tensor<2xbf16>)
211; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : !llvm.array<2 x bf16>
212@array_constant_zero = internal constant [2 x bfloat] zeroinitializer
213
214; CHECK: llvm.mlir.global internal constant @nested_array_constant3_zero
215; CHECK-SAME:  (dense<0> : tensor<1x2x2xi32>)
216; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : !llvm.array<1 x array<2 x array<2 x i32>>>
217@nested_array_constant3_zero = internal constant [1 x [2 x [2 x i32]]] zeroinitializer
218
219; CHECK: llvm.mlir.global internal constant @nested_array_vector_zero
220; CHECK-SAME:  (dense<0> : vector<1x2x2xi32>)
221; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : !llvm.array<1 x array<2 x vector<2xi32>>>
222@nested_array_vector_zero = internal constant [1 x [2 x <2 x i32>]] zeroinitializer
223
224; CHECK: llvm.mlir.global internal constant @nested_bool_array_constant
225; CHECK-SAME-LITERAL:  (dense<[[true, false]]> : tensor<1x2xi1>)
226; CHECK-SAME-LITERAL:  {addr_space = 0 : i32, dso_local} : !llvm.array<1 x array<2 x i1>>
227@nested_bool_array_constant = internal constant [1 x [2 x i1]] [[2 x i1] [i1 1, i1 0]]
228
229; CHECK: llvm.mlir.global internal constant @quad_float_constant
230; CHECK-SAME:  dense<[
231; CHECK-SAME:    529.340000000000031832314562052488327
232; CHECK-SAME:    529.340000000001850821718107908964157
233; CHECK-SAME:  ]> : vector<2xf128>)
234; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : vector<2xf128>
235@quad_float_constant = internal constant <2 x fp128> <fp128 0xLF000000000000000400808AB851EB851, fp128 0xLF000000000000000400808AB851EB852>
236
237; CHECK: llvm.mlir.global internal constant @quad_float_splat_constant
238; CHECK-SAME:  dense<529.340000000000031832314562052488327> : vector<2xf128>)
239; CHECK-SAME:  {addr_space = 0 : i32, dso_local} : vector<2xf128>
240@quad_float_splat_constant = internal constant <2 x fp128> <fp128 0xLF000000000000000400808AB851EB851, fp128 0xLF000000000000000400808AB851EB851>
241
242; // -----
243
244; CHECK: llvm.mlir.global_ctors {ctors = [@foo, @bar], priorities = [0 : i32, 42 : i32]}
245; CHECK: llvm.mlir.global_dtors {dtors = [@foo], priorities = [0 : i32]}
246@llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @foo, ptr null }, { i32, ptr, ptr } { i32 42, ptr @bar, ptr null }]
247@llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @foo, ptr null }]
248
249define void @foo() {
250  ret void
251}
252
253define void @bar() {
254  ret void
255}
256
257; // -----
258
259; Visibility attribute.
260
261; CHECK: llvm.mlir.global external hidden constant @hidden("string")
262@hidden = hidden constant [6 x i8] c"string"
263
264; CHECK: llvm.mlir.global external protected constant @protected(42 : i64)
265@protected = protected constant i64 42
266
267; // -----
268
269; CHECK-DAG: #[[TYPE:.*]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int", sizeInBits = 32, encoding = DW_ATE_signed>
270; CHECK-DAG: #[[FILE:.*]] = #llvm.di_file<"source.c" in "/path/to/file">
271; CHECK-DAG: #[[CU:.*]] = #llvm.di_compile_unit<id = distinct[{{.*}}]<>, sourceLanguage = DW_LANG_C99, file = #[[FILE]], isOptimized = false, emissionKind = None>
272; CHECK-DAG: #[[SPROG:.*]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, scope = #[[CU]], name = "foo", file = #[[FILE]], line = 5, subprogramFlags = Definition>
273; CHECK-DAG: #[[GVAR0:.*]] = #llvm.di_global_variable<scope = #[[SPROG]], name = "foo", linkageName = "foo", file = #[[FILE]], line = 7, type = #[[TYPE]], isLocalToUnit = true>
274; CHECK-DAG: #[[GVAR1:.*]] = #llvm.di_global_variable<scope = #[[SPROG]], name = "bar", linkageName = "bar", file = #[[FILE]], line = 8, type = #[[TYPE]], isLocalToUnit = true>
275; CHECK-DAG: #[[EXPR0:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR0]], expr = <[DW_OP_LLVM_fragment(0, 16)]>>
276; CHECK-DAG: #[[EXPR1:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR1]], expr = <[DW_OP_constu(3), DW_OP_plus]>>
277; CHECK-DAG: llvm.mlir.global external @foo() {addr_space = 0 : i32, alignment = 8 : i64, dbg_exprs = [#[[EXPR0]]]} : i32
278; CHECK-DAG: llvm.mlir.global external @bar() {addr_space = 0 : i32, alignment = 8 : i64, dbg_exprs = [#[[EXPR1]]]} : i32
279
280@foo = external global i32, align 8, !dbg !5
281@bar = external global i32, align 8, !dbg !7
282!0 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
283!1 = !DIFile(filename: "source.c", directory: "/path/to/file")
284!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1)
285!3 = distinct !DISubprogram(name: "foo", scope: !2, file: !1, line: 5)
286!4 = !DIGlobalVariable(name: "foo", linkageName: "foo", scope: !3, file: !1, line: 7, type: !0, isLocal: true, isDefinition: false)
287!5 = !DIGlobalVariableExpression(var: !4, expr: !DIExpression(DW_OP_LLVM_fragment, 0, 16))
288!6 = !DIGlobalVariable(name: "bar", linkageName: "bar", scope: !3, file: !1, line: 8, type: !0, isLocal: true, isDefinition: false)
289!7 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression(DW_OP_constu, 3, DW_OP_plus))
290!100 = !{i32 2, !"Debug Info Version", i32 3}
291!llvm.module.flags = !{!100}
292
293; // -----
294
295; Nameless and scopeless global variable.
296
297; CHECK-DAG: #[[FILE:.*]] = #llvm.di_file
298; CHECK-DAG: #[[COMPOSITE_TYPE:.*]] = #llvm.di_composite_type
299; CHECK-DAG: #[[GLOBAL_VAR:.*]] = #llvm.di_global_variable<file = #[[FILE]], line = 268, type = #[[COMPOSITE_TYPE]], isLocalToUnit = true, isDefined = true>
300; CHECK-DAG: #[[GLOBAL_VAR_EXPR:.*]] = #llvm.di_global_variable_expression<var = #[[GLOBAL_VAR]], expr = <>>
301
302; CHECK:  llvm.mlir.global private unnamed_addr constant @mlir.llvm.nameless_global_0("0\00")
303; We skip over @mlir.llvm.nameless_global.1 and 2 because they exist
304; CHECK:  llvm.mlir.global private unnamed_addr constant @mlir.llvm.nameless_global_3("1\00")
305;
306; CHECK:  llvm.mlir.global internal constant @zero() {addr_space = 0 : i32, dso_local} : !llvm.ptr {
307; CHECK:    llvm.mlir.addressof @mlir.llvm.nameless_global_0 : !llvm.ptr
308; CHECK:  llvm.mlir.global internal constant @one() {addr_space = 0 : i32, dso_local} : !llvm.ptr {
309; CHECK:    llvm.mlir.addressof @mlir.llvm.nameless_global_3 : !llvm.ptr
310
311; CHECK: llvm.mlir.global external constant @".str.1"() {addr_space = 0 : i32, dbg_exprs = [#[[GLOBAL_VAR_EXPR]]]}
312
313@0 = private unnamed_addr constant [2 x i8] c"0\00"
314@1 = private unnamed_addr constant [2 x i8] c"1\00"
315@zero = internal constant ptr @0
316@one = internal constant ptr @1
317
318@"mlir.llvm.nameless_global_1" = external constant [10 x i8], !dbg !0
319declare void @"mlir.llvm.nameless_global_2"()
320
321@.str.1 = external constant [10 x i8], !dbg !0
322
323!llvm.module.flags = !{!7}
324
325!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
326!1 = distinct !DIGlobalVariable(scope: null, file: !2, line: 268, type: !3, isLocal: true, isDefinition: true)
327!2 = !DIFile(filename: "source.c", directory: "/path/to/file")
328!3 = !DICompositeType(tag: DW_TAG_array_type, baseType: !4, size: 80, elements: !6)
329!4 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !5)
330!5 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
331!6 = !{}
332!7 = !{i32 2, !"Debug Info Version", i32 3}
333
334; // -----
335
336; Verify that unnamed globals can also be referenced before they are defined.
337
338; CHECK:  llvm.mlir.global internal constant @reference()
339; CHECK:    llvm.mlir.addressof @mlir.llvm.nameless_global_0 : !llvm.ptr
340@reference = internal constant ptr @0
341
342; CHECK:  llvm.mlir.global private unnamed_addr constant @mlir.llvm.nameless_global_0("0\00")
343@0 = private unnamed_addr constant [2 x i8] c"0\00"
344