diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp index 0c48a5aeb26a2..0b5191664a9e2 100644 --- a/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp +++ b/mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp @@ -222,7 +222,7 @@ bool mlir::linalg::detail::isContractionBody( Value contributed = getSourceSkipUnary( isa(reductionLHS) ? reductionRHS : reductionLHS); Operation *elementwiseOp = contributed.getDefiningOp(); - if (elementwiseOp->getNumResults() != 1 || + if (!elementwiseOp || elementwiseOp->getNumResults() != 1 || elementwiseOp->getNumOperands() != 2) { errs << "expected elementwise op to be binary"; return false; diff --git a/mlir/test/Dialect/Linalg/match-ops-interpreter.mlir b/mlir/test/Dialect/Linalg/match-ops-interpreter.mlir index 4bfed475d44f6..bfe7a07cb38a5 100644 --- a/mlir/test/Dialect/Linalg/match-ops-interpreter.mlir +++ b/mlir/test/Dialect/Linalg/match-ops-interpreter.mlir @@ -996,6 +996,21 @@ module attributes { transform.target_tag = "start_here" } { } -> tensor<40x10x50x15xf32> return %result : tensor<40x10x50x15xf32> } + + func.func @generic_min(%arg0: tensor<1x7x4xf32>, %arg1: tensor<4xf32>, %arg2: tensor<1x1x4xf32>) { + linalg.generic { + indexing_maps = [affine_map<(d0, d1, d2, d3) -> (d0, d1 * 2 + d3 * 2, d2)>, + affine_map<(d0, d1, d2, d3) -> (d3)>, + affine_map<(d0, d1, d2, d3) -> (d0, d1, d2)>], + iterator_types = ["parallel", "parallel", "parallel", "reduction"]} + ins(%arg0, %arg1 : tensor<1x7x4xf32>, tensor<4xf32>) + outs(%arg2 : tensor<1x1x4xf32>) { + ^bb0(%in: f32, %in_1: f32, %out: f32): + %5 = arith.minimumf %out, %in : f32 + linalg.yield %5 : f32 + } -> tensor<1x1x4xf32> + return + } } // -----