xref: /llvm-project/mlir/test/Interfaces/TilingInterface/tile-using-interface.mlir (revision d28a4f1fc02dc34a87fa22af0a053e8f1e7f6cea)
1aa2a96a2SMaheshRavishankar// RUN: mlir-opt --transform-interpreter --cse -split-input-file %s | FileCheck %s
2cf6a7c19SMahesh Ravishankar
3cf6a7c19SMahesh Ravishankarfunc.func @simple_matmul(%arg0 : tensor<?x?xf32>, %arg1 : tensor<?x?xf32>,
4cf6a7c19SMahesh Ravishankar    %arg2 : tensor<?x?xf32>) -> tensor<?x?xf32> {
5aa2a96a2SMaheshRavishankar  %0 = linalg.matmul ins(%arg0, %arg1 : tensor<?x?xf32>, tensor<?x?xf32>)
6cf6a7c19SMahesh Ravishankar      outs(%arg2 : tensor<?x?xf32>) -> tensor<?x?xf32>
7cf6a7c19SMahesh Ravishankar  return %0 : tensor<?x?xf32>
8cf6a7c19SMahesh Ravishankar}
9aa2a96a2SMaheshRavishankar
10aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
11aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
12aa2a96a2SMaheshRavishankar    %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg1
13aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
142c1c6767Ssrcarroll    %a, %b, %c = transform.structured.tile_using_for %matmul tile_sizes [10, 20]
15aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op)
16aa2a96a2SMaheshRavishankar    transform.yield
17aa2a96a2SMaheshRavishankar  }
18aa2a96a2SMaheshRavishankar}
196740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP0:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 10)>
206740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP1:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 20)>
21d4c4e491SNicolas Vasilache//      CHECK-LABEL: func.func @simple_matmul(
22cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[ARG0:[a-zA-Z0-9]+]]: tensor<?x?xf32>
23cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[ARG1:[a-zA-Z0-9]+]]: tensor<?x?xf32>
24cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[ARG2:[a-zA-Z0-9]+]]: tensor<?x?xf32>
25cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C0:.+]] = arith.constant 0 : index
26cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C1:.+]] = arith.constant 1 : index
27cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[M:.+]] = tensor.dim %[[ARG0]], %[[C0]]
28cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[K:.+]] = tensor.dim %[[ARG0]], %[[C1]]
29cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[N:.+]] = tensor.dim %[[ARG1]], %[[C1]]
306740d701SMaheshRavishankar//  CHECK-DAG:   %[[C10:.+]] = arith.constant 10 : index
316740d701SMaheshRavishankar//  CHECK-DAG:   %[[C20:.+]] = arith.constant 20 : index
32cf6a7c19SMahesh Ravishankar//      CHECK:   %[[OUTER:[a-zA-Z0-9]+]] = scf.for %[[IV0:[a-zA-Z0-9]+]] = %[[C0]] to %[[M]] step %[[C10]]
33cf6a7c19SMahesh Ravishankar// CHECK-SAME:       iter_args(%[[INIT0:.+]] = %[[ARG2]])
34cf6a7c19SMahesh Ravishankar//      CHECK:     %[[INNER:[a-zA-Z0-9]+]] = scf.for %[[IV1:[a-zA-Z0-9]+]] = %[[C0]] to %[[N]] step %[[C20]]
35cf6a7c19SMahesh Ravishankar// CHECK-SAME:         iter_args(%[[INIT1:.+]] = %[[INIT0]])
3676ead96cSMaheshRavishankar//  CHECK-DAG:       %[[TS_Y:.+]] = affine.min #[[$MAP0]](%[[IV0]])[%[[M]]]
37d4c4e491SNicolas Vasilache//      CHECK:       %[[TS_X:.+]] = affine.min #[[$MAP1]](%[[IV1]])[%[[N]]]
38cf6a7c19SMahesh Ravishankar//  CHECK-DAG:       %[[LHS_TILE:.+]] = tensor.extract_slice %[[ARG0]]
39cf6a7c19SMahesh Ravishankar// CHECK-SAME:           [%[[IV0]], 0] [%[[TS_Y]], %[[K]]] [1, 1]
40cf6a7c19SMahesh Ravishankar//  CHECK-DAG:       %[[RHS_TILE:.+]] = tensor.extract_slice %[[ARG1]]
41cf6a7c19SMahesh Ravishankar// CHECK-SAME:           [0, %[[IV1]]] [%[[K]], %[[TS_X]]] [1, 1]
42cf6a7c19SMahesh Ravishankar//  CHECK-DAG:       %[[INIT_TILE:.+]] = tensor.extract_slice %[[INIT1]]
43cf6a7c19SMahesh Ravishankar// CHECK-SAME:           [%[[IV0]], %[[IV1]]] [%[[TS_Y]], %[[TS_X]]] [1, 1]
44cf6a7c19SMahesh Ravishankar//      CHECK:       %[[GEMM_TILE:.+]] = linalg.matmul
45cf6a7c19SMahesh Ravishankar// CHECK-SAME:           ins(%[[LHS_TILE]], %[[RHS_TILE]] :
46cf6a7c19SMahesh Ravishankar// CHECK-SAME:           outs(%[[INIT_TILE]] :
47cf6a7c19SMahesh Ravishankar//      CHECK:       %[[UPDATE:.+]] = tensor.insert_slice %[[GEMM_TILE]] into %[[INIT1]]
48cf6a7c19SMahesh Ravishankar// CHECK-SAME:           [%[[IV0]], %[[IV1]]] [%[[TS_Y]], %[[TS_X]]] [1, 1]
49cf6a7c19SMahesh Ravishankar//      CHECK:       scf.yield %[[UPDATE]]
50cf6a7c19SMahesh Ravishankar//      CHECK:     scf.yield %[[INNER]]
51cf6a7c19SMahesh Ravishankar//      CHECK:   return %[[OUTER]]
52cf6a7c19SMahesh Ravishankar
53cf6a7c19SMahesh Ravishankar// -----
54cf6a7c19SMahesh Ravishankar
55cf6a7c19SMahesh Ravishankarfunc.func @simple_matmul_memref(%arg0 : memref<?x?xf32>, %arg1 : memref<?x?xf32>,
56cf6a7c19SMahesh Ravishankar    %arg2 : memref<?x?xf32>) {
57aa2a96a2SMaheshRavishankar  linalg.matmul ins(%arg0, %arg1 : memref<?x?xf32>, memref<?x?xf32>)
58cf6a7c19SMahesh Ravishankar      outs(%arg2 : memref<?x?xf32>)
59cf6a7c19SMahesh Ravishankar  return
60cf6a7c19SMahesh Ravishankar}
61aa2a96a2SMaheshRavishankar
62aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
63aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
64aa2a96a2SMaheshRavishankar    %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg1
65aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
662c1c6767Ssrcarroll    %a, %b, %c, %d = transform.structured.tile_using_for %matmul tile_sizes [10, 20, 30]
67aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op)
68aa2a96a2SMaheshRavishankar    transform.yield
69aa2a96a2SMaheshRavishankar  }
70aa2a96a2SMaheshRavishankar}
716740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP0:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 10)>
726740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP1:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 20)>
736740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP2:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 30)>
74d4c4e491SNicolas Vasilache//      CHECK-LABEL: func.func @simple_matmul_memref(
75cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[ARG0:[a-zA-Z0-9]+]]: memref<?x?xf32>
76cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[ARG1:[a-zA-Z0-9]+]]: memref<?x?xf32>
77cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[ARG2:[a-zA-Z0-9]+]]: memref<?x?xf32>
78cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C0:.+]] = arith.constant 0 : index
79cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C1:.+]] = arith.constant 1 : index
80cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[M:.+]] = memref.dim %[[ARG0]], %[[C0]]
81cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[K:.+]] = memref.dim %[[ARG0]], %[[C1]]
82cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[N:.+]] = memref.dim %[[ARG1]], %[[C1]]
836740d701SMaheshRavishankar//  CHECK-DAG:   %[[C10:.+]] = arith.constant 10 : index
84aa2a96a2SMaheshRavishankar//  CHECK-DAG:   %[[C20:.+]] = arith.constant 20 : index
85aa2a96a2SMaheshRavishankar//  CHECK-DAG:   %[[C30:.+]] = arith.constant 30 : index
866740d701SMaheshRavishankar//      CHECK:   scf.for %[[IV0:[a-zA-Z0-9]+]] = %[[C0]] to %[[M]] step %[[C10]]
876740d701SMaheshRavishankar//      CHECK:     scf.for %[[IV1:[a-zA-Z0-9]+]] = %[[C0]] to %[[N]] step %[[C20]]
88cf6a7c19SMahesh Ravishankar//      CHECK:       scf.for %[[IV2:[a-zA-Z0-9]+]] = %[[C0]] to %[[K]] step %[[C30]]
8976ead96cSMaheshRavishankar//  CHECK-DAG:         %[[TS_M:.+]] = affine.min #[[$MAP0]](%[[IV0]])[%[[M]]]
9076ead96cSMaheshRavishankar//  CHECK-DAG:         %[[TS_N:.+]] = affine.min #[[$MAP1]](%[[IV1]])[%[[N]]]
9176ead96cSMaheshRavishankar//  CHECK-DAG:         %[[TS_K:.+]] = affine.min #[[$MAP2]](%[[IV2]])[%[[K]]]
92cf6a7c19SMahesh Ravishankar//  CHECK-DAG:         %[[LHS_TILE:.+]] = memref.subview %[[ARG0]]
93cf6a7c19SMahesh Ravishankar// CHECK-SAME:             [%[[IV0]], %[[IV2]]] [%[[TS_M]], %[[TS_K]]] [1, 1]
94cf6a7c19SMahesh Ravishankar//  CHECK-DAG:         %[[RHS_TILE:.+]] = memref.subview %[[ARG1]]
95cf6a7c19SMahesh Ravishankar// CHECK-SAME:             [%[[IV2]], %[[IV1]]] [%[[TS_K]], %[[TS_N]]] [1, 1]
96cf6a7c19SMahesh Ravishankar//  CHECK-DAG:         %[[OUT_TILE:.+]] = memref.subview %[[ARG2]]
97cf6a7c19SMahesh Ravishankar// CHECK-SAME:             [%[[IV0]], %[[IV1]]] [%[[TS_M]], %[[TS_N]]] [1, 1]
98cf6a7c19SMahesh Ravishankar//      CHECK:         linalg.matmul
99cf6a7c19SMahesh Ravishankar// CHECK-SAME:             ins(%[[LHS_TILE]], %[[RHS_TILE]] :
100cf6a7c19SMahesh Ravishankar// CHECK-SAME:             outs(%[[OUT_TILE]] :
101cf6a7c19SMahesh Ravishankar
102cf6a7c19SMahesh Ravishankar// -----
103cf6a7c19SMahesh Ravishankar
104cf6a7c19SMahesh Ravishankar#map0 = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
105cf6a7c19SMahesh Ravishankar#map1 = affine_map<(d0, d1, d2) -> (d0, d2, d1)>
106cf6a7c19SMahesh Ravishankar#map2 = affine_map<(d0, d1, d2) -> (d2, d0, d1)>
107cf6a7c19SMahesh Ravishankarfunc.func @multi_result(%arg0 : tensor<128x200x300xf32>) -> (tensor<128x300x200xf32>, tensor<300x128x200xf32>) {
10881ca5aa4SMatthias Springer  %init0 = tensor.empty() : tensor<128x300x200xf32>
10981ca5aa4SMatthias Springer  %init1 = tensor.empty() : tensor<300x128x200xf32>
110cf6a7c19SMahesh Ravishankar  %0:2 = linalg.generic {
111cf6a7c19SMahesh Ravishankar      indexing_maps = [#map0, #map1, #map2],
112cf6a7c19SMahesh Ravishankar      iterator_types = ["parallel", "parallel", "parallel"]}
113cf6a7c19SMahesh Ravishankar      ins(%arg0 : tensor<128x200x300xf32>)
114cf6a7c19SMahesh Ravishankar      outs(%init0, %init1 : tensor<128x300x200xf32>, tensor<300x128x200xf32>) {
115cf6a7c19SMahesh Ravishankar    ^bb0(%b0 : f32, %b1 : f32, %b2 : f32):
116cf6a7c19SMahesh Ravishankar      linalg.yield %b0, %b0 : f32, f32
117cf6a7c19SMahesh Ravishankar    } -> (tensor<128x300x200xf32>, tensor<300x128x200xf32>)
118cf6a7c19SMahesh Ravishankar  return %0#0, %0#1 : tensor<128x300x200xf32>, tensor<300x128x200xf32>
119cf6a7c19SMahesh Ravishankar}
120aa2a96a2SMaheshRavishankar
121aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
122aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
123aa2a96a2SMaheshRavishankar    %generic = transform.structured.match ops{["linalg.generic"]} in %arg1
124aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
1252c1c6767Ssrcarroll    %a, %b, %c = transform.structured.tile_using_for %generic tile_sizes [10, 0, 20]
126aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op)
127aa2a96a2SMaheshRavishankar    transform.yield
128aa2a96a2SMaheshRavishankar  }
129aa2a96a2SMaheshRavishankar}
1306740d701SMaheshRavishankar//   CHECK-DAG: #[[$MAP0:.+]] = affine_map<(d0) -> (-d0 + 128, 10)>
131d4c4e491SNicolas Vasilache// CHECK-LABEL: func.func @multi_result(
132cf6a7c19SMahesh Ravishankar//  CHECK-SAME:     %[[ARG0:[a-zA-Z0-9]+]]: tensor<128x200x300xf32>)
13381ca5aa4SMatthias Springer//   CHECK-DAG:   %[[INIT0:.+]] = tensor.empty()
13481ca5aa4SMatthias Springer//   CHECK-DAG:   %[[INIT1:.+]] = tensor.empty()
1356740d701SMaheshRavishankar//   CHECK-DAG:   %[[C0:.+]] = arith.constant 0 : index
1366740d701SMaheshRavishankar//   CHECK-DAG:   %[[C128:.+]] = arith.constant 128 : index
1376740d701SMaheshRavishankar//   CHECK-DAG:   %[[C300:.+]] = arith.constant 300 : index
1386740d701SMaheshRavishankar//   CHECK-DAG:   %[[C10:.+]] = arith.constant 10 : index
1396740d701SMaheshRavishankar//   CHECK-DAG:   %[[C20:.+]] = arith.constant 20 : index
140cf6a7c19SMahesh Ravishankar//       CHECK:   %[[OUTER:[a-zA-Z0-9]+]]:2 = scf.for %[[IV0:[a-zA-Z0-9]+]] = %[[C0]] to %[[C128]] step %[[C10]]
141cf6a7c19SMahesh Ravishankar//  CHECK-SAME:       iter_args(%[[ARG1:[a-zA-Z0-9]+]] = %[[INIT0]], %[[ARG2:[a-zA-Z0-9]+]] = %[[INIT1]])
142cf6a7c19SMahesh Ravishankar//       CHECK:     %[[INNER:[a-zA-Z0-9]+]]:2 = scf.for %[[IV1:[a-zA-Z0-9]+]] = %[[C0]] to %[[C300]] step %[[C20]]
143cf6a7c19SMahesh Ravishankar//  CHECK-SAME:         iter_args(%[[ARG3:[a-zA-Z0-9]+]] = %[[ARG1]], %[[ARG4:[a-zA-Z0-9]+]] = %[[ARG2]])
14476ead96cSMaheshRavishankar//   CHECK-DAG:       %[[TS_Y:.+]] = affine.min #[[$MAP0]](%[[IV0]])
145cf6a7c19SMahesh Ravishankar//   CHECK-DAG:       %[[ARG_TILE:.+]] = tensor.extract_slice %[[ARG0]]
146954de25aSlorenzo chelini//  CHECK-SAME:           [%[[IV0]], 0, %[[IV1]]] [%[[TS_Y]], 200, 20] [1, 1, 1]
147cf6a7c19SMahesh Ravishankar//   CHECK-DAG:       %[[INIT0_TILE:.+]] = tensor.extract_slice %[[ARG3]]
148954de25aSlorenzo chelini//  CHECK-SAME:           [%[[IV0]], %[[IV1]], 0] [%[[TS_Y]], 20, 200] [1, 1, 1]
149cf6a7c19SMahesh Ravishankar//   CHECK-DAG:       %[[INIT1_TILE:.+]] = tensor.extract_slice %[[ARG4]]
150954de25aSlorenzo chelini//  CHECK-SAME:           [%[[IV1]], %[[IV0]], 0] [20, %[[TS_Y]], 200] [1, 1, 1]
151cf6a7c19SMahesh Ravishankar//       CHECK:       %[[RESULT_TILE:.+]]:2 = linalg.generic
152cf6a7c19SMahesh Ravishankar//  CHECK-SAME:           ins(%[[ARG_TILE]] :
153cf6a7c19SMahesh Ravishankar//  CHECK-SAME:           outs(%[[INIT0_TILE]], %[[INIT1_TILE]] :
154cf6a7c19SMahesh Ravishankar//       CHECK:       %[[UPDATE0:.+]] = tensor.insert_slice %[[RESULT_TILE]]#0 into %[[ARG3]]
155954de25aSlorenzo chelini//  CHECK-SAME:           [%[[IV0]], %[[IV1]], 0] [%[[TS_Y]], 20, 200] [1, 1, 1]
156cf6a7c19SMahesh Ravishankar//       CHECK:       %[[UPDATE1:.+]] = tensor.insert_slice %[[RESULT_TILE]]#1 into %[[ARG4]]
157954de25aSlorenzo chelini//  CHECK-SAME:           [%[[IV1]], %[[IV0]], 0] [20, %[[TS_Y]], 200] [1, 1, 1]
158cf6a7c19SMahesh Ravishankar//       CHECK:       scf.yield %[[UPDATE0]], %[[UPDATE1]]
159cf6a7c19SMahesh Ravishankar//       CHECK:     scf.yield %[[INNER]]#0, %[[INNER]]#1
160cf6a7c19SMahesh Ravishankar//       CHECK:   return %[[OUTER]]#0, %[[OUTER]]#1
161cf6a7c19SMahesh Ravishankar
162cf6a7c19SMahesh Ravishankar// -----
163cf6a7c19SMahesh Ravishankar
164cf6a7c19SMahesh Ravishankarfunc.func @conv2D(%arg0 : tensor<?x?x?x?xf32>, %arg1 : tensor<?x?x?x?xf32>,
165cf6a7c19SMahesh Ravishankar    %arg2 : tensor<?x?x?x?xf32>) -> tensor<?x?x?x?xf32> {
166cf6a7c19SMahesh Ravishankar  %0 = linalg.conv_2d_nhwc_hwcf {
167cf6a7c19SMahesh Ravishankar      strides = dense<[2, 3]> : tensor<2xi64>,
168aa2a96a2SMaheshRavishankar      dilation = dense<[4, 5]> : tensor<2xi64>}
169cf6a7c19SMahesh Ravishankar      ins(%arg0, %arg1 : tensor<?x?x?x?xf32>, tensor<?x?x?x?xf32>)
170cf6a7c19SMahesh Ravishankar      outs(%arg2 : tensor<?x?x?x?xf32>) -> tensor<?x?x?x?xf32>
171cf6a7c19SMahesh Ravishankar  return %0 : tensor<?x?x?x?xf32>
172cf6a7c19SMahesh Ravishankar}
173aa2a96a2SMaheshRavishankar
174aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
175aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
176aa2a96a2SMaheshRavishankar    %conv = transform.structured.match ops{["linalg.conv_2d_nhwc_hwcf"]} in %arg1
177aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
1782c1c6767Ssrcarroll    %a, %b, %c, %d = transform.structured.tile_using_for %conv tile_sizes [0, 0, 0, 0, 10, 20, 30]
179aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op)
180aa2a96a2SMaheshRavishankar    transform.yield
181aa2a96a2SMaheshRavishankar  }
182aa2a96a2SMaheshRavishankar}
1836740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP0:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 10)>
1846740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP1:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 20)>
1856740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP2:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 30)>
186d4c4e491SNicolas Vasilache//  CHECK-DAG: #[[$MAP3:.+]] = affine_map<(d0)[s0] -> (d0 + s0 * 2 - 2)>
187d4c4e491SNicolas Vasilache//  CHECK-DAG: #[[$MAP4:.+]] = affine_map<(d0)[s0] -> (d0 + s0 * 3 - 3)>
188d4c4e491SNicolas Vasilache//      CHECK-LABEL: func.func @conv2D(
189cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[INPUT:[a-zA-Z0-9]+]]: tensor<?x?x?x?xf32>
190cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[FILTER:[a-zA-Z0-9]+]]: tensor<?x?x?x?xf32>
191cf6a7c19SMahesh Ravishankar// CHECK-SAME:     %[[INIT:[a-zA-Z0-9]+]]: tensor<?x?x?x?xf32>
192cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C0:.+]] = arith.constant 0 : index
193cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C1:.+]] = arith.constant 1 : index
194cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C2:.+]] = arith.constant 2 : index
195cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C3:.+]] = arith.constant 3 : index
196cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[N:.+]] = tensor.dim %[[INPUT]], %[[C0]]
197cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[C:.+]] = tensor.dim %[[INPUT]], %[[C3]]
198cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[P:.+]] = tensor.dim %[[FILTER]], %[[C0]]
199cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[Q:.+]] = tensor.dim %[[FILTER]], %[[C1]]
200cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[F:.+]] = tensor.dim %[[FILTER]], %[[C3]]
201cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[R:.+]] = tensor.dim %[[INIT]], %[[C1]]
202cf6a7c19SMahesh Ravishankar//  CHECK-DAG:   %[[S:.+]] = tensor.dim %[[INIT]], %[[C2]]
2036740d701SMaheshRavishankar//  CHECK-DAG:   %[[C10:.+]] = arith.constant 10 : index
2046740d701SMaheshRavishankar//  CHECK-DAG:   %[[C20:.+]] = arith.constant 20 : index
2056740d701SMaheshRavishankar//  CHECK-DAG:   %[[C30:.+]] = arith.constant 30 : index
206cf6a7c19SMahesh Ravishankar//      CHECK:   scf.for %[[IV0:[a-zA-Z0-9]+]] = %[[C0]] to %[[P]] step %[[C10]]
207cf6a7c19SMahesh Ravishankar// CHECK-SAME:       iter_args(%[[INIT0:.+]] = %[[INIT]])
208cf6a7c19SMahesh Ravishankar//      CHECK:     scf.for %[[IV1:[a-zA-Z0-9]+]] = %[[C0]] to %[[Q]] step %[[C20]]
209cf6a7c19SMahesh Ravishankar// CHECK-SAME:         iter_args(%[[INIT1:.+]] = %[[INIT0]])
210cf6a7c19SMahesh Ravishankar//      CHECK:       scf.for %[[IV2:[a-zA-Z0-9]+]] = %[[C0]] to %[[C]] step %[[C30]]
211cf6a7c19SMahesh Ravishankar// CHECK-SAME:           iter_args(%[[INIT2:.+]] = %[[INIT1]])
21276ead96cSMaheshRavishankar//  CHECK-DAG:         %[[TS_P:.+]] = affine.min #[[$MAP0]](%[[IV0]])[%[[P]]]
21376ead96cSMaheshRavishankar//  CHECK-DAG:         %[[TS_Q:.+]] = affine.min #[[$MAP1]](%[[IV1]])[%[[Q]]]
214d4c4e491SNicolas Vasilache//  CHECK-DAG:         %[[TS_C:.+]] = affine.min #[[$MAP2]](%[[IV2]])[%[[C]]]
215d4c4e491SNicolas Vasilache//  CHECK-DAG:         %[[TS_H:.+]] = affine.apply #[[$MAP3]](%[[TS_P]])[%[[R]]]
216d4c4e491SNicolas Vasilache//  CHECK-DAG:         %[[TS_W:.+]] = affine.apply #[[$MAP4]](%[[TS_Q]])[%[[S]]]
217cf6a7c19SMahesh Ravishankar//  CHECK-DAG:         %[[INPUT_TILE:.+]] = tensor.extract_slice %[[INPUT]]
218cf6a7c19SMahesh Ravishankar// CHECK-SAME:             [0, %[[IV0]], %[[IV1]], %[[IV2]]] [%[[N]], %[[TS_H]], %[[TS_W]], %[[TS_C]]]
219cf6a7c19SMahesh Ravishankar//  CHECK-DAG:         %[[FILTER_TILE:.+]] = tensor.extract_slice %[[FILTER]]
220cf6a7c19SMahesh Ravishankar// CHECK-SAME:             [%[[IV0]], %[[IV1]], %[[IV2]], 0] [%[[TS_P]], %[[TS_Q]], %[[TS_C]], %[[F]]]
221cf6a7c19SMahesh Ravishankar//  CHECK-DAG:         %[[INIT_TILE:.+]] = tensor.extract_slice %[[INIT2]]
222cf6a7c19SMahesh Ravishankar// CHECK-SAME:             [0, 0, 0, 0] [%[[N]], %[[R]], %[[S]], %[[F]]]
223cf6a7c19SMahesh Ravishankar//      CHECK:         %[[CONV_TILE:.+]] = linalg.conv_2d_nhwc_hwcf
224cf6a7c19SMahesh Ravishankar// CHECK-SAME:             dilation = dense<[4, 5]> : tensor<2xi64>, strides = dense<[2, 3]> : tensor<2xi64>
225cf6a7c19SMahesh Ravishankar// CHECK-SAME:             ins(%[[INPUT_TILE]], %[[FILTER_TILE]] :
226cf6a7c19SMahesh Ravishankar// CHECK-SAME:             outs(%[[INIT_TILE]] :
227cf6a7c19SMahesh Ravishankar//      CHECK:         tensor.insert_slice %[[CONV_TILE]] into %[[INIT2]]
228cf6a7c19SMahesh Ravishankar// CHECK-SAME:             [0, 0, 0, 0] [%[[N]], %[[R]], %[[S]], %[[F]]]
22981b62f7fSAlex Zinenko
23081b62f7fSAlex Zinenko// -----
23181b62f7fSAlex Zinenko
23281b62f7fSAlex Zinenkofunc.func @indexed_semantics(%arg0: tensor<?x?xf32>, %arg1: tensor<?x?xf32>) -> tensor<?x?xf32> {
23381b62f7fSAlex Zinenko  // Check that we correctly amend "linalg.index" results.
23481b62f7fSAlex Zinenko
23581b62f7fSAlex Zinenko  %0 = linalg.generic {
23681b62f7fSAlex Zinenko    indexing_maps = [affine_map<(d0, d1) -> (d0, d1)>,
23781b62f7fSAlex Zinenko                     affine_map<(d0, d1) -> (d0, d1)>],
23881b62f7fSAlex Zinenko    iterator_types = ["parallel", "parallel"]}
23981b62f7fSAlex Zinenko    ins(%arg0: tensor<?x?xf32>)
24081b62f7fSAlex Zinenko    outs(%arg1: tensor<?x?xf32>) {
24181b62f7fSAlex Zinenko  ^bb0(%arg2: f32, %arg3: f32):
24281b62f7fSAlex Zinenko    %1 = linalg.index 0 : index
24381b62f7fSAlex Zinenko    %2 = linalg.index 1 : index
24481b62f7fSAlex Zinenko    %3 = arith.addi %1, %2 : index
24581b62f7fSAlex Zinenko    %4 = arith.index_cast %3 : index to i64
24681b62f7fSAlex Zinenko    %5 = arith.uitofp %4 : i64 to f32
24781b62f7fSAlex Zinenko    %6 = arith.addf %5, %arg2 : f32
24881b62f7fSAlex Zinenko    linalg.yield %6 : f32
24981b62f7fSAlex Zinenko  } -> (tensor<?x?xf32>)
25081b62f7fSAlex Zinenko  return %0 : tensor<?x?xf32>
25181b62f7fSAlex Zinenko}
252aa2a96a2SMaheshRavishankar
253aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
254aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
255aa2a96a2SMaheshRavishankar    %generic = transform.structured.match ops{["linalg.generic"]} in %arg1
256aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
2572c1c6767Ssrcarroll    %a, %b, %c = transform.structured.tile_using_for %generic tile_sizes [10, 20]
258aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op)
259aa2a96a2SMaheshRavishankar    transform.yield
260aa2a96a2SMaheshRavishankar  }
261aa2a96a2SMaheshRavishankar}
262*d28a4f1fSlonely eagle//       CHECK: #[[$MAP_ADD:.+]] = affine_map<(d0)[s0] -> (d0 + s0)>
2634a020018SMaheshRavishankar// CHECK-LABEL: @indexed_semantics
2644a020018SMaheshRavishankar//       CHECK:   scf.for %[[I0:.+]] = %{{.*}} to %{{.*}} step %{{.*}}
2654a020018SMaheshRavishankar//       CHECK:     scf.for %[[I1:.+]] = %{{.*}} to %{{.*}} step %{{.*}}
2664a020018SMaheshRavishankar//       CHECK:       %[[INDEX0:.+]] = linalg.index 0
267*d28a4f1fSlonely eagle//       CHECK:       %[[INDEX0_AMENDED:.+]] = affine.apply #[[$MAP_ADD]](%[[I0]])[%[[INDEX0]]]
2684a020018SMaheshRavishankar//       CHECK:       %[[INDEX1:.+]] = linalg.index 1
269*d28a4f1fSlonely eagle//       CHECK:       %[[INDEX1_AMENDED:.+]] = affine.apply #[[$MAP_ADD]](%[[I1]])[%[[INDEX1]]]
2704a020018SMaheshRavishankar//       CHECK:       arith.addi %[[INDEX0_AMENDED]], %[[INDEX1_AMENDED]]
271b8a1f00dSMahesh Ravishankar
272b8a1f00dSMahesh Ravishankar// -----
273b8a1f00dSMahesh Ravishankar
274b8a1f00dSMahesh Ravishankarfunc.func @interchange_matmul(%arg0 : tensor<?x?xf32>, %arg1 : tensor<?x?xf32>,
275b8a1f00dSMahesh Ravishankar    %arg2 : tensor<?x?xf32>) -> tensor<?x?xf32> {
276aa2a96a2SMaheshRavishankar  %0 = linalg.matmul ins(%arg0, %arg1 : tensor<?x?xf32>, tensor<?x?xf32>)
277b8a1f00dSMahesh Ravishankar      outs(%arg2 : tensor<?x?xf32>) -> tensor<?x?xf32>
278b8a1f00dSMahesh Ravishankar  return %0 : tensor<?x?xf32>
279b8a1f00dSMahesh Ravishankar}
280aa2a96a2SMaheshRavishankar
281aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
282aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
283aa2a96a2SMaheshRavishankar    %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg1
284aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
2852c1c6767Ssrcarroll    %a, %b, %c, %d = transform.structured.tile_using_for %matmul tile_sizes [10, 20, 30] interchange = [1, 2, 0]
286aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op)
287aa2a96a2SMaheshRavishankar    transform.yield
288aa2a96a2SMaheshRavishankar  }
289aa2a96a2SMaheshRavishankar}
2906740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP0:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 20)>
2916740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP1:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 30)>
2926740d701SMaheshRavishankar//  CHECK-DAG: #[[$MAP2:.+]] = affine_map<(d0)[s0] -> (-d0 + s0, 10)>
293d4c4e491SNicolas Vasilache//      CHECK-LABEL: func.func @interchange_matmul(
294b8a1f00dSMahesh Ravishankar// CHECK-SAME:     %[[ARG0:[a-zA-Z0-9]+]]: tensor<?x?xf32>
295b8a1f00dSMahesh Ravishankar// CHECK-SAME:     %[[ARG1:[a-zA-Z0-9]+]]: tensor<?x?xf32>
296b8a1f00dSMahesh Ravishankar// CHECK-SAME:     %[[ARG2:[a-zA-Z0-9]+]]: tensor<?x?xf32>
297b8a1f00dSMahesh Ravishankar//  CHECK-DAG:   %[[C0:.+]] = arith.constant 0 : index
298b8a1f00dSMahesh Ravishankar//  CHECK-DAG:   %[[C1:.+]] = arith.constant 1 : index
299b8a1f00dSMahesh Ravishankar//  CHECK-DAG:   %[[M:.+]] = tensor.dim %[[ARG0]], %[[C0]]
300b8a1f00dSMahesh Ravishankar//  CHECK-DAG:   %[[K:.+]] = tensor.dim %[[ARG0]], %[[C1]]
301b8a1f00dSMahesh Ravishankar//  CHECK-DAG:   %[[N:.+]] = tensor.dim %[[ARG1]], %[[C1]]
3026740d701SMaheshRavishankar//  CHECK-DAG:   %[[C10:.+]] = arith.constant 10 : index
3036740d701SMaheshRavishankar//  CHECK-DAG:   %[[C20:.+]] = arith.constant 20 : index
3046740d701SMaheshRavishankar//  CHECK-DAG:   %[[C30:.+]] = arith.constant 30 : index
305b8a1f00dSMahesh Ravishankar//      CHECK:   %[[OUTER:[a-zA-Z0-9]+]] = scf.for %[[IV0:[a-zA-Z0-9]+]] = %[[C0]] to %[[N]] step %[[C20]]
306b8a1f00dSMahesh Ravishankar// CHECK-SAME:       iter_args(%[[INIT0:.+]] = %[[ARG2]])
307b8a1f00dSMahesh Ravishankar//      CHECK:     %[[INNER1:[a-zA-Z0-9]+]] = scf.for %[[IV1:[a-zA-Z0-9]+]] = %[[C0]] to %[[K]] step %[[C30]]
308b8a1f00dSMahesh Ravishankar// CHECK-SAME:         iter_args(%[[INIT1:.+]] = %[[INIT0]])
309b8a1f00dSMahesh Ravishankar//      CHECK:       %[[INNER2:[a-zA-Z0-9]+]] = scf.for %[[IV2:[a-zA-Z0-9]+]] = %[[C0]] to %[[M]] step %[[C10]]
310b8a1f00dSMahesh Ravishankar// CHECK-SAME:           iter_args(%[[INIT2:.+]] = %[[INIT1]])
31176ead96cSMaheshRavishankar//  CHECK-DAG:         %[[TS_N:.+]] = affine.min #[[$MAP0]](%[[IV0]])[%[[N]]]
31276ead96cSMaheshRavishankar//  CHECK-DAG:         %[[TS_K:.+]] = affine.min #[[$MAP1]](%[[IV1]])[%[[K]]]
313d4c4e491SNicolas Vasilache//  CHECK-DAG:         %[[TS_M:.+]] = affine.min #[[$MAP2]](%[[IV2]])[%[[M]]]
314b8a1f00dSMahesh Ravishankar//  CHECK-DAG:         %[[LHS_TILE:.+]] = tensor.extract_slice %[[ARG0]]
315b8a1f00dSMahesh Ravishankar// CHECK-SAME:             [%[[IV2]], %[[IV1]]] [%[[TS_M]], %[[TS_K]]] [1, 1]
316b8a1f00dSMahesh Ravishankar//  CHECK-DAG:         %[[RHS_TILE:.+]] = tensor.extract_slice %[[ARG1]]
317b8a1f00dSMahesh Ravishankar// CHECK-SAME:             [%[[IV1]], %[[IV0]]] [%[[TS_K]], %[[TS_N]]] [1, 1]
318b8a1f00dSMahesh Ravishankar//  CHECK-DAG:         %[[INIT_TILE:.+]] = tensor.extract_slice %[[INIT2]]
319b8a1f00dSMahesh Ravishankar// CHECK-SAME:             [%[[IV2]], %[[IV0]]] [%[[TS_M]], %[[TS_N]]] [1, 1]
320b8a1f00dSMahesh Ravishankar//      CHECK:         %[[GEMM_TILE:.+]] = linalg.matmul
321b8a1f00dSMahesh Ravishankar// CHECK-SAME:             ins(%[[LHS_TILE]], %[[RHS_TILE]] :
322b8a1f00dSMahesh Ravishankar// CHECK-SAME:             outs(%[[INIT_TILE]] :
323b8a1f00dSMahesh Ravishankar//      CHECK:         %[[UPDATE:.+]] = tensor.insert_slice %[[GEMM_TILE]] into %[[INIT2]]
324b8a1f00dSMahesh Ravishankar// CHECK-SAME:             [%[[IV2]], %[[IV0]]] [%[[TS_M]], %[[TS_N]]] [1, 1]
325b8a1f00dSMahesh Ravishankar//      CHECK:         scf.yield %[[UPDATE]]
326b8a1f00dSMahesh Ravishankar//      CHECK:       scf.yield %[[INNER2]]
327b8a1f00dSMahesh Ravishankar//      CHECK:     scf.yield %[[INNER1]]
328b8a1f00dSMahesh Ravishankar//      CHECK:   return %[[OUTER]]
32922684599SMatthias Springer
33022684599SMatthias Springer// -----
33122684599SMatthias Springer
3324a020018SMaheshRavishankarfunc.func @linalg_copy_matmul(%a: memref<?x?xf32>, %b: memref<?x?xf32>) {
333aa2a96a2SMaheshRavishankar  linalg.copy ins(%a : memref<?x?xf32>) outs(%b : memref<?x?xf32>)
3344a020018SMaheshRavishankar  return
3354a020018SMaheshRavishankar}
336aa2a96a2SMaheshRavishankar
337aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
338aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
339aa2a96a2SMaheshRavishankar    %copy = transform.structured.match ops{["linalg.copy"]} in %arg1
340aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
3412c1c6767Ssrcarroll    %a, %b, %c = transform.structured.tile_using_for %copy tile_sizes [10, 20]
342aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op)
343aa2a96a2SMaheshRavishankar    transform.yield
344aa2a96a2SMaheshRavishankar  }
345aa2a96a2SMaheshRavishankar}
34622684599SMatthias Springer// CHECK-LABEL: func @linalg_copy_matmul(
34722684599SMatthias Springer//       CHECK:   scf.for
34822684599SMatthias Springer//       CHECK:     scf.for
34922684599SMatthias Springer//       CHECK:       memref.subview
35022684599SMatthias Springer//       CHECK:       memref.subview
35122684599SMatthias Springer//       CHECK:       linalg.copy
3524a020018SMaheshRavishankar
3534a020018SMaheshRavishankar// -----
3544a020018SMaheshRavishankar
3554a020018SMaheshRavishankarfunc.func @check_scalar_operation(%arg0 : tensor<f32>) -> tensor<f32> {
3564a020018SMaheshRavishankar  %init = tensor.empty() : tensor<f32>
3574a020018SMaheshRavishankar  %0 = linalg.generic {
3584a020018SMaheshRavishankar      indexing_maps = [affine_map<() -> ()>, affine_map<() -> ()>],
3594a020018SMaheshRavishankar      iterator_types = []}
3604a020018SMaheshRavishankar      ins(%arg0 : tensor<f32>) outs(%init : tensor<f32>){
3614a020018SMaheshRavishankar    ^bb0(%b0 : f32, %b1 : f32):
3624a020018SMaheshRavishankar      %1 = arith.mulf %b0, %b0 : f32
3634a020018SMaheshRavishankar      linalg.yield %1 : f32
3644a020018SMaheshRavishankar  } -> tensor<f32>
3654a020018SMaheshRavishankar  return %0 : tensor<f32>
3664a020018SMaheshRavishankar}
367aa2a96a2SMaheshRavishankar
368aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
369aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
370aa2a96a2SMaheshRavishankar    %generic = transform.structured.match ops{["linalg.generic"]} in %arg1
371aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
3722c1c6767Ssrcarroll    %a = transform.structured.tile_using_for %generic tile_sizes []
373aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op)
374aa2a96a2SMaheshRavishankar    transform.yield
375aa2a96a2SMaheshRavishankar  }
376aa2a96a2SMaheshRavishankar}
3774a020018SMaheshRavishankar// CHECK-LABEL: func @check_scalar_operation
3784a020018SMaheshRavishankar//   CHECK-NOT:   scf.for
3794a020018SMaheshRavishankar//       CHECK:   linalg.generic
3804a020018SMaheshRavishankar
3814a020018SMaheshRavishankar// -----
3824a020018SMaheshRavishankar
3834a020018SMaheshRavishankarfunc.func @check_scalar_memref_operation(%arg0 : memref<f32>, %arg1 : memref<f32>){
3844a020018SMaheshRavishankar  linalg.generic {
3854a020018SMaheshRavishankar      indexing_maps = [affine_map<() -> ()>, affine_map<() -> ()>],
3864a020018SMaheshRavishankar      iterator_types = []}
3874a020018SMaheshRavishankar      ins(%arg0 : memref<f32>) outs(%arg1 : memref<f32>){
3884a020018SMaheshRavishankar    ^bb0(%b0 : f32, %b1 : f32):
3894a020018SMaheshRavishankar      %1 = arith.mulf %b0, %b0 : f32
3904a020018SMaheshRavishankar      linalg.yield %1 : f32
3914a020018SMaheshRavishankar  }
39222684599SMatthias Springer  return
39322684599SMatthias Springer}
394aa2a96a2SMaheshRavishankar
395aa2a96a2SMaheshRavishankarmodule attributes {transform.with_named_sequence} {
396aa2a96a2SMaheshRavishankar  transform.named_sequence @__transform_main(%arg1 : !transform.any_op {transform.readonly}) {
397aa2a96a2SMaheshRavishankar    %generic = transform.structured.match ops{["linalg.generic"]} in %arg1
398aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> !transform.any_op
3992c1c6767Ssrcarroll    %a = transform.structured.tile_using_for %generic tile_sizes []
400aa2a96a2SMaheshRavishankar      : (!transform.any_op) -> (!transform.any_op)
401aa2a96a2SMaheshRavishankar    transform.yield
402aa2a96a2SMaheshRavishankar  }
403aa2a96a2SMaheshRavishankar}
4044a020018SMaheshRavishankar// CHECK-LABEL: func @check_scalar_memref_operation
4054a020018SMaheshRavishankar//   CHECK-NOT:   scf.for
4064a020018SMaheshRavishankar//       CHECK:   linalg.generic
407