diff options
Diffstat (limited to 'mlir')
-rw-r--r-- | mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 16 | ||||
-rw-r--r-- | mlir/test/Target/LLVMIR/llvmir.mlir | 9 |
2 files changed, 25 insertions, 0 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index e4cd94026a59..70171e77eab9 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -741,6 +741,22 @@ LogicalResult ModuleTranslation::convertGlobals() { if (failed(convertOperation(op, builder)) || !isa<llvm::Constant>(lookupValue(op.getResult(0)))) return emitError(op.getLoc(), "unemittable constant value"); + // When emitting an LLVM constant, a new constant is created and the old + // constant may become dangling and take space. We should remove the + // dangling constants to avoid memory explosion especially for constant + // arrays whose number of elements is large. + // TODO: handle ops other than InsertValueOp with ConstantArray. + if (auto ivOp = dyn_cast<LLVM::InsertValueOp>(op)) { + Value container = ivOp.getContainer(); + if (auto cst = + dyn_cast<llvm::ConstantArray>(lookupValue(container))) { + // GlobalValue shouldn't be treated like other constants. + if (isa<llvm::GlobalValue>(cst)) + continue; + if (cst->hasZeroLiveUses()) + cst->destroyConstant(); + } + } } ReturnOp ret = cast<ReturnOp>(initializer->getTerminator()); llvm::Constant *cst = diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir index 6d340bc57fcd..b950128b17c0 100644 --- a/mlir/test/Target/LLVMIR/llvmir.mlir +++ b/mlir/test/Target/LLVMIR/llvmir.mlir @@ -53,6 +53,15 @@ llvm.mlir.global internal constant @int_gep() : !llvm.ptr<i32> { llvm.return %gepinit : !llvm.ptr<i32> } +// CHECK: @string_array = internal constant [1 x ptr] [ptr @string_const] +llvm.mlir.global internal constant @string_array() : !llvm.array<1 x ptr<i8>> { + %0 = llvm.mlir.undef : !llvm.array<1 x ptr<i8>> + %1 = llvm.mlir.addressof @string_const: !llvm.ptr<array<6 x i8>> + %2 = llvm.getelementptr %1[0, 0] : (!llvm.ptr<array<6 x i8>>) -> !llvm.ptr<i8> + %3 = llvm.insertvalue %2, %0[0] : !llvm.array<1 x ptr<i8>> + llvm.return %3 : !llvm.array<1 x ptr<i8>> +} + // CHECK{LITERAL}: @dense_float_vector = internal global <3 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00> llvm.mlir.global internal @dense_float_vector(dense<[1.0, 2.0, 3.0]> : vector<3xf32>) : vector<3xf32> |