[Mlir-commits] [mlir] d4df382 - [mlir] don't drop undef initializers in translation to LLVM IR
Alex Zinenko
llvmlistbot at llvm.org
Fri Jul 9 08:52:50 PDT 2021
Author: Alex Zinenko
Date: 2021-07-09T17:52:43+02:00
New Revision: d4df3825bd32277074b3859f5dea9593139147fb
URL: https://github.com/llvm/llvm-project/commit/d4df3825bd32277074b3859f5dea9593139147fb
DIFF: https://github.com/llvm/llvm-project/commit/d4df3825bd32277074b3859f5dea9593139147fb.diff
LOG: [mlir] don't drop undef initializers in translation to LLVM IR
LLVM IR allows globals with external linkage to have initializers, including
undef. The translation was incorrectly using undef as a indicator that the
initializer should be ignored in translation, leading to the impossibility to
create an external global with an explicit undef initializer. Fix this and use
nullptr as a marker instead.
Reviewed By: wsmoses
Differential Revision: https://reviews.llvm.org/D105631
Added:
Modified:
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
mlir/test/Target/LLVMIR/llvmir.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 27f2e1e202523..5f39d52e03fc4 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -415,11 +415,13 @@ static Block &getModuleBody(Operation *module) {
}
/// A helper method to decide if a constant must not be set as a global variable
-/// initializer.
+/// initializer. For an external linkage variable, the variable with an
+/// initializer is considered externally visible and defined in this module, the
+/// variable without an initializer is externally available and is defined
+/// elsewhere.
static bool shouldDropGlobalInitializer(llvm::GlobalValue::LinkageTypes linkage,
llvm::Constant *cst) {
- return (linkage == llvm::GlobalVariable::ExternalLinkage &&
- isa<llvm::UndefValue>(cst)) ||
+ return (linkage == llvm::GlobalVariable::ExternalLinkage && !cst) ||
linkage == llvm::GlobalVariable::ExternalWeakLinkage;
}
@@ -436,7 +438,7 @@ static void addRuntimePreemptionSpecifier(bool dsoLocalRequested,
LogicalResult ModuleTranslation::convertGlobals() {
for (auto op : getModuleBody(mlirModule).getOps<LLVM::GlobalOp>()) {
llvm::Type *type = convertType(op.getType());
- llvm::Constant *cst = llvm::UndefValue::get(type);
+ llvm::Constant *cst = nullptr;
if (op.getValueOrNull()) {
// String attributes are treated separately because they cannot appear as
// in-function constants and are thus not supported by getLLVMConstant.
@@ -452,10 +454,18 @@ LogicalResult ModuleTranslation::convertGlobals() {
auto linkage = convertLinkageToLLVM(op.linkage());
auto addrSpace = op.addr_space();
+
+ // LLVM IR requires constant with linkage other than external or weak
+ // external to have initializers. If MLIR does not provide an initializer,
+ // default to undef.
+ bool dropInitializer = shouldDropGlobalInitializer(linkage, cst);
+ if (!dropInitializer && !cst)
+ cst = llvm::UndefValue::get(type);
+ else if (dropInitializer && cst)
+ cst = nullptr;
+
auto *var = new llvm::GlobalVariable(
- *llvmModule, type, op.constant(), linkage,
- shouldDropGlobalInitializer(linkage, cst) ? nullptr : cst,
- op.sym_name(),
+ *llvmModule, type, op.constant(), linkage, cst, op.sym_name(),
/*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal, addrSpace);
if (op.unnamed_addr().hasValue())
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 1c6339c1187fc..aa1c934c7bf21 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -36,6 +36,12 @@ llvm.mlir.global internal constant @string_const("foobar") : !llvm.array<6 x i8>
// CHECK: @int_global_undef = internal global i64 undef
llvm.mlir.global internal @int_global_undef() : i64
+// CHECK: @explicit_undef = global i32 undef
+llvm.mlir.global external @explicit_undef() : i32 {
+ %0 = llvm.mlir.undef : i32
+ llvm.return %0 : i32
+}
+
// CHECK: @int_gep = internal constant i32* getelementptr (i32, i32* @i32_global, i32 2)
llvm.mlir.global internal constant @int_gep() : !llvm.ptr<i32> {
%addr = llvm.mlir.addressof @i32_global : !llvm.ptr<i32>
More information about the Mlir-commits
mailing list