42 lines · plain
1// DEFINE: %{pipeline} = "builtin.module(\2// DEFINE: func.func(\3// DEFINE: tosa-to-linalg\4// DEFINE: ),\5// DEFINE: one-shot-bufferize{\6// DEFINE: bufferize-function-boundaries\7// DEFINE: function-boundary-type-conversion=identity-layout-map\8// DEFINE: buffer-alignment=0\9// DEFINE: },\10// DEFINE: buffer-results-to-out-params{\11// DEFINE: hoist-static-allocs=true\12// DEFINE: },\13// DEFINE: func.func(\14// DEFINE: convert-linalg-to-loops\15// DEFINE: ),\16// DEFINE: canonicalize,\17// DEFINE: convert-to-emitc\18// DEFINE: )"19 20// RUN: mlir-opt --pass-pipeline=%{pipeline} %s | FileCheck %s21// -----22 23// CHECK: emitc.func private @main(%[[ARG0:.*]]: !emitc.array<2xf32>, %[[ARG1:.*]]: !emitc.array<2xf32>, %[[RES:.*]]: !emitc.array<2xf32>)24// CHECK-DAG: %[[C0:.*]] = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t25// CHECK-DAG: %[[C1:.*]] = "emitc.constant"() <{value = 1 : index}> : () -> !emitc.size_t26// CHECK-DAG: %[[C2:.*]] = "emitc.constant"() <{value = 2 : index}> : () -> !emitc.size_t27// CHECK-NEXT: for %[[INDEX:.*]] = %[[C0]] to %[[C2]] step %[[C1]] : !emitc.size_t {28// CHECK-NEXT: %[[V0_LVALUE:.*]] = subscript %[[ARG0]][%[[INDEX]]] : (!emitc.array<2xf32>, !emitc.size_t) -> !emitc.lvalue<f32>29// CHECK-NEXT: %[[V0:.*]] = load %[[V0_LVALUE]] : <f32>30// CHECK-NEXT: %[[V1_LVALUE:.*]] = subscript %[[ARG1]][%[[INDEX]]] : (!emitc.array<2xf32>, !emitc.size_t) -> !emitc.lvalue<f32>31// CHECK-NEXT: %[[V1:.*]] = load %[[V1_LVALUE]] : <f32>32// CHECK-NEXT: %[[VADD:.*]] = add %[[V0]], %[[V1]] : (f32, f32) -> f3233// CHECK-NEXT: %[[RES_LVALUE:.*]] = subscript %[[RES]][%[[INDEX]]] : (!emitc.array<2xf32>, !emitc.size_t) -> !emitc.lvalue<f32>34// CHECK-NEXT: assign %[[VADD]] : f32 to %[[RES_LVALUE]] : <f32>35// CHECK-NEXT: }36// CHECK-NEXT: return37// CHECK-NEXT: }38func.func private @main(%arg0: tensor<2xf32>, %arg1: tensor<2xf32>) -> tensor<2xf32> {39 %0 = tosa.add %arg0, %arg1 : (tensor<2xf32>, tensor<2xf32>) -> tensor<2xf32>40 return %0 : tensor<2xf32>41}42