diff --git a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp index 6f9ba92962758..c3b4d1e13de47 100644 --- a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp +++ b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp @@ -698,8 +698,9 @@ static LogicalResult verifyOutputShape( extents[pos] = getAffineConstantExpr(v.getShape()[idx], ctx); } } - assert(llvm::all_of(extents, [](AffineExpr e) { return e; }) && - "expected extent along all dimensions."); + if (!llvm::all_of(extents, [](AffineExpr e) { return e; })) + return op.emitOpError("expected all input dimensions to be used by " + "either the LHS or the RHS"); AffineMap resMap = op.getIndexingMaps()[2]; auto extentsMap = AffineMap::get(/*dimCount=*/extents.size(), diff --git a/mlir/test/Dialect/Vector/invalid.mlir b/mlir/test/Dialect/Vector/invalid.mlir index 243e83e8ceb6a..9a2afb9cc2774 100644 --- a/mlir/test/Dialect/Vector/invalid.mlir +++ b/mlir/test/Dialect/Vector/invalid.mlir @@ -874,6 +874,21 @@ func.func @contraction(%arg0: vector<2x1xf32>, %arg1: vector<1x3xf32>, %arg2: ve // ----- +func.func @contract_with_dim_unused_by_lhs_and_rhs(%arg0 : vector<1x2xi32>, %arg1 : vector<2xi32>, %arg2 : vector<1xi32>) -> vector<1xi32> { +// expected-error@+1 {{'vector.contract' op expected all input dimensions to be used by either the LHS or the RHS}} + %result = vector.contract { + indexing_maps = [ + affine_map<(d0, d1, d2) -> (d0, d2)>, + affine_map<(d0, d1, d2) -> (d2)>, + affine_map<(d0, d1, d2) -> (d1)> + ], + iterator_types = ["reduction", "parallel", "reduction"], + kind = #vector.kind} %arg0, %arg1, %arg2 : vector<1x2xi32>, vector<2xi32> into vector<1xi32> + return %result : vector<1xi32> +} + +// ----- + func.func @create_mask_0d_no_operands() { %c1 = arith.constant 1 : index // expected-error@+1 {{must specify exactly one operand for 0-D create_mask}}