[PATCH] D143729: [mlir][MemRef][TransformOps] Fix error reporting for multibuffer

Quentin Colombet via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 10 05:47:18 PST 2023


qcolombet updated this revision to Diff 496443.
qcolombet added a comment.

Adopt `emitSilenceableFailure`


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143729/new/

https://reviews.llvm.org/D143729

Files:
  mlir/lib/Dialect/MemRef/TransformOps/MemRefTransformOps.cpp
  mlir/test/Dialect/MemRef/transform-ops.mlir


Index: mlir/test/Dialect/MemRef/transform-ops.mlir
===================================================================
--- mlir/test/Dialect/MemRef/transform-ops.mlir
+++ mlir/test/Dialect/MemRef/transform-ops.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -test-transform-dialect-interpreter -verify-diagnostics -allow-unregistered-dialect | FileCheck %s
+// RUN: mlir-opt %s -test-transform-dialect-interpreter -verify-diagnostics -allow-unregistered-dialect -split-input-file | FileCheck %s
 
 // CHECK-DAG: #[[$MAP0:.*]] = affine_map<(d0) -> ((d0 floordiv 4) mod 2)>
 // CHECK-DAG: #[[$MAP1:.*]] = affine_map<(d0)[s0] -> (d0 + s0)>
@@ -35,3 +35,40 @@
   // Verify that the returned handle is usable.
   transform.test_print_remark_at_operand %1, "transformed" : !pdl.operation
 }
+
+// -----
+
+// Trying to use multibuffer on alloc that are used outside of loops is
+// going to fail.
+// Check that we emit a proper remark for that.
+func.func @multi_buffer_uses_outside_of_loop(%in: memref<16xf32>) {
+  // CHECK: %[[A:.*]] = memref.alloc() : memref<2x4xf32>
+  // expected-error @below {{op failed to multibuffer}}
+  %tmp = memref.alloc() : memref<4xf32>
+
+  "some_outside_loop_use"(%tmp) : (memref<4xf32>) -> ()
+
+  // CHECK: %[[C0:.*]] = arith.constant 0 : index
+  // CHECK: %[[C4:.*]] = arith.constant 4 : index
+  %c0 = arith.constant 0 : index
+  %c4 = arith.constant 4 : index
+  %c16 = arith.constant 16 : index
+
+  // CHECK: scf.for %[[IV:.*]] = %[[C0]]
+  scf.for %i0 = %c0 to %c16 step %c4 {
+    // CHECK: %[[I:.*]] = affine.apply #[[$MAP0]](%[[IV]])
+    // CHECK: %[[SV:.*]] = memref.subview %[[A]][%[[I]], 0] [1, 4] [1, 1] : memref<2x4xf32> to memref<4xf32, strided<[1], offset: ?>>
+    %1 = memref.subview %in[%i0] [4] [1] : memref<16xf32> to memref<4xf32, affine_map<(d0)[s0] -> (d0 + s0)>>
+    // CHECK: memref.copy %{{.*}}, %[[SV]] : memref<4xf32, #[[$MAP1]]> to memref<4xf32, strided<[1], offset: ?>>
+    memref.copy %1, %tmp :  memref<4xf32, affine_map<(d0)[s0] -> (d0 + s0)>> to memref<4xf32>
+
+    "some_use"(%tmp) : (memref<4xf32>) ->()
+  }
+  return
+}
+
+transform.sequence failures(propagate) {
+^bb1(%arg1: !pdl.operation):
+  %0 = transform.structured.match ops{["memref.alloc"]} in %arg1 : (!pdl.operation) -> !pdl.operation
+  %1 = transform.memref.multibuffer %0 {factor = 2 : i64}
+}
Index: mlir/lib/Dialect/MemRef/TransformOps/MemRefTransformOps.cpp
===================================================================
--- mlir/lib/Dialect/MemRef/TransformOps/MemRefTransformOps.cpp
+++ mlir/lib/Dialect/MemRef/TransformOps/MemRefTransformOps.cpp
@@ -25,11 +25,9 @@
     memref::AllocOp target, transform::ApplyToEachResultList &results,
     transform::TransformState &state) {
   auto newBuffer = memref::multiBuffer(target, getFactor());
-  if (failed(newBuffer)) {
-    Diagnostic diag(target->getLoc(), DiagnosticSeverity::Note);
-    diag << "op failed to multibuffer";
-    return DiagnosedSilenceableFailure::silenceableFailure(std::move(diag));
-  }
+  if (failed(newBuffer))
+    return emitSilenceableFailure(target->getLoc())
+           << "op failed to multibuffer";
 
   results.push_back(*newBuffer);
   return DiagnosedSilenceableFailure::success();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143729.496443.patch
Type: text/x-patch
Size: 3212 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230210/ae961830/attachment.bin>


More information about the llvm-commits mailing list