diff --git a/mlir/lib/Conversion/VectorToSCF/VectorToSCF.cpp b/mlir/lib/Conversion/VectorToSCF/VectorToSCF.cpp --- a/mlir/lib/Conversion/VectorToSCF/VectorToSCF.cpp +++ b/mlir/lib/Conversion/VectorToSCF/VectorToSCF.cpp @@ -16,6 +16,7 @@ #include "../PassDetail.h" #include "mlir/Dialect/Affine/EDSC/Intrinsics.h" +#include "mlir/Dialect/Linalg/Utils/Utils.h" #include "mlir/Dialect/SCF/EDSC/Builders.h" #include "mlir/Dialect/SCF/EDSC/Intrinsics.h" #include "mlir/Dialect/StandardOps/EDSC/Intrinsics.h" @@ -203,7 +204,10 @@ Value inBoundsCondition; majorIvsPlusOffsets.reserve(majorIvs.size()); unsigned idx = 0; - for (auto it : llvm::zip(majorIvs, majorOffsets, memrefBounds.getUbs())) { + SmallVector bounds = + linalg::applyMapToValues(rewriter, xferOp.getLoc(), + xferOp.permutation_map(), memrefBounds.getUbs()); + for (auto it : llvm::zip(majorIvs, majorOffsets, bounds)) { Value iv = std::get<0>(it), off = std::get<1>(it), ub = std::get<2>(it); using namespace mlir::edsc::op; majorIvsPlusOffsets.push_back(iv + off); diff --git a/mlir/test/Conversion/VectorToSCF/vector-to-loops.mlir b/mlir/test/Conversion/VectorToSCF/vector-to-loops.mlir --- a/mlir/test/Conversion/VectorToSCF/vector-to-loops.mlir +++ b/mlir/test/Conversion/VectorToSCF/vector-to-loops.mlir @@ -400,3 +400,33 @@ %0 = vector.transfer_read %A[%c0, %c0], %f0 : memref<2x2xf32>, vector<2x2xf32> return %0 : vector<2x2xf32> } + +func @transfer_read_minor_identity(%A : memref) -> vector<3x3xf32> { + %c0 = constant 0 : index + %f0 = constant 0.0 : f32 + %0 = vector.transfer_read %A[%c0, %c0, %c0, %c0], %f0 + { permutation_map = affine_map<(d0, d1, d2, d3) -> (d2, d3)> } + : memref, vector<3x3xf32> + return %0 : vector<3x3xf32> +} + +// CHECK-LABEL: transfer_read_minor_identity( +// CHECK-SAME: %[[A:.*]]: memref) -> vector<3x3xf32> +// CHECK-NEXT: %[[c0:.*]] = constant 0 : index +// CHECK-NEXT: %[[cst:.*]] = constant 0.000000e+00 : f32 +// CHECK-NEXT: %[[c2:.*]] = constant 2 : index +// CHECK-NEXT: %[[cst0:.*]] = constant dense<0.000000e+00> : vector<3xf32> +// CHECK-NEXT: %[[m:.*]] = alloca() {alignment = 128 : i64} : memref<3xvector<3xf32>> +// CHECK-NEXT: %[[d:.*]] = dim %arg0, %c2 : memref +// CHECK-NEXT: affine.for %[[arg1:.*]] = 0 to 3 { +// CHECK-NEXT: %[[cmp:.*]] = cmpi "slt", %[[arg1]], %[[d]] : index +// CHECK-NEXT: scf.if %[[cmp]] { +// CHECK-NEXT: %[[tr:.*]] = vector.transfer_read %[[A]][%[[c0]], %[[c0]], %[[arg1]], %[[c0]]], %[[cst]] : memref, vector<3xf32> +// CHECK-NEXT: store %[[tr]], %[[m]][%[[arg1]]] : memref<3xvector<3xf32>> +// CHECK-NEXT: } else { +// CHECK-NEXT: store %[[cst0]], %[[m]][%[[arg1]]] : memref<3xvector<3xf32>> +// CHECK-NEXT: } +// CHECK-NEXT: } +// CHECK-NEXT: %[[cast:.*]] = vector.type_cast %[[m]] : memref<3xvector<3xf32>> to memref> +// CHECK-NEXT: %[[ret:.*]] = load %[[cast]][] : memref> +// CHECK-NEXT: return %[[ret]] : vector<3x3xf32>