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