From 8c2ff7b69e77a9eccf4a13bcc21dee5894b251af Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 17 Aug 2021 18:22:04 -0400 Subject: [PATCH] [MLIR] Correct linkage of lowered globalop LLVM considers global variables marked as externals to be defined within the module if it is initialized (including to an undef). Other external globals are considered as being defined externally and imported into the current translation unit. Lowering of MLIR Global Ops does not properly propagate undefined initializers, resulting in a global which is expected to be defined within the current TU, not being defined. Differential Revision: https://reviews.llvm.org/D108252 --- mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp | 10 +++++++++- mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir | 5 ++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp index 2327fa0..e3aaef5 100644 --- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp +++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp @@ -454,9 +454,17 @@ struct GlobalMemrefOpLowering initialValue = elementsAttr.getValue({}); } - rewriter.replaceOpWithNewOp( + auto newGlobal = rewriter.replaceOpWithNewOp( global, arrayTy, global.constant(), linkage, global.sym_name(), initialValue, /*alignment=*/0, type.getMemorySpaceAsInt()); + if (!global.isExternal() && global.isUninitialized()) { + Block *blk = new Block(); + newGlobal.getInitializerRegion().push_back(blk); + rewriter.setInsertionPointToStart(blk); + Value undef[] = { + rewriter.create(global.getLoc(), arrayTy)}; + rewriter.create(global.getLoc(), undef); + } return success(); } }; diff --git a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir index 4344f88..8e5f3dd 100644 --- a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir +++ b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir @@ -623,7 +623,10 @@ func @transpose(%arg0: memref) { // ----- -// CHECK: llvm.mlir.global external @gv0() : !llvm.array<2 x f32> +// CHECK: llvm.mlir.global external @gv0() : !llvm.array<2 x f32> { +// CHECK-NEXT: %0 = llvm.mlir.undef : !llvm.array<2 x f32> +// CHECK-NEXT: llvm.return %0 : !llvm.array<2 x f32> +// CHECK-NEXT: } memref.global @gv0 : memref<2xf32> = uninitialized // CHECK: llvm.mlir.global private @gv1() : !llvm.array<2 x f32> -- 2.7.4