diff --git a/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp b/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp --- a/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp +++ b/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp @@ -477,6 +477,17 @@ GlobalOp op = b.create( UnknownLoc::get(context), type, GV->isConstant(), convertLinkageFromLLVM(GV->getLinkage()), GV->getName(), valueAttr); + + // Process alignment + llvm::MaybeAlign maybe_align = GV->getAlign(); + if (maybe_align.hasValue()) { + llvm::Align align = maybe_align.getValue(); + uint64_t align_value = align.value(); + IntegerAttr alignment = + b.getIntegerAttr(IntegerType::get(context, 64), align_value); + op->setAttr(b.getIdentifier("align"), alignment); + } + if (GV->hasInitializer() && !valueAttr) { Region &r = op.getInitializerRegion(); currentEntryBlock = b.createBlock(&r); @@ -486,6 +497,7 @@ return nullptr; b.create(op.getLoc(), ArrayRef({v})); } + return globals[GV] = op; } diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -403,6 +403,20 @@ anyExternalLinkage ? nullptr : cst, op.sym_name(), /*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal, addrSpace); + // Passing alignment, if it is specified + Attribute raw_align_attr = op->getAttr("align"); + if (raw_align_attr) { + if (!raw_align_attr.isa()) { + return emitError(op.getLoc(), + "alignment constant should be an integer"); + } + IntegerAttr align_attr = raw_align_attr.cast(); + APInt x = align_attr.getValue(); + // Get value as unsigned, failing otherwise + uint64_t alignment = x.getZExtValue(); + var->setAlignment(llvm::MaybeAlign(alignment)); + } + globalsMapping.try_emplace(op, var); } diff --git a/mlir/test/Dialect/LLVMIR/global.mlir b/mlir/test/Dialect/LLVMIR/global.mlir --- a/mlir/test/Dialect/LLVMIR/global.mlir +++ b/mlir/test/Dialect/LLVMIR/global.mlir @@ -9,6 +9,12 @@ // CHECK: llvm.mlir.global internal @global(42 : i64) : i64 llvm.mlir.global internal @global(42 : i64) : i64 +// CHECK: llvm.mlir.global private @aligned_global(42 : i64) {align = 64 : i64} : i64 +llvm.mlir.global private @aligned_global(42 : i64) {align = 64 : i64} : i64 + +// CHECK: llvm.mlir.global private constant @aligned_global_const(42 : i64) {align = 32 : i32} : i64 +llvm.mlir.global private constant @aligned_global_const(42 : i64) {align = 32 : i32} : i64 + // CHECK: llvm.mlir.global internal constant @constant(3.700000e+01 : f64) : f32 llvm.mlir.global internal constant @constant(37.0) : f32 diff --git a/mlir/test/Target/LLVMIR/import.ll b/mlir/test/Target/LLVMIR/import.ll --- a/mlir/test/Target/LLVMIR/import.ll +++ b/mlir/test/Target/LLVMIR/import.ll @@ -3,9 +3,9 @@ %struct.t = type {} %struct.s = type { %struct.t, i64 } -; CHECK: llvm.mlir.global external @g1() : !llvm.struct<"struct.s", (struct<"struct.t", ()>, i64)> +; CHECK: llvm.mlir.global external @g1() {align = 8 : i64} : !llvm.struct<"struct.s", (struct<"struct.t", ()>, i64)> @g1 = external global %struct.s, align 8 -; CHECK: llvm.mlir.global external @g2() : f64 +; CHECK: llvm.mlir.global external @g2() {align = 8 : i64} : f64 @g2 = external global double, align 8 ; CHECK: llvm.mlir.global internal @g3("string") @g3 = internal global [6 x i8] c"string" @@ -13,6 +13,12 @@ ; CHECK: llvm.mlir.global external @g5() : vector<8xi32> @g5 = external global <8 x i32> +; CHECK: llvm.mlir.global private @alig32(42 : i64) {align = 32 : i64} : i64 +@alig32 = private global i64 42, align 32 + +; CHECK: llvm.mlir.global private @alig64(42 : i64) {align = 64 : i64} : i64 +@alig64 = private global i64 42, align 64 + @g4 = external global i32, align 8 ; CHECK: llvm.mlir.global internal constant @int_gep() : !llvm.ptr { ; CHECK-DAG: %[[addr:[0-9]+]] = llvm.mlir.addressof @g4 : !llvm.ptr diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir --- a/mlir/test/Target/LLVMIR/llvmir.mlir +++ b/mlir/test/Target/LLVMIR/llvmir.mlir @@ -1,5 +1,11 @@ // RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s +// CHECK: @global_aligned32 = private global i64 42, align 32 +"llvm.mlir.global"() ({}) {sym_name = "global_aligned32", type = i64, value = 42 : i64, linkage = 0, align = 32} : () -> () + +// CHECK: @global_aligned64 = private global i64 42, align 64 +llvm.mlir.global private @global_aligned64(42 : i64) {align = 64 : i64} : i64 + // CHECK: @i32_global = internal global i32 42 llvm.mlir.global internal @i32_global(42: i32) : i32 @@ -1508,3 +1514,4 @@ // CHECK: ![[PIPELINE_DISABLE_NODE]] = !{!"llvm.loop.pipeline.disable", i1 true} // CHECK: ![[II_NODE]] = !{!"llvm.loop.pipeline.initiationinterval", i32 2} // CHECK: ![[ACCESS_GROUPS_NODE]] = !{![[GROUP_NODE1]], ![[GROUP_NODE2]]} +