[Mlir-commits] [mlir] [mlir][memref] Promote buffers accessed via memref.copy (PR #232078)

Federico Bruzzone llvmlistbot at llvm.org
Fri Oct 23 04:01:57 PDT 2026


================
@@ -0,0 +1,257 @@
+// RUN: mlir-opt %s -mem2reg -split-input-file | FileCheck %s
+
+
+// `memref.copy` participates in promotion as a transfer of the buffer's value.
+// Copying into the whole slot and reading it becomes a read of the source.
+
+// CHECK-LABEL: func.func @copy_src(
+// CHECK-SAME:      %[[SRC:.*]]: memref<8x16xf32>, %[[PAD:.*]]: f32
+//    CHECK-NOT:   memref.alloca
+//    CHECK-NOT:   memref.copy
+//        CHECK:   %[[R:.*]] = vector.transfer_read %[[SRC]]{{.*}} : memref<8x16xf32>, vector<8x16xf32>
+//        CHECK:   return %[[R]]
+func.func @copy_src(%src: memref<8x16xf32>, %pad: f32) -> vector<8x16xf32> {
+  %c0 = arith.constant 0 : index
+  %a = memref.alloca() : memref<8x16xf32>
+  memref.copy %src, %a : memref<8x16xf32> to memref<8x16xf32>
+  %r = vector.transfer_read %a[%c0, %c0], %pad {in_bounds = [true, true]} : memref<8x16xf32>, vector<8x16xf32>
+  return %r : vector<8x16xf32>
+}
+
+// -----
+
+// Copying out of the slot becomes a transfer_write of its value to the target.
+
+// CHECK-LABEL: func.func @copy_into_dst(
+// CHECK-SAME:      %[[V:.*]]: vector<8x16xf32>, %[[DST:.*]]: memref<8x16xf32>
+//    CHECK-NOT:   memref.alloca
+//    CHECK-NOT:   memref.copy
+//        CHECK:   vector.transfer_write %[[V]], %[[DST]]
+func.func @copy_into_dst(%v: vector<8x16xf32>, %dst: memref<8x16xf32>) {
+  %c0 = arith.constant 0 : index
+  %a = memref.alloca() : memref<8x16xf32>
+  vector.transfer_write %v, %a[%c0, %c0] {in_bounds = [true, true]} : vector<8x16xf32>, memref<8x16xf32>
+  memref.copy %a, %dst : memref<8x16xf32> to memref<8x16xf32>
+  return
+}
+
+// -----
+
+// Copying between two promotable slots eliminates both buffers.
+
+// CHECK-LABEL: func.func @copy_intermediate(
+// CHECK-SAME:      %[[V:.*]]: vector<8x16xf32>
+//    CHECK-NOT:   memref.alloca
+//    CHECK-NOT:   memref.copy
+//        CHECK:   return %[[V]]
+func.func @copy_intermediate(%v: vector<8x16xf32>, %pad: f32) -> vector<8x16xf32> {
+  %c0 = arith.constant 0 : index
+  %a = memref.alloca() : memref<8x16xf32>
+  %b = memref.alloca() : memref<8x16xf32>
+  vector.transfer_write %v, %a[%c0, %c0] {in_bounds = [true, true]} : vector<8x16xf32>, memref<8x16xf32>
+  memref.copy %a, %b : memref<8x16xf32> to memref<8x16xf32>
+  %r = vector.transfer_read %b[%c0, %c0], %pad {in_bounds = [true, true]} : memref<8x16xf32>, vector<8x16xf32>
+  return %r : vector<8x16xf32>
+}
+
+// -----
+
+// NEGATIVE: a self-copy references the slot on both sides and is not modeled, so
+// the buffer is not promoted.
+
+// CHECK-LABEL: func.func @negative_copy_self(
----------------
FedericoBruzzone wrote:

Could you add a negative test for a single-element alloca that is the source or target of a copy?

https://github.com/llvm/llvm-project/pull/232078


More information about the Mlir-commits mailing list