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