diff options
author | Nicolas Vasilache <ntv@google.com> | 2019-11-12 07:06:18 -0800 |
---|---|---|
committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-11-12 07:06:54 -0800 |
commit | f51a15533729cddc9907320b5ab963f7fc037aa0 (patch) | |
tree | f2c907948d881741510dc8574fe12dc468a72021 /mlir/lib/Conversion/VectorToLLVM | |
parent | 6582489219ab695a025457302a9e6924b1259176 (diff) | |
download | bcm5719-llvm-f51a15533729cddc9907320b5ab963f7fc037aa0.tar.gz bcm5719-llvm-f51a15533729cddc9907320b5ab963f7fc037aa0.zip |
Add support for alignment attribute in std.alloc.
This CL adds an extra pointer to the memref descriptor to allow specifying alignment.
In a previous implementation, we used 2 types: `linalg.buffer` and `view` where the buffer type was the unit of allocation/deallocation/alignment and `view` was the unit of indexing.
After multiple discussions it was decided to use a single type, which conflates both, so the memref descriptor now needs to carry both pointers.
This is consistent with the [RFC-Proposed Changes to MemRef and Tensor MLIR Types](https://groups.google.com/a/tensorflow.org/forum/#!searchin/mlir/std.view%7Csort:date/mlir/-wKHANzDNTg/4K6nUAp8AAAJ).
PiperOrigin-RevId: 279959463
Diffstat (limited to 'mlir/lib/Conversion/VectorToLLVM')
-rw-r--r-- | mlir/lib/Conversion/VectorToLLVM/VectorToLLVM.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/mlir/lib/Conversion/VectorToLLVM/VectorToLLVM.cpp b/mlir/lib/Conversion/VectorToLLVM/VectorToLLVM.cpp index 765c25ae227..5ccf740f2fb 100644 --- a/mlir/lib/Conversion/VectorToLLVM/VectorToLLVM.cpp +++ b/mlir/lib/Conversion/VectorToLLVM/VectorToLLVM.cpp @@ -189,9 +189,9 @@ public: return matchFailure(); Type llvmSourceElementTy = llvmSourceDescriptorTy.getStructElementType( - LLVMTypeConverter::kPtrPosInMemRefDescriptor); + LLVMTypeConverter::kAlignedPtrPosInMemRefDescriptor); Type llvmTargetElementTy = llvmTargetDescriptorTy.getStructElementType( - LLVMTypeConverter::kPtrPosInMemRefDescriptor); + LLVMTypeConverter::kAlignedPtrPosInMemRefDescriptor); int64_t offset; SmallVector<int64_t, 4> strides; @@ -215,16 +215,27 @@ public: // Create descriptor. Value *desc = rewriter.create<LLVM::UndefOp>(loc, llvmTargetDescriptorTy); + // Set allocated ptr. + Value *allocated = rewriter.create<LLVM::ExtractValueOp>( + loc, llvmSourceElementTy, sourceMemRef, + rewriter.getIndexArrayAttr( + LLVMTypeConverter::kAllocatedPtrPosInMemRefDescriptor)); + allocated = + rewriter.create<LLVM::BitcastOp>(loc, llvmTargetElementTy, allocated); + desc = rewriter.create<LLVM::InsertValueOp>( + op->getLoc(), llvmTargetDescriptorTy, desc, allocated, + rewriter.getIndexArrayAttr( + LLVMTypeConverter::kAllocatedPtrPosInMemRefDescriptor)); // Set ptr. Value *ptr = rewriter.create<LLVM::ExtractValueOp>( loc, llvmSourceElementTy, sourceMemRef, rewriter.getIndexArrayAttr( - LLVMTypeConverter::kPtrPosInMemRefDescriptor)); + LLVMTypeConverter::kAlignedPtrPosInMemRefDescriptor)); ptr = rewriter.create<LLVM::BitcastOp>(loc, llvmTargetElementTy, ptr); desc = rewriter.create<LLVM::InsertValueOp>( op->getLoc(), llvmTargetDescriptorTy, desc, ptr, rewriter.getIndexArrayAttr( - LLVMTypeConverter::kPtrPosInMemRefDescriptor)); + LLVMTypeConverter::kAlignedPtrPosInMemRefDescriptor)); // Fill offset 0. auto attr = rewriter.getIntegerAttr(rewriter.getIndexType(), 0); auto zero = rewriter.create<LLVM::ConstantOp>(loc, int64Ty, attr); |