summaryrefslogtreecommitdiffstats
path: root/mlir/include
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/include
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/include')
-rw-r--r--mlir/include/mlir/Dialect/VectorOps/VectorOps.td59
1 files changed, 59 insertions, 0 deletions
diff --git a/mlir/include/mlir/Dialect/VectorOps/VectorOps.td b/mlir/include/mlir/Dialect/VectorOps/VectorOps.td
index 883e1bcfff7..eb05821952d 100644
--- a/mlir/include/mlir/Dialect/VectorOps/VectorOps.td
+++ b/mlir/include/mlir/Dialect/VectorOps/VectorOps.td
@@ -267,6 +267,33 @@ def Vector_ShuffleOp :
}];
}
+def Vector_ExtractElementOp :
+ Vector_Op<"extractelement", [NoSideEffect,
+ PredOpTrait<"operand and result have same element type",
+ TCresVTEtIsSameAsOpBase<0, 0>>]>,
+ Arguments<(ins AnyVector:$vector, Index:$position)>,
+ Results<(outs AnyType)> {
+ let summary = "extractelement operation";
+ let description = [{
+ Takes an 1-D vector and a dynamic index position and extracts the
+ scalar at that position. Note that this instruction resembles
+ vector.extract, but is restricted to 1-D vectors and relaxed
+ to dynamic indices. It is meant to be closer to LLVM's version:
+ https://llvm.org/docs/LangRef.html#extractelement-instruction
+
+ Example:
+ ```
+ %c = constant 15 : i32
+ %1 = vector.extractelement %0[%c : i32]: vector<16xf32>
+ ```
+ }];
+ let extraClassDeclaration = [{
+ VectorType getVectorType() {
+ return vector()->getType().cast<VectorType>();
+ }
+ }];
+}
+
def Vector_ExtractOp :
Vector_Op<"extract", [NoSideEffect,
PredOpTrait<"operand and result have same element type",
@@ -346,6 +373,38 @@ def Vector_ExtractSlicesOp :
}];
}
+def Vector_InsertElementOp :
+ Vector_Op<"insertelement", [NoSideEffect,
+ PredOpTrait<"source operand and result have same element type",
+ TCresVTEtIsSameAsOpBase<0, 0>>,
+ PredOpTrait<"dest operand and result have same type",
+ TCresIsSameAsOpBase<0, 1>>]>,
+ Arguments<(ins AnyType:$source, AnyVector:$dest, Index:$position)>,
+ Results<(outs AnyVector)> {
+ let summary = "insertelement operation";
+ let description = [{
+ Takes a scalar source, an 1-D destination vector and a dynamic index
+ position and inserts the source into the destination at the proper
+ position. Note that this instruction resembles vector.insert, but
+ is restricted to 1-D vectors and relaxed to dynamic indices. It is
+ meant to be closer to LLVM's version:
+ https://llvm.org/docs/LangRef.html#insertelement-instruction
+
+ Example:
+ ```
+ %c = constant 15 : i32
+ %f = constant 0.0f : f32
+ %1 = vector.insertelement %f, %0[%c : i32]: vector<16xf32>
+ ```
+ }];
+ let extraClassDeclaration = [{
+ Type getSourceType() { return source()->getType(); }
+ VectorType getDestVectorType() {
+ return dest()->getType().cast<VectorType>();
+ }
+ }];
+}
+
def Vector_InsertOp :
Vector_Op<"insert", [NoSideEffect,
PredOpTrait<"source operand and result have same element type",
OpenPOWER on IntegriCloud