// RUN: mlir-opt %s -transform-interpreter -canonicalize -split-input-file | FileCheck %s func.func @gemm(%a : memref, %b : memref, %c : memref) { linalg.matmul ins(%a, %b: memref, memref) outs(%c: memref) return } // CHECK: func @gemm // CHECK-SAME: %[[ARG0:[a-zA-Z0-9_]+]]: memref // CHECK-SAME: %[[ARG1:[a-zA-Z0-9_]+]]: memref // CHECK-SAME: %[[ARG2:[a-zA-Z0-9_]+]]: memref // CHECK-DAG: %[[C0:.+]] = arith.constant 0 : index // CHECK: scf.for // CHECK: scf.for // CHECK: scf.for // CHECK: %[[svA:.+]] = memref.subview %[[ARG0]] // CHECK: %[[svB:.+]] = memref.subview %[[ARG1]] // CHECK: %[[svC:.+]] = memref.subview %[[ARG2]] // CHECK: %[[tmpA:.*]] = memref.alloc() : memref<1024xi8> // CHECK: %[[VA:.*]] = memref.view %[[tmpA]][%[[C0]]][] : memref<1024xi8> to memref<16x16xf32> // CHECK: %[[svAA:.+]] = memref.subview %[[VA]] // CHECK: %[[tmpC:.*]] = memref.alloc() : memref<1024xi8> // CHECK: %[[VC:.*]] = memref.view %[[tmpC]][%[[C0]]][] : memref<1024xi8> to memref<16x16xf32> // CHECK: %[[svCC:.+]] = memref.subview %[[VC]] // CHECK: linalg.copy ins(%[[svA]] : memref>) outs(%[[svAA]] : memref>) // CHECK: linalg.copy ins(%[[svC]] : memref>) outs(%[[svCC]] : memref>) // CHECK: linalg.matmul ins(%[[VA]], %[[svB]]{{.*}} outs(%[[VC]] // CHECK: linalg.copy ins(%[[svCC]] : memref>) outs(%[[svC]] : memref>) // CHECK: memref.dealloc %[[tmpA]] // CHECK: memref.dealloc %[[tmpC]] module attributes {transform.with_named_sequence} { transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) { %0 = transform.structured.match ops{["linalg.matmul"]} in %arg1 : (!transform.any_op) -> !transform.any_op %1, %loops:3 = transform.structured.tile_using_for %0 [16, 16, 16] : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op) %2 = transform.structured.promote %1 { operands_to_promote = [0, 2], force_full_tiles = [false, false], use_full_tiles_by_default } : (!transform.any_op) -> !transform.any_op transform.yield } }