1// The following test examples of linalg named ops lowered to linalg.generic and then 2// lifted back up to named op. 3// RUN: mlir-opt %s -linalg-generalize-named-ops | mlir-opt --linalg-specialize-generic-ops | FileCheck %s 4 5func.func @unary_exp(%A: memref<7x14x21xf32>, %Out: memref<7x14x21xf32>) { 6 linalg.exp ins(%A : memref<7x14x21xf32>) outs(%Out : memref<7x14x21xf32>) 7 return 8} 9 10// CHECK-LABEL: unary_exp 11// CHECK-SAME: %[[A:.+]]: memref<7x14x21xf32>, %[[Out:.+]]: memref<7x14x21xf32>) 12// CHECK-NOT: linalg.generic 13// CHECK: linalg.exp ins(%[[A]] : memref<7x14x21xf32>) outs(%[[Out]] : memref<7x14x21xf32>) 14 15// ----- 16 17func.func @binary_add(%A: tensor<?x?xf32>, %B: tensor<?x?xf32>, %Out: tensor<?x?xf32>) -> tensor<?x?xf32> { 18 %0 = linalg.add ins(%A, %B : tensor<?x?xf32>, tensor<?x?xf32>) outs(%Out : tensor<?x?xf32>) -> tensor<?x?xf32> 19 return %0 : tensor<?x?xf32> 20} 21 22// CHECK-LABEL: binary_add 23// CHECK-SAME: %[[A:.+]]: tensor<?x?xf32>, %[[B:.+]]: tensor<?x?xf32>, %[[Out:.+]]: tensor<?x?xf32>) -> tensor<?x?xf32> 24// CHECK-NOT: linalg.generic 25// CHECK: linalg.add ins(%[[A]], %[[B]] : tensor<?x?xf32>, tensor<?x?xf32>) outs(%[[Out]] : tensor<?x?xf32>) -> tensor<?x?xf32> 26 27// ----- 28 29func.func @matmul(%A: tensor<?x?xf32>, %B: tensor<?x?xf32>, %Out: tensor<?x?xf32>) -> tensor<?x?xf32> { 30 %0 = linalg.matmul ins(%A, %B : tensor<?x?xf32>, tensor<?x?xf32>) outs(%Out : tensor<?x?xf32>) -> tensor<?x?xf32> 31 return %0 : tensor<?x?xf32> 32} 33 34// CHECK-LABEL: @matmul 35// CHECK-SAME: %[[A:.+]]: tensor<?x?xf32>, %[[B:.+]]: tensor<?x?xf32>, %[[Out:.+]]: tensor<?x?xf32>) -> tensor<?x?xf32> 36// CHECK-NOT: linalg.generic 37// CHECK: linalg.matmul ins(%[[A]], %[[B]] : tensor<?x?xf32>, tensor<?x?xf32>) outs(%[[Out]] : tensor<?x?xf32>) -> tensor<?x?xf32> 38 39// ----- 40 41func.func @mixed_named_ops(%A: tensor<?x?xf32>, %B: tensor<?x?xf32>, 42 %C: tensor<?x?xf32>, %Out: tensor<?x?xf32>) -> tensor<?x?xf32> { 43 %AB = linalg.matmul ins(%A, %B : tensor<?x?xf32>, tensor<?x?xf32>) outs(%Out : tensor<?x?xf32>) -> tensor<?x?xf32> 44 %1 = linalg.add ins(%AB, %C : tensor<?x?xf32>, tensor<?x?xf32>) outs(%Out : tensor<?x?xf32>) -> tensor<?x?xf32> 45 return %1 : tensor<?x?xf32> 46} 47 48// CHECK-LABEL: @mixed_named_ops 49// CHECK-SAME: %[[A:.+]]: tensor<?x?xf32>, %[[B:.+]]: tensor<?x?xf32>, %[[C:.+]]: tensor<?x?xf32>, %[[Out:.+]]: tensor<?x?xf32>) -> tensor<?x?xf32> 50// CHECK-NOT: linalg.generic 51// CHECK: %[[AB:.+]] = linalg.matmul ins(%[[A]], %[[B]] : tensor<?x?xf32>, tensor<?x?xf32>) outs(%[[Out]] : tensor<?x?xf32>) -> tensor<?x?xf32> 52// CHECK: linalg.add ins(%[[AB]], %[[C]] : tensor<?x?xf32>, tensor<?x?xf32>) outs(%[[Out]] : tensor<?x?xf32>) -> tensor<?x?xf32> 53