diff --git a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h --- a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h +++ b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h @@ -56,7 +56,8 @@ return nullptr; T translator(m, std::move(llvmModule)); - translator.convertGlobals(); + if (failed(translator.convertGlobals())) + return nullptr; if (failed(translator.convertFunctions())) return nullptr; @@ -87,7 +88,7 @@ static LogicalResult checkSupportedModuleOps(Operation *m); LogicalResult convertFunctions(); - void convertGlobals(); + LogicalResult convertGlobals(); LogicalResult convertOneFunction(LLVMFuncOp func); void connectPHINodes(LLVMFuncOp func); LogicalResult convertBlock(Block &bb, bool ignoreArguments); 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 @@ -421,7 +421,7 @@ /// Create named global variables that correspond to llvm.mlir.global /// definitions. -void ModuleTranslation::convertGlobals() { +LogicalResult ModuleTranslation::convertGlobals() { for (auto op : getModuleBody(mlirModule).getOps()) { llvm::Type *type = op.getType().getUnderlyingType(); llvm::Constant *cst = llvm::UndefValue::get(type); @@ -432,17 +432,16 @@ cst = llvm::ConstantDataArray::getString( llvmModule->getContext(), strAttr.getValue(), /*AddNull=*/false); type = cst->getType(); - } else { - cst = getLLVMConstant(type, op.getValueOrNull(), op.getLoc()); + } else if (!(cst = getLLVMConstant(type, op.getValueOrNull(), + op.getLoc()))) { + return failure(); } } else if (Block *initializer = op.getInitializerBlock()) { llvm::IRBuilder<> builder(llvmModule->getContext()); for (auto &op : initializer->without_terminator()) { if (failed(convertOperation(op, builder)) || - !isa(valueMapping.lookup(op.getResult(0)))) { - emitError(op.getLoc(), "unemittable constant value"); - return; - } + !isa(valueMapping.lookup(op.getResult(0)))) + return emitError(op.getLoc(), "unemittable constant value"); } ReturnOp ret = cast(initializer->getTerminator()); cst = cast(valueMapping.lookup(ret.getOperand(0))); @@ -460,6 +459,8 @@ globalsMapping.try_emplace(op, var); } + + return success(); } /// Get the SSA value passed to the current block from the terminator operation diff --git a/mlir/test/Target/llvmir-invalid.mlir b/mlir/test/Target/llvmir-invalid.mlir --- a/mlir/test/Target/llvmir-invalid.mlir +++ b/mlir/test/Target/llvmir-invalid.mlir @@ -12,3 +12,8 @@ %0 = llvm.mlir.constant(dense<[[[1, 2], [3, 4]], [[42, 43], [44, 45]]]> : tensor<2x2x2xi32>) : !llvm<"[2 x [2 x [2 x {i32}]]]"> llvm.return %0 : !llvm<"[2 x [2 x [2 x {i32}]]]"> } + +// ----- + +// expected-error @+1 {{unsupported constant value}} +llvm.mlir.global internal constant @test([2.5, 7.4]) : !llvm<"[2 x double]">