// RUN: onnf-opt --shape-inference --lower-frontend %s -split-input-file | FileCheck %s func @test_add(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Add"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_add // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[ADDF:%.+]] = addf [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[ADDF]], [[RES]][%arg2, %arg3] : memref<10x10xf32> // CHECK: return [[RES]] : memref<10x10xf32> } func @test_mul(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Mul"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_mul // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[MULF:%.+]] = mulf [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[MULF]], [[RES]][%arg2, %arg3] : memref<10x10xf32> // CHECK: return [[RES]] : memref<10x10xf32> } func @test_div(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Div"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_div // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[DIVF:%.+]] = divf [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[DIVF]], [[RES]][%arg2, %arg3] : memref<10x10xf32> // CHECK: return [[RES]] : memref<10x10xf32> } func @test_sub(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Sub"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_sub // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[SUBF:%.+]] = subf [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[SUBF]], [[RES]][%arg2, %arg3] : memref<10x10xf32> // CHECK: return [[RES]] : memref<10x10xf32> } func @test_and(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.And"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () // CHECK-LABEL: test_and // CHECK: [[RES:%.+]] = alloc() : memref<10x10xi32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xi32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xi32> // CHECK: [[AND:%.+]] = and [[LOAD1]], [[LOAD2]] : i32 // CHECK: store [[AND]], [[RES]][%arg2, %arg3] : memref<10x10xi32> // CHECK: return [[RES]] : memref<10x10xi32> } func @test_or(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.Or"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () // CHECK-LABEL: test_or // CHECK: [[RES:%.+]] = alloc() : memref<10x10xi32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xi32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xi32> // CHECK: [[OR:%.+]] = or [[LOAD1]], [[LOAD2]] : i32 // CHECK: store [[OR]], [[RES]][%arg2, %arg3] : memref<10x10xi32> // CHECK: return [[RES]] : memref<10x10xi32> } func @test_xor(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.Xor"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () // CHECK-LABEL: test_xor // CHECK: [[RES:%.+]] = alloc() : memref<10x10xi32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xi32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xi32> // CHECK: [[XOR:%.+]] = xor [[LOAD1]], [[LOAD2]] : i32 // CHECK: store [[XOR]], [[RES]][%arg2, %arg3] : memref<10x10xi32> // CHECK: return [[RES]] : memref<10x10xi32> } func @test_exp(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Exp"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_exp // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[EXP:%.+]] = exp [[LOAD]] : f32 // CHECK: store [[EXP]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_tanh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Tanh"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_tanh // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[TANH:%.+]] = tanh [[LOAD]] : f32 // CHECK: store [[TANH]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_sinh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sinh"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_sinh // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[TWO:%.+]] = constant {{2.+}} : f32 // CHECK: [[NLOAD:%.+]] = subf [[ZERO]], [[LOAD]] : f32 // CHECK: [[EXP:%.+]] = exp [[LOAD]] : f32 // CHECK: [[NEXP:%.+]] = exp [[NLOAD]] : f32 // CHECK: [[DIVIDEND:%.+]] = subf [[EXP]], [[NEXP]] : f32 // CHECK: [[SINH_RES:%.+]] = divf [[DIVIDEND]], [[TWO]] : f32 // CHECK: store [[SINH_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_cosh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Cosh"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_cosh // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[TWO:%.+]] = constant {{2.+}} : f32 // CHECK: [[NLOAD:%.+]] = subf [[ZERO]], [[LOAD]] : f32 // CHECK: [[EXP:%.+]] = exp [[LOAD]] : f32 // CHECK: [[NEXP:%.+]] = exp [[NLOAD]] : f32 // CHECK: [[DIVIDEND:%.+]] = addf [[EXP]], [[NEXP]] : f32 // CHECK: [[COSH_RES:%.+]] = divf [[DIVIDEND]], [[TWO]] : f32 // CHECK: store [[COSH_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_cos(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Cos"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_cos // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[COS:%.+]] = cos [[LOAD]] : f32 // CHECK: store [[COS]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_log(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Log"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_log // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[LOG:%.+]] = log [[LOAD]] : f32 // CHECK: store [[LOG]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_sigmoid(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sigmoid"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_sigmoid // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[ONE:%.+]] = constant {{1.+}} : f32 // CHECK: [[NLOAD:%.+]] = subf [[ZERO]], [[LOAD]] : f32 // CHECK: [[NEXP:%.+]] = exp [[NLOAD]] : f32 // CHECK: [[DIVISOR:%.+]] = addf [[ONE]], [[NEXP]] : f32 // CHECK: [[SIGMOID_RES:%.+]] = divf [[ONE]], [[DIVISOR]] : f32 // CHECK: store [[SIGMOID_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_relu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Relu"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_relu // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[LTZERO:%.+]] = cmpf "olt", [[LOAD]], [[ZERO]] : f32 // CHECK: [[RELU_RES:%.+]] = select [[LTZERO]], [[ZERO]], [[LOAD]] : f32 // CHECK: store [[RELU_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_reshape(%arg0 : tensor, %arg1 : tensor<4xi32>) -> tensor<*xf32> { %0 = "onnx.Reshape"(%arg0, %arg1) : (tensor, tensor<4xi32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_reshape // CHECK: [[TYPE_IN_BYTES:%.+]] = constant 4 : i64 // CHECK: %[[INDEX_0:.+]] = constant 0 : index // CHECK: [[LOAD_0:%.+]] = load %arg1[%[[INDEX_0]]] : memref<4xi32> // CHECK: [[EXT_0:%.+]] = zexti [[LOAD_0]] : i32 to i64 // CHECK: [[MUL_0:%.+]] = muli [[TYPE_IN_BYTES]], [[EXT_0]] : i64 // CHECK: [[CAST_0:%.+]] = index_cast [[LOAD_0]] : i32 to index // CHECK: %[[INDEX_1:.+]] = constant 1 : index // CHECK: [[LOAD_1:%.+]] = load %arg1[%[[INDEX_1]]] : memref<4xi32> // CHECK: [[EXT_1:%.+]] = zexti [[LOAD_1]] : i32 to i64 // CHECK: [[MUL_1:%.+]] = muli [[MUL_0]], [[EXT_1]] : i64 // CHECK: [[CAST_1:%.+]] = index_cast [[LOAD_1]] : i32 to index // CHECK: %[[INDEX_2:.+]] = constant 2 : index // CHECK: [[LOAD_2:%.+]] = load %arg1[%[[INDEX_2]]] : memref<4xi32> // CHECK: [[EXT_2:%.+]] = zexti [[LOAD_2]] : i32 to i64 // CHECK: [[MUL_2:%.+]] = muli [[MUL_1]], [[EXT_2]] : i64 // CHECK: [[CAST_2:%.+]] = index_cast [[LOAD_2]] : i32 to index // CHECK: %[[INDEX_3:.+]] = constant 3 : index // CHECK: [[LOAD_3:%.+]] = load %arg1[%[[INDEX_3]]] : memref<4xi32> // CHECK: [[EXT_3:%.+]] = zexti [[LOAD_3]] : i32 to i64 // CHECK: [[MUL_3:%.+]] = muli [[MUL_2]], [[EXT_3]] : i64 // CHECK: [[CAST_3:%.+]] = index_cast [[LOAD_3]] : i32 to index // CHECK: [[ALLOC:%.+]] = alloc([[CAST_0]], [[CAST_1]], [[CAST_2]], [[CAST_3]]) : memref // CHECK: "krnl.memcpy"([[ALLOC]], %arg0, [[MUL_3]]) : (memref, memref, i64) -> () // CHECK: return [[ALLOC]] : memref } func @test_sum(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Sum"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_sum // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[ADD:%.+]] = addf [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[ADD]], [[RES]][%arg2, %arg3] : memref<10x10xf32> // CHECK: return [[RES]] : memref<10x10xf32> } func @test_max(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Max"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_max // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[MAX:%.+]] = cmpf "ogt", [[LOAD1]], [[LOAD2]] : f32 // CHECK: [[RELU_RES:%.+]] = select [[MAX]], [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[RELU_RES]], [[RES]][%arg2, %arg3] : memref<10x10xf32> // CHECK: return [[RES]] : memref<10x10xf32> } func @test_min(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Min"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_min // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to 10, [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load %arg0[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref<10x10xf32> // CHECK: [[MIN:%.+]] = cmpf "olt", [[LOAD1]], [[LOAD2]] : f32 // CHECK: [[RELU_RES:%.+]] = select [[MIN]], [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[RELU_RES]], [[RES]][%arg2, %arg3] : memref<10x10xf32> // CHECK: return [[RES]] : memref<10x10xf32> } func @test_elu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Elu"(%arg0) {alpha=2.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_elu // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[ONE:%.+]] = constant {{1.+}} : f32 // CHECK: [[ALPHA:%.+]] = constant {{2.+}} : f32 // CHECK: [[EXP:%.+]] = exp [[LOAD]] : f32 // CHECK: [[CMP:%.+]] = cmpf "olt", [[LOAD]], [[ZERO]] : f32 // CHECK: [[SUB:%.+]] = subf [[EXP]], [[ONE]] : f32 // CHECK: [[MUL:%.+]] = mulf [[ALPHA]], [[SUB]] : f32 // CHECK: [[SELECT:%.+]] = select [[CMP]], [[MUL]], [[LOAD]] : f32 // CHECK: store [[SELECT]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_leakyrelu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.LeakyRelu"(%arg0) {alpha=1.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_leakyrelu // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[ALPHA:%.+]] = constant {{1.+}} : f32 // CHECK: [[CMP:%.+]] = cmpf "olt", [[LOAD]], [[ZERO]] : f32 // CHECK: [[MUL:%.+]] = mulf [[ALPHA]], [[LOAD]] : f32 // CHECK: [[SELECT:%.+]] = select [[CMP]], [[MUL]], [[LOAD]] : f32 // CHECK: store [[SELECT]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_selu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Selu"(%arg0) {alpha=1.0:f32, gamma=2.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_selu // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[ALPHA:%.+]] = constant {{1.+}} : f32 // CHECK: [[GAMMA:%.+]] = constant {{2.+}} : f32 // CHECK: [[EXP:%.+]] = exp [[LOAD]] : f32 // CHECK: [[CMP:%.+]] = cmpf "ogt", [[LOAD]], [[ZERO]] : f32 // CHECK: [[MUL:%.+]] = mulf [[ALPHA]], [[EXP]] : f32 // CHECK: [[SUB:%.+]] = subf [[MUL]], [[ALPHA]] : f32 // CHECK: [[SELECT:%.+]] = select [[CMP]], [[LOAD]], [[SUB]] : f32 // CHECK: [[SELU_RES:%.+]] = mulf [[GAMMA]], [[SELECT]] : f32 // CHECK: store [[SELU_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_hardsigmoid(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.HardSigmoid"(%arg0) {alpha=1.0:f32, beta=2.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_hardsigmoid // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ZERO:%.+]] = constant {{0.+}} : f32 // CHECK: [[ONE:%.+]] = constant {{1.+}} : f32 // CHECK: [[ALPHA:%.+]] = constant {{1.+}} : f32 // CHECK: [[BETA:%.+]] = constant {{2.+}} : f32 // CHECK: [[MUL:%.+]] = mulf [[ALPHA]], [[LOAD]] : f32 // CHECK: [[ADD:%.+]] = addf [[MUL]], [[BETA]] : f32 // CHECK: [[CMP1:%.+]] = cmpf "ogt", [[ADD]], [[ZERO]] : f32 // CHECK: [[SELECT1:%.+]] = select [[CMP1]], [[ADD]], [[ZERO]] : f32 // CHECK: [[CMP2:%.+]] = cmpf "olt", [[SELECT1]], [[ONE]] : f32 // CHECK: [[SELECT2:%.+]] = select [[CMP2]], [[SELECT1]], [[ONE]] : f32 // CHECK: store [[SELECT2]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_reciprocal(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Reciprocal"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_reciprocal // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ONE:%.+]] = constant {{1.+}} : f32 // CHECK: [[RECIPROCAL_RES:%.+]] = divf [[ONE]], [[LOAD]] : f32 // CHECK: store [[RECIPROCAL_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_softplus(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Softplus"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_softplus // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[EXP:%.+]] = exp [[LOAD]] : f32 // CHECK: [[ONE:%.+]] = constant {{1.+}} : f32 // CHECK: [[ADD:%.+]] = addf [[EXP]], [[ONE]] : f32 // CHECK: [[SOFTPLUS_RES:%.+]] = log [[ADD]] : f32 // CHECK: store [[SOFTPLUS_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_softsign(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Softsign"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_softsign // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[ABS:%.+]] = absf [[LOAD]] : f32 // CHECK: [[ONE:%.+]] = constant {{1.+}} : f32 // CHECK: [[ADD:%.+]] = addf [[ABS]], [[ONE]] : f32 // CHECK: [[SOFTSIGN_RES:%.+]] = divf [[LOAD]], [[ADD]] : f32 // CHECK: store [[SOFTSIGN_RES]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref } func @test_add_with_broadcasting(%arg0 : tensor, %arg1 : tensor) -> tensor<*xf32> { %0 = "onnx.Add"(%arg0, %arg1) : (tensor, tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_add_with_broadcasting // CHECK: [[DIM1:%.+]] = dim %arg1, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM1]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM2:%.+]] = dim [[RES]], 0 : memref // CHECK: [[DIM3:%.+]] = dim %arg0, 0 : memref // CHECK: [[ONE:%.+]] = constant 1 : index // CHECK: [[IS_ONE:%.+]] = cmpi "eq", [[DIM3]], [[ONE]] : index // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg2 = 0 to [[DIM2]], [[DEF_LOOPS]]#1 -> %arg3 = 0 to 10) { // CHECK: [[ZERO:%.+]] = constant 0 : index // CHECK: %[[SELECT1:.+]] = select [[IS_ONE]], [[ZERO]], %arg3 : index // CHECK: [[LOAD1:%.+]] = load %arg0[%[[SELECT1]]] : memref // CHECK: [[LOAD2:%.+]] = load %arg1[%arg2, %arg3] : memref // CHECK: [[ADD:%.+]] = addf [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[ADD]], [[RES]][%arg2, %arg3] : memref // CHECK: } // CHECK: return [[RES]] : memref } func @test_softmax(%arg0 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Softmax"(%arg0) {axis=1:i64} : (tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_softmax // CHECK: [[MAX:%.+]] = alloc() : memref // CHECK: [[SUM:%.+]] = alloc() : memref // CHECK: [[RES:%.+]] = alloc() : memref<10x10xf32> // CHECK: [[CST:%.+]] = constant 0.000000e+00 : f32 // CHECK: [[CST_0:%.+]] = constant 0xFF800000 : f32 // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, %3#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: krnl.iterate([[OPT_LOOPS]]#0) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to 10) { // CHECK: store [[CST]], [[SUM]][] : memref // CHECK: store [[CST_0]], [[MAX]][] : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD1:%.+]] = load [[MAX]][] : memref // CHECK: [[LOAD2:%.+]] = load %arg0[%arg1, %arg2] : memref<10x10xf32> // CHECK: [[COND:%.+]] = cmpf "ogt", [[LOAD1]], [[LOAD2]] : f32 // CHECK: [[SELECT:%.+]] = select [[COND]], [[LOAD1]], [[LOAD2]] : f32 // CHECK: store [[SELECT]], [[MAX]][] : memref // CHECK: } // CHECK: %5 = load [[MAX]][] : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD1]] = load [[SUM]][] : memref // CHECK: [[LOAD2]] = load %arg0[%arg1, %arg2] : memref<10x10xf32> // CHECK: [[SUB:%.+]] = subf [[LOAD2]], %5 : f32 // CHECK: [[EXP:%.+]] = exp [[SUB]] : f32 // CHECK: [[ADD:%.+]] = addf [[LOAD1]], [[EXP]] : f32 // CHECK: store [[ADD]], [[SUM]][] : memref // CHECK: store %10, [[RES]][%arg1, %arg2] : memref<10x10xf32> // CHECK: } // CHECK: %6 = load [[SUM]][] : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD1]] = load [[RES]][%arg1, %arg2] : memref<10x10xf32> // CHECK: [[DIV:%.+]] = divf [[LOAD1]], %6 : f32 // CHECK: store [[DIV]], [[RES]][%arg1, %arg2] : memref<10x10xf32> // CHECK: } // CHECK: } // CHECK: dealloc [[SUM]] : memref // CHECK: dealloc [[MAX]] : memref // CHECK: return [[RES]] : memref<10x10xf32> } func @test_sqrt(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sqrt"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () // CHECK-LABEL: test_sqrt // CHECK: [[DIM_0:%.+]] = dim %arg0, 0 : memref // CHECK: [[RES:%.+]] = alloc([[DIM_0]]) : memref // CHECK: [[DEF_LOOPS:%.+]]:2 = krnl.define_loops 2 // CHECK: [[OPT_LOOPS:%.+]]:2 = krnl.optimize_loops { // CHECK: krnl.return_loops [[DEF_LOOPS]]#0, [[DEF_LOOPS]]#1 // CHECK: } : () -> (!krnl.loop, !krnl.loop) // CHECK: [[DIM_2:%.+]] = dim %arg0, 0 : memref // CHECK: krnl.iterate([[OPT_LOOPS]]#0, [[OPT_LOOPS]]#1) with ([[DEF_LOOPS]]#0 -> %arg1 = 0 to [[DIM_2]], [[DEF_LOOPS]]#1 -> %arg2 = 0 to 10) { // CHECK: [[LOAD:%.+]] = load %arg0[%arg1, %arg2] : memref // CHECK: [[SQRT:%.+]] = "krnl.sqrt"([[LOAD]]) : (f32) -> f32 // CHECK: store [[SQRT]], [[RES]][%arg1, %arg2] : memref // CHECK: return [[RES]] : memref }