// Further check that the resulting index maps can be fused and
// inverted. Without this the resultant op is not legal.
- if (!inversePermutation(concatAffineMaps(fusedIndexMaps)))
- return op.emitRemark("fused op loop bound computation failed");
+ if (!inversePermutation(concatAffineMaps(fusedIndexMaps))) {
+ return rewriter.notifyMatchFailure(
+ op, "fused op loop bound computation failed");
+ }
rewriter.startRootUpdate(op);
op->setOperands(fusedOperands);
linearizeCollapsedDims(invMap, reshapeOp.getSrcType().getShape(),
reshapeOp.getReassociationMaps());
for (AffineExpr expr : modifiedMap.getResults()) {
- if (!expr.isPureAffine())
- return producer.emitRemark("fused op indexing map is not affine");
+ if (!expr.isPureAffine()) {
+ return rewriter.notifyMatchFailure(
+ producer, "fused op indexing map is not affine");
+ }
}
fusedIndexMaps.back() = modifiedMap;
// Further check that the resulting index maps can be fused and
// inverted. Without this the resultant op is not legal.
- if (!inversePermutation(concatAffineMaps(fusedIndexMaps)))
- return reshapeOp.emitRemark("fused op loop bound computation failed");
+ if (!inversePermutation(concatAffineMaps(fusedIndexMaps))) {
+ return rewriter.notifyMatchFailure(
+ producer, "fused op loop bound computation failed");
+ }
Location loc = producer.getLoc();
Value output = rewriter.create<TensorReshapeOp>(
-// RUN: mlir-opt -split-input-file -linalg-fold-reshape-ops-by-linearization -verify-diagnostics %s | FileCheck %s
+// RUN: mlir-opt -split-input-file -linalg-fold-reshape-ops-by-linearization %s | FileCheck %s
#map0 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>
func @generic_op_reshape_producer_fusion(%arg0 : tensor<?x?x?xf32>,
%arg1 : tensor<?x?x?x5xf32>) ->
tensor<?x?xf32>
{
- // expected-remark @+1 {{fused op indexing map is not affine}}
%0 = linalg.generic {
indexing_maps = [#map0, #map0, #map0],
iterator_types = ["parallel", "parallel", "parallel", "parallel"]}
tensor<?x?x?x5xf32> into tensor<?x?xf32>
return %1 : tensor<?x?xf32>
}
+// CHECK-LABEL: func @generic_op_reshape_consumer_nofusion
+// CHECK-SAME: %[[ARG0:[a-zA-Z0-9_]+]]: tensor<?x?x?x5xf32>
+// CHECK-SAME: %[[ARG1:[a-zA-Z0-9_]+]]: tensor<?x?x?x5xf32>
+// CHECK: %[[NOFUSE:.+]] = linalg.generic
+// CHECK-SAME: ins(%[[ARG0]], %[[ARG1]]
+// CHECK: %[[RESULT:.+]] = linalg.tensor_reshape %[[NOFUSE]]
+// CHECK: return %[[RESULT]]