[mlir][Vector] Fix vector.insert folder for scalar to 0-d inserts by Groverkss · Pull Request #113828 · llvm/llvm-project (original) (raw)
@llvm/pr-subscribers-mlir-vector
@llvm/pr-subscribers-mlir
Author: Kunwar Grover (Groverkss)
Changes
The current vector.insert folder tries to replace a scalar with a 0-rank vector. This patch fixes this crash by not folding unless they types of the result and replacement are same.
Full diff: https://github.com/llvm/llvm-project/pull/113828.diff
2 Files Affected:
- (modified) mlir/lib/Dialect/Vector/IR/VectorOps.cpp (+4-4)
- (modified) mlir/test/Dialect/Vector/canonicalize.mlir (+12)
diff --git a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp index d71a236f62f454..03d2409f42c524 100644 --- a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp +++ b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp @@ -2951,11 +2951,11 @@ void InsertOp::getCanonicalizationPatterns(RewritePatternSet &results, InsertOpConstantFolder>(context); }
-// Eliminates insert operations that produce values identical to their source -// value. This happens when the source and destination vectors have identical -// sizes. OpFoldResult vector::InsertOp::fold(FoldAdaptor adaptor) {
- if (getNumIndices() == 0)
- // Fold "vector.insert %v, %dest [] : vector<2x2xf32> from vector<2x2xf32>" to
- // %v. Note: Do not fold "vector.insert %v, %dest [] : f32 into vector"
- // (type mismatch).
- if (getNumIndices() == 0 && getSourceType() == getResult().getType()) return getSource(); return {}; } diff --git a/mlir/test/Dialect/Vector/canonicalize.mlir b/mlir/test/Dialect/Vector/canonicalize.mlir index 6d6bc199e601c0..580daa2a13d15e 100644 --- a/mlir/test/Dialect/Vector/canonicalize.mlir +++ b/mlir/test/Dialect/Vector/canonicalize.mlir @@ -2745,6 +2745,18 @@ func.func @vector_insert_const_regression(%arg0: i8) -> vector<4xi8> {
// -----
+// CHECK-LABEL: func @insert_into_0d_regression( +// CHECK-SAME: %[[v:.]]: vector) +// CHECK: %[[extract:.]] = vector.insert %{{.*}}, %[[v]] [] : f32 into vector +// CHECK: return %[[extract]] +func.func @insert_into_0d_regression(%v: vector) -> vector {
- %cst = arith.constant 0.000000e+00 : f32
- %0 = vector.insert %cst, %v [] : f32 into vector
- return %0 : vector +}
- +// -----
- // CHECK-LABEL: @contiguous_extract_strided_slices_to_extract // CHECK: %[[EXTRACT:.+]] = vector.extract {{.*}}[0, 0, 0, 0, 0] : vector<4xi32> from vector<8x1x2x1x1x4xi32> // CHECK-NEXT: return %[[EXTRACT]] : vector<4xi32>