summaryrefslogtreecommitdiffstats
path: root/mlir/lib/Conversion/VectorToLLVM
diff options
context:
space:
mode:
authorNicolas Vasilache <ntv@google.com>2019-11-12 07:06:18 -0800
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-11-12 07:06:54 -0800
commitf51a15533729cddc9907320b5ab963f7fc037aa0 (patch)
treef2c907948d881741510dc8574fe12dc468a72021 /mlir/lib/Conversion/VectorToLLVM
parent6582489219ab695a025457302a9e6924b1259176 (diff)
downloadbcm5719-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.cpp19
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);
OpenPOWER on IntegriCloud