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(),
// -----
+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<add>} %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}}