summaryrefslogtreecommitdiffstats
path: root/mlir/lib/Conversion/VectorToLLVM
diff options
context:
space:
mode:
authorAart Bik <ajcbik@google.com>2019-12-16 09:52:13 -0800
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-12-16 09:52:46 -0800
commitcd5dab8ad7fccc3b3e371ff37cb20ebfb4368d3f (patch)
tree2739c91c722ffe31b0cab6245441658fc0b663a5 /mlir/lib/Conversion/VectorToLLVM
parent73ec37c8bbc73632d73318c702abb78c758d93db (diff)
downloadbcm5719-llvm-cd5dab8ad7fccc3b3e371ff37cb20ebfb4368d3f.tar.gz
bcm5719-llvm-cd5dab8ad7fccc3b3e371ff37cb20ebfb4368d3f.zip
[VectorOps] Add [insert/extract]element definition together with lowering to LLVM
Similar to insert/extract vector instructions but (1) work on 1-D vectors only (2) allow for a dynamic index %c3 = constant 3 : index %0 = vector.insertelement %arg0, %arg1[%c : index] : vector<4xf32> %1 = vector.extractelement %arg0[%c3 : index] : vector<4xf32> PiperOrigin-RevId: 285792205
Diffstat (limited to 'mlir/lib/Conversion/VectorToLLVM')
-rw-r--r--mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp53
1 files changed, 52 insertions, 1 deletions
diff --git a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
index d4c27a69fb5..71bed9516ca 100644
--- a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
+++ b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
@@ -300,6 +300,31 @@ public:
}
};
+class VectorExtractElementOpConversion : public LLVMOpLowering {
+public:
+ explicit VectorExtractElementOpConversion(MLIRContext *context,
+ LLVMTypeConverter &typeConverter)
+ : LLVMOpLowering(vector::ExtractElementOp::getOperationName(), context,
+ typeConverter) {}
+
+ PatternMatchResult
+ matchAndRewrite(Operation *op, ArrayRef<Value *> operands,
+ ConversionPatternRewriter &rewriter) const override {
+ auto adaptor = vector::ExtractElementOpOperandAdaptor(operands);
+ auto extractEltOp = cast<vector::ExtractElementOp>(op);
+ auto vectorType = extractEltOp.getVectorType();
+ auto llvmType = lowering.convertType(vectorType.getElementType());
+
+ // Bail if result type cannot be lowered.
+ if (!llvmType)
+ return matchFailure();
+
+ rewriter.replaceOpWithNewOp<LLVM::ExtractElementOp>(
+ op, llvmType, adaptor.vector(), adaptor.position());
+ return matchSuccess();
+ }
+};
+
class VectorExtractOpConversion : public LLVMOpLowering {
public:
explicit VectorExtractOpConversion(MLIRContext *context,
@@ -355,6 +380,31 @@ public:
}
};
+class VectorInsertElementOpConversion : public LLVMOpLowering {
+public:
+ explicit VectorInsertElementOpConversion(MLIRContext *context,
+ LLVMTypeConverter &typeConverter)
+ : LLVMOpLowering(vector::InsertElementOp::getOperationName(), context,
+ typeConverter) {}
+
+ PatternMatchResult
+ matchAndRewrite(Operation *op, ArrayRef<Value *> operands,
+ ConversionPatternRewriter &rewriter) const override {
+ auto adaptor = vector::InsertElementOpOperandAdaptor(operands);
+ auto insertEltOp = cast<vector::InsertElementOp>(op);
+ auto vectorType = insertEltOp.getDestVectorType();
+ auto llvmType = lowering.convertType(vectorType);
+
+ // Bail if result type cannot be lowered.
+ if (!llvmType)
+ return matchFailure();
+
+ rewriter.replaceOpWithNewOp<LLVM::InsertElementOp>(
+ op, llvmType, adaptor.dest(), adaptor.source(), adaptor.position());
+ return matchSuccess();
+ }
+};
+
class VectorInsertOpConversion : public LLVMOpLowering {
public:
explicit VectorInsertOpConversion(MLIRContext *context,
@@ -566,7 +616,8 @@ public:
void mlir::populateVectorToLLVMConversionPatterns(
LLVMTypeConverter &converter, OwningRewritePatternList &patterns) {
patterns.insert<VectorBroadcastOpConversion, VectorShuffleOpConversion,
- VectorExtractOpConversion, VectorInsertOpConversion,
+ VectorExtractElementOpConversion, VectorExtractOpConversion,
+ VectorInsertElementOpConversion, VectorInsertOpConversion,
VectorOuterProductOpConversion, VectorTypeCastOpConversion>(
converter.getDialect()->getContext(), converter);
}
OpenPOWER on IntegriCloud