xref: /llvm-project/mlir/test/Conversion/MeshToMPI/convert-mesh-to-mpi.mlir (revision b7749efb749541716b6785c48fc8d6c2a4453ffb)
179eb406aSFrank Schlimbach// RUN: mlir-opt %s -convert-mesh-to-mpi -canonicalize -split-input-file | FileCheck %s
279eb406aSFrank Schlimbach
379eb406aSFrank Schlimbach// -----
479eb406aSFrank Schlimbach// CHECK: mesh.mesh @mesh0
579eb406aSFrank Schlimbachmesh.mesh @mesh0(shape = 3x4x5)
679eb406aSFrank Schlimbachfunc.func @process_multi_index() -> (index, index, index) {
779eb406aSFrank Schlimbach  // CHECK: mpi.comm_rank : !mpi.retval, i32
879eb406aSFrank Schlimbach  // CHECK-DAG: %[[v4:.*]] = arith.remsi
979eb406aSFrank Schlimbach  // CHECK-DAG: %[[v0:.*]] = arith.remsi
1079eb406aSFrank Schlimbach  // CHECK-DAG: %[[v1:.*]] = arith.remsi
1179eb406aSFrank Schlimbach  %0:3 = mesh.process_multi_index on @mesh0 axes = [] : index, index, index
1279eb406aSFrank Schlimbach  // CHECK: return %[[v1]], %[[v0]], %[[v4]] : index, index, index
1379eb406aSFrank Schlimbach  return %0#0, %0#1, %0#2 : index, index, index
1479eb406aSFrank Schlimbach}
1579eb406aSFrank Schlimbach
1679eb406aSFrank Schlimbach// CHECK-LABEL: func @process_linear_index
1779eb406aSFrank Schlimbachfunc.func @process_linear_index() -> index {
1879eb406aSFrank Schlimbach  // CHECK: %[[RES:.*]], %[[rank:.*]] = mpi.comm_rank : !mpi.retval, i32
1979eb406aSFrank Schlimbach  // CHECK: %[[cast:.*]] = arith.index_cast %[[rank]] : i32 to index
2079eb406aSFrank Schlimbach  %0 = mesh.process_linear_index on @mesh0 : index
2179eb406aSFrank Schlimbach  // CHECK: return %[[cast]] : index
2279eb406aSFrank Schlimbach  return %0 : index
2379eb406aSFrank Schlimbach}
2479eb406aSFrank Schlimbach
2579eb406aSFrank Schlimbach// CHECK-LABEL: func @neighbors_dim0
2679eb406aSFrank Schlimbachfunc.func @neighbors_dim0(%arg0 : tensor<120x120x120xi8>) -> (index, index) {
2779eb406aSFrank Schlimbach  %c0 = arith.constant 0 : index
2879eb406aSFrank Schlimbach  %c1 = arith.constant 1 : index
2979eb406aSFrank Schlimbach  %c4 = arith.constant 4 : index
3079eb406aSFrank Schlimbach  // CHECK-DAG: [[up:%.*]] = arith.constant 44 : index
3179eb406aSFrank Schlimbach  // CHECK-DAG: [[down:%.*]] = arith.constant 4 : index
3279eb406aSFrank Schlimbach  %idx:2 = mesh.neighbors_linear_indices on @mesh0[%c1, %c0, %c4] split_axes = [0] : index, index
3379eb406aSFrank Schlimbach  // CHECK: return [[down]], [[up]] : index, index
3479eb406aSFrank Schlimbach  return %idx#0, %idx#1 : index, index
3579eb406aSFrank Schlimbach}
3679eb406aSFrank Schlimbach
3779eb406aSFrank Schlimbach// CHECK-LABEL: func @neighbors_dim1
3879eb406aSFrank Schlimbachfunc.func @neighbors_dim1(%arg0 : tensor<120x120x120xi8>) -> (index, index) {
3979eb406aSFrank Schlimbach  %c0 = arith.constant 0 : index
4079eb406aSFrank Schlimbach  %c1 = arith.constant 1 : index
4179eb406aSFrank Schlimbach  %c4 = arith.constant 4 : index
4279eb406aSFrank Schlimbach  // CHECK-DAG: [[up:%.*]] = arith.constant 29 : index
4379eb406aSFrank Schlimbach  // CHECK-DAG: [[down:%.*]] = arith.constant -1 : index
4479eb406aSFrank Schlimbach  %idx:2 = mesh.neighbors_linear_indices on @mesh0[%c1, %c0, %c4] split_axes = [1] : index, index
4579eb406aSFrank Schlimbach  // CHECK: return [[down]], [[up]] : index, index
4679eb406aSFrank Schlimbach  return %idx#0, %idx#1 : index, index
4779eb406aSFrank Schlimbach}
4879eb406aSFrank Schlimbach
4979eb406aSFrank Schlimbach// CHECK-LABEL: func @neighbors_dim2
5079eb406aSFrank Schlimbachfunc.func @neighbors_dim2(%arg0 : tensor<120x120x120xi8>) -> (index, index) {
5179eb406aSFrank Schlimbach  %c0 = arith.constant 0 : index
5279eb406aSFrank Schlimbach  %c1 = arith.constant 1 : index
5379eb406aSFrank Schlimbach  %c4 = arith.constant 4 : index
5479eb406aSFrank Schlimbach  // CHECK-DAG: [[up:%.*]] = arith.constant -1 : index
5579eb406aSFrank Schlimbach  // CHECK-DAG: [[down:%.*]] = arith.constant 23 : index
5679eb406aSFrank Schlimbach  %idx:2 = mesh.neighbors_linear_indices on @mesh0[%c1, %c0, %c4] split_axes = [2] : index, index
5779eb406aSFrank Schlimbach  // CHECK: return [[down]], [[up]] : index, index
5879eb406aSFrank Schlimbach  return %idx#0, %idx#1 : index, index
5979eb406aSFrank Schlimbach}
6079eb406aSFrank Schlimbach
6179eb406aSFrank Schlimbach// -----
6279eb406aSFrank Schlimbach// CHECK: mesh.mesh @mesh0
6379eb406aSFrank Schlimbachmesh.mesh @mesh0(shape = 3x4x5)
6479eb406aSFrank Schlimbachmemref.global constant @static_mpi_rank : memref<index> = dense<24>
6579eb406aSFrank Schlimbachfunc.func @process_multi_index() -> (index, index, index) {
6679eb406aSFrank Schlimbach  // CHECK-DAG: %[[c4:.*]] = arith.constant 4 : index
6779eb406aSFrank Schlimbach  // CHECK-DAG: %[[c0:.*]] = arith.constant 0 : index
6879eb406aSFrank Schlimbach  // CHECK-DAG: %[[c1:.*]] = arith.constant 1 : index
6979eb406aSFrank Schlimbach  %0:3 = mesh.process_multi_index on @mesh0 axes = [] : index, index, index
7079eb406aSFrank Schlimbach  // CHECK: return %[[c1]], %[[c0]], %[[c4]] : index, index, index
7179eb406aSFrank Schlimbach  return %0#0, %0#1, %0#2 : index, index, index
7279eb406aSFrank Schlimbach}
7379eb406aSFrank Schlimbach
7479eb406aSFrank Schlimbach// CHECK-LABEL: func @process_linear_index
7579eb406aSFrank Schlimbachfunc.func @process_linear_index() -> index {
7679eb406aSFrank Schlimbach  // CHECK: %[[c24:.*]] = arith.constant 24 : index
7779eb406aSFrank Schlimbach  %0 = mesh.process_linear_index on @mesh0 : index
7879eb406aSFrank Schlimbach  // CHECK: return %[[c24]] : index
7979eb406aSFrank Schlimbach  return %0 : index
8079eb406aSFrank Schlimbach}
8179eb406aSFrank Schlimbach
8279eb406aSFrank Schlimbach// -----
8379eb406aSFrank Schlimbachmesh.mesh @mesh0(shape = 3x4x5)
8479eb406aSFrank Schlimbach// CHECK-LABEL: func @update_halo_1d_first
8579eb406aSFrank Schlimbachfunc.func @update_halo_1d_first(
8679eb406aSFrank Schlimbach  // CHECK-SAME: [[arg0:%.*]]: memref<120x120x120xi8>
8779eb406aSFrank Schlimbach  %arg0 : memref<120x120x120xi8>) -> memref<120x120x120xi8> {
8879eb406aSFrank Schlimbach  // CHECK: memref.subview [[arg0]][115, 0, 0] [2, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<2x120x120xi8
8979eb406aSFrank Schlimbach  // CHECK: mpi.send(
9079eb406aSFrank Schlimbach  // CHECK-SAME: : memref<2x120x120xi8>, i32, i32
9179eb406aSFrank Schlimbach  // CHECK: mpi.recv(
9279eb406aSFrank Schlimbach  // CHECK-SAME: : memref<2x120x120xi8>, i32, i32
9379eb406aSFrank Schlimbach  // CHECK-NEXT: memref.subview [[arg0]][0, 0, 0] [2, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<2x120x120xi8
9479eb406aSFrank Schlimbach  // CHECK: memref.subview [[arg0]][2, 0, 0] [3, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<3x120x120xi8
9579eb406aSFrank Schlimbach  // CHECK: mpi.send(
9679eb406aSFrank Schlimbach  // CHECK-SAME: : memref<3x120x120xi8>, i32, i32
9779eb406aSFrank Schlimbach  // CHECK: mpi.recv(
9879eb406aSFrank Schlimbach  // CHECK-SAME: : memref<3x120x120xi8>, i32, i32
9979eb406aSFrank Schlimbach  // CHECK-NEXT: memref.subview [[arg0]][117, 0, 0] [3, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<3x120x120xi8
10079eb406aSFrank Schlimbach  %res = mesh.update_halo %arg0 on @mesh0 split_axes = [[0]] halo_sizes = [2, 3] : memref<120x120x120xi8>
10179eb406aSFrank Schlimbach  // CHECK: return [[res:%.*]] : memref<120x120x120xi8>
10279eb406aSFrank Schlimbach  return %res : memref<120x120x120xi8>
10379eb406aSFrank Schlimbach}
10479eb406aSFrank Schlimbach
10579eb406aSFrank Schlimbach// -----
10679eb406aSFrank Schlimbachmesh.mesh @mesh0(shape = 3x4x5)
10779eb406aSFrank Schlimbachmemref.global constant @static_mpi_rank : memref<index> = dense<24>
10879eb406aSFrank Schlimbach// CHECK-LABEL: func @update_halo_3d
10979eb406aSFrank Schlimbachfunc.func @update_halo_3d(
11079eb406aSFrank Schlimbach  // CHECK-SAME: [[varg0:%.*]]: memref<120x120x120xi8>
11179eb406aSFrank Schlimbach  %arg0 : memref<120x120x120xi8>) -> memref<120x120x120xi8> {
11279eb406aSFrank Schlimbach  // CHECK: [[vc23_i32:%.*]] = arith.constant 23 : i32
11379eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc29_i32:%.*]] = arith.constant 29 : i32
11479eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc91_i32:%.*]] = arith.constant 91 : i32
11579eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc4_i32:%.*]] = arith.constant 4 : i32
11679eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc44_i32:%.*]] = arith.constant 44 : i32
11779eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc:%.*]] = memref.alloc() : memref<117x113x5xi8>
11879eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview:%.*]] = memref.subview [[varg0]][1, 3, 109] [117, 113, 5] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14869>>
11979eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview]], [[valloc]] : memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14869>> to memref<117x113x5xi8>
12079eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc]], [[vc91_i32]], [[vc4_i32]]) : memref<117x113x5xi8>, i32, i32
12179eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc]], [[vc91_i32]], [[vc44_i32]]) : memref<117x113x5xi8>, i32, i32
12279eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_0:%.*]] = memref.subview [[varg0]][1, 3, 0] [117, 113, 5] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14760>>
12379eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc]], [[vsubview_0]] : memref<117x113x5xi8> to memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14760>>
12479eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc]] : memref<117x113x5xi8>
12579eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_1:%.*]] = memref.alloc() : memref<117x113x6xi8>
12679eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_3:%.*]] = memref.subview [[varg0]][1, 3, 5] [117, 113, 6] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14765>>
12779eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview_3]], [[valloc_1]] : memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14765>> to memref<117x113x6xi8>
12879eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc_1]], [[vc91_i32]], [[vc44_i32]]) : memref<117x113x6xi8>, i32, i32
12979eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc_1]], [[vc91_i32]], [[vc4_i32]]) : memref<117x113x6xi8>, i32, i32
13079eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_4:%.*]] = memref.subview [[varg0]][1, 3, 114] [117, 113, 6] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14874>>
13179eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc_1]], [[vsubview_4]] : memref<117x113x6xi8> to memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14874>>
13279eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_1]] : memref<117x113x6xi8>
13379eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_5:%.*]] = memref.alloc() : memref<117x3x120xi8>
13479eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc_5]], [[vc91_i32]], [[vc29_i32]]) : memref<117x3x120xi8>, i32, i32
13579eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_7:%.*]] = memref.subview [[varg0]][1, 0, 0] [117, 3, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<117x3x120xi8, strided<[14400, 120, 1], offset: 14400>>
13679eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc_5]], [[vsubview_7]] : memref<117x3x120xi8> to memref<117x3x120xi8, strided<[14400, 120, 1], offset: 14400>>
13779eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_5]] : memref<117x3x120xi8>
13879eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_8:%.*]] = memref.alloc() : memref<117x4x120xi8>
13979eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_10:%.*]] = memref.subview [[varg0]][1, 3, 0] [117, 4, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<117x4x120xi8, strided<[14400, 120, 1], offset: 14760>>
14079eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview_10]], [[valloc_8]] : memref<117x4x120xi8, strided<[14400, 120, 1], offset: 14760>> to memref<117x4x120xi8>
14179eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc_8]], [[vc91_i32]], [[vc29_i32]]) : memref<117x4x120xi8>, i32, i32
14279eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_8]] : memref<117x4x120xi8>
14379eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_11:%.*]] = memref.alloc() : memref<1x120x120xi8>
14479eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_12:%.*]] = memref.subview [[varg0]][117, 0, 0] [1, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<1x120x120xi8, strided<[14400, 120, 1], offset: 1684800>>
14579eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview_12]], [[valloc_11]] : memref<1x120x120xi8, strided<[14400, 120, 1], offset: 1684800>> to memref<1x120x120xi8>
14679eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc_11]], [[vc91_i32]], [[vc23_i32]]) : memref<1x120x120xi8>, i32, i32
14779eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_11]] : memref<1x120x120xi8>
14879eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_13:%.*]] = memref.alloc() : memref<2x120x120xi8>
14979eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc_13]], [[vc91_i32]], [[vc23_i32]]) : memref<2x120x120xi8>, i32, i32
15079eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_14:%.*]] = memref.subview [[varg0]][118, 0, 0] [2, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<2x120x120xi8, strided<[14400, 120, 1], offset: 1699200>>
15179eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc_13]], [[vsubview_14]] : memref<2x120x120xi8> to memref<2x120x120xi8, strided<[14400, 120, 1], offset: 1699200>>
15279eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_13]] : memref<2x120x120xi8>
15379eb406aSFrank Schlimbach  %res = mesh.update_halo %arg0 on @mesh0 split_axes = [[2], [1], [0]] halo_sizes = [1, 2, 3, 4, 5, 6] : memref<120x120x120xi8>
15479eb406aSFrank Schlimbach  // CHECK: return [[varg0]] : memref<120x120x120xi8>
15579eb406aSFrank Schlimbach  return %res : memref<120x120x120xi8>
15679eb406aSFrank Schlimbach}
15779eb406aSFrank Schlimbach
15879eb406aSFrank Schlimbach// CHECK-LABEL: func @update_halo_3d_tensor
15979eb406aSFrank Schlimbachfunc.func @update_halo_3d_tensor(
16079eb406aSFrank Schlimbach  // CHECK-SAME: [[varg0:%.*]]: tensor<120x120x120xi8>
16179eb406aSFrank Schlimbach  %arg0 : tensor<120x120x120xi8>) -> tensor<120x120x120xi8> {
16279eb406aSFrank Schlimbach  // CHECK: [[vc23_i32:%.*]] = arith.constant 23 : i32
16379eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc29_i32:%.*]] = arith.constant 29 : i32
16479eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc44_i32:%.*]] = arith.constant 44 : i32
16579eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc4_i32:%.*]] = arith.constant 4 : i32
16679eb406aSFrank Schlimbach  // CHECK-NEXT: [[vc91_i32:%.*]] = arith.constant 91 : i32
167*b7749efbSFrank Schlimbach  // CHECK-NEXT: [[v0:%.*]] = bufferization.to_memref [[varg0]] : tensor<120x120x120xi8> to memref<120x120x120xi8>
16879eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc:%.*]] = memref.alloc() : memref<117x113x5xi8>
16979eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview:%.*]] = memref.subview [[v0]][1, 3, 109] [117, 113, 5] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14869>>
17079eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview]], [[valloc]] : memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14869>> to memref<117x113x5xi8>
17179eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc]], [[vc91_i32]], [[vc4_i32]]) : memref<117x113x5xi8>, i32, i32
17279eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc]], [[vc91_i32]], [[vc44_i32]]) : memref<117x113x5xi8>, i32, i32
17379eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_0:%.*]] = memref.subview [[v0]][1, 3, 0] [117, 113, 5] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14760>>
17479eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc]], [[vsubview_0]] : memref<117x113x5xi8> to memref<117x113x5xi8, strided<[14400, 120, 1], offset: 14760>>
17579eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc]] : memref<117x113x5xi8>
17679eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_1:%.*]] = memref.alloc() : memref<117x113x6xi8>
17779eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_3:%.*]] = memref.subview [[v0]][1, 3, 5] [117, 113, 6] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14765>>
17879eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview_3]], [[valloc_1]] : memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14765>> to memref<117x113x6xi8>
17979eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc_1]], [[vc91_i32]], [[vc44_i32]]) : memref<117x113x6xi8>, i32, i32
18079eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc_1]], [[vc91_i32]], [[vc4_i32]]) : memref<117x113x6xi8>, i32, i32
18179eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_4:%.*]] = memref.subview [[v0]][1, 3, 114] [117, 113, 6] [1, 1, 1] : memref<120x120x120xi8> to memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14874>>
18279eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc_1]], [[vsubview_4]] : memref<117x113x6xi8> to memref<117x113x6xi8, strided<[14400, 120, 1], offset: 14874>>
18379eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_1]] : memref<117x113x6xi8>
18479eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_5:%.*]] = memref.alloc() : memref<117x3x120xi8>
18579eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc_5]], [[vc91_i32]], [[vc29_i32]]) : memref<117x3x120xi8>, i32, i32
18679eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_7:%.*]] = memref.subview [[v0]][1, 0, 0] [117, 3, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<117x3x120xi8, strided<[14400, 120, 1], offset: 14400>>
18779eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc_5]], [[vsubview_7]] : memref<117x3x120xi8> to memref<117x3x120xi8, strided<[14400, 120, 1], offset: 14400>>
18879eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_5]] : memref<117x3x120xi8>
18979eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_8:%.*]] = memref.alloc() : memref<117x4x120xi8>
19079eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_10:%.*]] = memref.subview [[v0]][1, 3, 0] [117, 4, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<117x4x120xi8, strided<[14400, 120, 1], offset: 14760>>
19179eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview_10]], [[valloc_8]] : memref<117x4x120xi8, strided<[14400, 120, 1], offset: 14760>> to memref<117x4x120xi8>
19279eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc_8]], [[vc91_i32]], [[vc29_i32]]) : memref<117x4x120xi8>, i32, i32
19379eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_8]] : memref<117x4x120xi8>
19479eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_11:%.*]] = memref.alloc() : memref<1x120x120xi8>
19579eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_12:%.*]] = memref.subview [[v0]][117, 0, 0] [1, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<1x120x120xi8, strided<[14400, 120, 1], offset: 1684800>>
19679eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[vsubview_12]], [[valloc_11]] : memref<1x120x120xi8, strided<[14400, 120, 1], offset: 1684800>> to memref<1x120x120xi8>
19779eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.send([[valloc_11]], [[vc91_i32]], [[vc23_i32]]) : memref<1x120x120xi8>, i32, i32
19879eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_11]] : memref<1x120x120xi8>
19979eb406aSFrank Schlimbach  // CHECK-NEXT: [[valloc_13:%.*]] = memref.alloc() : memref<2x120x120xi8>
20079eb406aSFrank Schlimbach  // CHECK-NEXT: mpi.recv([[valloc_13]], [[vc91_i32]], [[vc23_i32]]) : memref<2x120x120xi8>, i32, i32
20179eb406aSFrank Schlimbach  // CHECK-NEXT: [[vsubview_14:%.*]] = memref.subview [[v0]][118, 0, 0] [2, 120, 120] [1, 1, 1] : memref<120x120x120xi8> to memref<2x120x120xi8, strided<[14400, 120, 1], offset: 1699200>>
20279eb406aSFrank Schlimbach  // CHECK-NEXT: memref.copy [[valloc_13]], [[vsubview_14]] : memref<2x120x120xi8> to memref<2x120x120xi8, strided<[14400, 120, 1], offset: 1699200>>
20379eb406aSFrank Schlimbach  // CHECK-NEXT: memref.dealloc [[valloc_13]] : memref<2x120x120xi8>
20479eb406aSFrank Schlimbach  // CHECK-NEXT: [[v1:%.*]] = bufferization.to_tensor [[v0]] restrict writable : memref<120x120x120xi8>
20579eb406aSFrank Schlimbach  %res = mesh.update_halo %arg0 on @mesh0 split_axes = [[2], [1], [0]] halo_sizes = [1, 2, 3, 4, 5, 6] : tensor<120x120x120xi8>
20679eb406aSFrank Schlimbach  // CHECK: return [[v1]] : tensor<120x120x120xi8>
20779eb406aSFrank Schlimbach  return %res : tensor<120x120x120xi8>
20879eb406aSFrank Schlimbach}
209