Example
storylm0_kv_step.kina
let kv_step = fn(
q_new: tensor<F32, [1, 2, 1, 2], @host>,
k_past: tensor<F32, [1, 2, 2, 3], @host>,
k_new: tensor<F32, [1, 2, 2, 1], @host>,
v_past: tensor<F32, [1, 2, 3, 2], @host>,
v_new: tensor<F32, [1, 2, 1, 2], @host>,
scale: tensor<F32, [1, 1, 1, 1], @host>
) -> (
tensor<F32, [1, 2, 2, 4], @host>,
tensor<F32, [1, 2, 4, 2], @host>,
tensor<F32, [1, 2, 1, 2], @host>
) {
let k_next = k_past.concat(axis=3, k_new) in
let v_next = v_past.concat(axis=2, v_new) in
let scores = q_new @ k_next in
let scale_b = scale.broadcast([1, 2, 1, 4]) in
let scaled = scores * scale_b in
let probs = scaled.softmax(axis=3) in
let context = probs @ v_next in
(k_next, v_next, context)
} in
let q_new = tensor<F32, [1, 2, 1, 2], @host> in
let k_past = tensor<F32, [1, 2, 2, 3], @host> in
let k_new = tensor<F32, [1, 2, 2, 1], @host> in
let v_past = tensor<F32, [1, 2, 3, 2], @host> in
let v_new = tensor<F32, [1, 2, 1, 2], @host> in
let scale = tensor<F32, [1, 1, 1, 1], @host> in
kv_step(q_new, k_past, k_new, v_past, v_new, scale)
module {
func.func @fn_val_0(%1: tensor<1x32x64xf32>, %2: tensor<1x1x64xf32>) -> tensor<1x32x64xf32> attributes {llvm.emit_c_interface} {
%3 = tensor.empty() : tensor<1x32x64xf32>
%4 = linalg.mul ins(%1, %1 : tensor<1x32x64xf32>, tensor<1x32x64xf32>) outs(%3 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
%7 = arith.constant 0.000000e+00 : f32
%5 = tensor.empty() : tensor<1x32x1xf32>
%6 = linalg.fill ins(%7 : f32) outs(%5 : tensor<1x32x1xf32>) -> tensor<1x32x1xf32>
%8 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (d0, d1, d2)>, affine_map<(d0, d1, d2) -> (d0, d1, 0)>],
iterator_types = ["parallel", "parallel", "reduction"]
} ins(%4 : tensor<1x32x64xf32>) outs(%6 : tensor<1x32x1xf32>) {
^bb0(%a0: f32, %a1: f32):
%9 = arith.addf %a0, %a1 : f32
linalg.yield %9 : f32
} -> tensor<1x32x1xf32>
%10 = arith.constant dense<0.000000e+00> : tensor<1x1x1xf32>
%11 = tensor.empty() : tensor<1x32x1xf32>
%12 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, 0, 0)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%10 : tensor<1x1x1xf32>) outs(%11 : tensor<1x32x1xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x1xf32>
%13 = tensor.empty() : tensor<1x32x1xf32>
%14 = linalg.mul ins(%8, %12 : tensor<1x32x1xf32>, tensor<1x32x1xf32>) outs(%13 : tensor<1x32x1xf32>) -> tensor<1x32x1xf32>
%15 = arith.constant dense<0.000000e+00> : tensor<1x1x1xf32>
%16 = tensor.empty() : tensor<1x32x1xf32>
%17 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, 0, 0)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%15 : tensor<1x1x1xf32>) outs(%16 : tensor<1x32x1xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x1xf32>
%18 = tensor.empty() : tensor<1x32x1xf32>
%19 = linalg.add ins(%14, %17 : tensor<1x32x1xf32>, tensor<1x32x1xf32>) outs(%18 : tensor<1x32x1xf32>) -> tensor<1x32x1xf32>
%23 = tensor.empty() : tensor<1x32x1xf32>
%24 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (d0, d1, d2)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%19 : tensor<1x32x1xf32>) outs(%23 : tensor<1x32x1xf32>) {
^bb0(%x: f32, %_: f32):
%20 = math.sqrt %x : f32
%21 = arith.constant 1.000000e+00 : f32
%22 = arith.divf %21, %20 : f32
linalg.yield %22 : f32
} -> tensor<1x32x1xf32>
%25 = tensor.empty() : tensor<1x32x64xf32>
%26 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, d1, 0)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%24 : tensor<1x32x1xf32>) outs(%25 : tensor<1x32x64xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x64xf32>
%27 = tensor.empty() : tensor<1x32x64xf32>
%28 = linalg.mul ins(%1, %26 : tensor<1x32x64xf32>, tensor<1x32x64xf32>) outs(%27 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
%29 = tensor.empty() : tensor<1x32x64xf32>
%30 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, 0, d2)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%2 : tensor<1x1x64xf32>) outs(%29 : tensor<1x32x64xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x64xf32>
%31 = tensor.empty() : tensor<1x32x64xf32>
%32 = linalg.mul ins(%28, %30 : tensor<1x32x64xf32>, tensor<1x32x64xf32>) outs(%31 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
return %32 : tensor<1x32x64xf32>
}
func.func @fn_val_33(%34: tensor<1x32x64xf32>, %35: tensor<1x64x128xf32>, %36: tensor<1x128x64xf32>) -> tensor<1x32x64xf32> attributes {llvm.emit_c_interface} {
%37 = arith.constant dense<0.000000e+00> : tensor<1x32x128xf32>
%38 = linalg.batch_matmul ins(%34, %35 : tensor<1x32x64xf32>, tensor<1x64x128xf32>) outs(%37 : tensor<1x32x128xf32>) -> tensor<1x32x128xf32>
%44 = tensor.empty() : tensor<1x32x128xf32>
%45 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (d0, d1, d2)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%38 : tensor<1x32x128xf32>) outs(%44 : tensor<1x32x128xf32>) {
^bb0(%a0: f32, %a1: f32):
%39 = arith.constant 1.000000e+00 : f32
%40 = arith.negf %a0 : f32
%41 = math.exp %40 : f32
%42 = arith.addf %39, %41 : f32
%43 = arith.divf %39, %42 : f32
linalg.yield %43 : f32
} -> tensor<1x32x128xf32>
%46 = tensor.empty() : tensor<1x32x128xf32>
%47 = linalg.mul ins(%38, %45 : tensor<1x32x128xf32>, tensor<1x32x128xf32>) outs(%46 : tensor<1x32x128xf32>) -> tensor<1x32x128xf32>
%48 = arith.constant dense<0.000000e+00> : tensor<1x32x64xf32>
%49 = linalg.batch_matmul ins(%47, %36 : tensor<1x32x128xf32>, tensor<1x128x64xf32>) outs(%48 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
return %49 : tensor<1x32x64xf32>
}
func.func @fn_val_50(%51: tensor<1x32x64xf32>, %52: tensor<1x64x64xf32>, %53: tensor<1x64x64xf32>, %54: tensor<1x64x64xf32>, %55: tensor<1x64x64xf32>) -> tensor<1x32x64xf32> attributes {llvm.emit_c_interface} {
%56 = arith.constant dense<0.000000e+00> : tensor<1x32x64xf32>
%57 = linalg.batch_matmul ins(%51, %52 : tensor<1x32x64xf32>, tensor<1x64x64xf32>) outs(%56 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
%58 = arith.constant dense<0.000000e+00> : tensor<1x32x64xf32>
%59 = linalg.batch_matmul ins(%51, %53 : tensor<1x32x64xf32>, tensor<1x64x64xf32>) outs(%58 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
%60 = arith.constant dense<0.000000e+00> : tensor<1x32x64xf32>
%61 = linalg.batch_matmul ins(%51, %54 : tensor<1x32x64xf32>, tensor<1x64x64xf32>) outs(%60 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
%62 = tensor.empty() : tensor<1x64x32xf32>
%63 = linalg.transpose ins(%59 : tensor<1x32x64xf32>) outs(%62 : tensor<1x64x32xf32>) permutation = [0, 2, 1]
%64 = arith.constant dense<0.000000e+00> : tensor<1x32x32xf32>
%65 = linalg.batch_matmul ins(%57, %63 : tensor<1x32x64xf32>, tensor<1x64x32xf32>) outs(%64 : tensor<1x32x32xf32>) -> tensor<1x32x32xf32>
%66 = arith.constant dense<0.000000e+00> : tensor<1x1x1xf32>
%67 = tensor.empty() : tensor<1x32x32xf32>
%68 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, 0, 0)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%66 : tensor<1x1x1xf32>) outs(%67 : tensor<1x32x32xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x32xf32>
%69 = tensor.empty() : tensor<1x32x32xf32>
%70 = linalg.mul ins(%65, %68 : tensor<1x32x32xf32>, tensor<1x32x32xf32>) outs(%69 : tensor<1x32x32xf32>) -> tensor<1x32x32xf32>
%73 = arith.constant 0xFF800000 : f32
%71 = tensor.empty() : tensor<1x32x1xf32>
%72 = linalg.fill ins(%73 : f32) outs(%71 : tensor<1x32x1xf32>) -> tensor<1x32x1xf32>
%74 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (d0, d1, d2)>, affine_map<(d0, d1, d2) -> (d0, d1, 0)>],
iterator_types = ["parallel", "parallel", "reduction"]
} ins(%70 : tensor<1x32x32xf32>) outs(%72 : tensor<1x32x1xf32>) {
^bb0(%a0: f32, %a1: f32):
%75 = arith.maximumf %a0, %a1 : f32
linalg.yield %75 : f32
} -> tensor<1x32x1xf32>
%76 = tensor.empty() : tensor<1x32x32xf32>
%77 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, d1, 0)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%74 : tensor<1x32x1xf32>) outs(%76 : tensor<1x32x32xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x32xf32>
%78 = tensor.empty() : tensor<1x32x32xf32>
%79 = linalg.sub ins(%70, %77 : tensor<1x32x32xf32>, tensor<1x32x32xf32>) outs(%78 : tensor<1x32x32xf32>) -> tensor<1x32x32xf32>
%80 = tensor.empty() : tensor<1x32x32xf32>
%81 = linalg.exp ins(%79 : tensor<1x32x32xf32>) outs(%80 : tensor<1x32x32xf32>) -> tensor<1x32x32xf32>
%84 = arith.constant 0xFF800000 : f32
%82 = tensor.empty() : tensor<1x32x1xf32>
%83 = linalg.fill ins(%84 : f32) outs(%82 : tensor<1x32x1xf32>) -> tensor<1x32x1xf32>
%85 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (d0, d1, d2)>, affine_map<(d0, d1, d2) -> (d0, d1, 0)>],
iterator_types = ["parallel", "parallel", "reduction"]
} ins(%70 : tensor<1x32x32xf32>) outs(%83 : tensor<1x32x1xf32>) {
^bb0(%a0: f32, %a1: f32):
%86 = arith.maximumf %a0, %a1 : f32
linalg.yield %86 : f32
} -> tensor<1x32x1xf32>
%87 = tensor.empty() : tensor<1x32x32xf32>
%88 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, d1, 0)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%85 : tensor<1x32x1xf32>) outs(%87 : tensor<1x32x32xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x32xf32>
%89 = tensor.empty() : tensor<1x32x32xf32>
%90 = linalg.sub ins(%70, %88 : tensor<1x32x32xf32>, tensor<1x32x32xf32>) outs(%89 : tensor<1x32x32xf32>) -> tensor<1x32x32xf32>
%91 = tensor.empty() : tensor<1x32x32xf32>
%92 = linalg.exp ins(%90 : tensor<1x32x32xf32>) outs(%91 : tensor<1x32x32xf32>) -> tensor<1x32x32xf32>
%95 = arith.constant 0.000000e+00 : f32
%93 = tensor.empty() : tensor<1x32x1xf32>
%94 = linalg.fill ins(%95 : f32) outs(%93 : tensor<1x32x1xf32>) -> tensor<1x32x1xf32>
%96 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (d0, d1, d2)>, affine_map<(d0, d1, d2) -> (d0, d1, 0)>],
iterator_types = ["parallel", "parallel", "reduction"]
} ins(%92 : tensor<1x32x32xf32>) outs(%94 : tensor<1x32x1xf32>) {
^bb0(%a0: f32, %a1: f32):
%97 = arith.addf %a0, %a1 : f32
linalg.yield %97 : f32
} -> tensor<1x32x1xf32>
%98 = tensor.empty() : tensor<1x32x32xf32>
%99 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2) -> (0, d1, 0)>, affine_map<(d0, d1, d2) -> (d0, d1, d2)>],
iterator_types = ["parallel", "parallel", "parallel"]
} ins(%96 : tensor<1x32x1xf32>) outs(%98 : tensor<1x32x32xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x32x32xf32>
%100 = tensor.empty() : tensor<1x32x32xf32>
%101 = linalg.div ins(%81, %99 : tensor<1x32x32xf32>, tensor<1x32x32xf32>) outs(%100 : tensor<1x32x32xf32>) -> tensor<1x32x32xf32>
%102 = arith.constant dense<0.000000e+00> : tensor<1x32x64xf32>
%103 = linalg.batch_matmul ins(%101, %61 : tensor<1x32x32xf32>, tensor<1x32x64xf32>) outs(%102 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
%104 = arith.constant dense<0.000000e+00> : tensor<1x32x64xf32>
%105 = linalg.batch_matmul ins(%103, %55 : tensor<1x32x64xf32>, tensor<1x64x64xf32>) outs(%104 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
return %105 : tensor<1x32x64xf32>
}
func.func @fn_val_106(%107: tensor<1x32x64xf32>, %108: tensor<1x1x64xf32>, %109: tensor<1x64x64xf32>, %110: tensor<1x64x64xf32>, %111: tensor<1x64x64xf32>, %112: tensor<1x64x64xf32>, %113: tensor<1x1x64xf32>, %114: tensor<1x64x128xf32>, %115: tensor<1x128x64xf32>) -> tensor<1x32x64xf32> attributes {llvm.emit_c_interface} {
%116 = func.call @fn_val_0(%107, %108) : (tensor<1x32x64xf32>, tensor<1x1x64xf32>) -> tensor<1x32x64xf32>
%117 = func.call @fn_val_50(%116, %109, %110, %111, %112) : (tensor<1x32x64xf32>, tensor<1x64x64xf32>, tensor<1x64x64xf32>, tensor<1x64x64xf32>, tensor<1x64x64xf32>) -> tensor<1x32x64xf32>
%118 = tensor.empty() : tensor<1x32x64xf32>
%119 = linalg.add ins(%107, %117 : tensor<1x32x64xf32>, tensor<1x32x64xf32>) outs(%118 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
%120 = func.call @fn_val_0(%119, %113) : (tensor<1x32x64xf32>, tensor<1x1x64xf32>) -> tensor<1x32x64xf32>
%121 = func.call @fn_val_33(%120, %114, %115) : (tensor<1x32x64xf32>, tensor<1x64x128xf32>, tensor<1x128x64xf32>) -> tensor<1x32x64xf32>
%122 = tensor.empty() : tensor<1x32x64xf32>
%123 = linalg.add ins(%119, %121 : tensor<1x32x64xf32>, tensor<1x32x64xf32>) outs(%122 : tensor<1x32x64xf32>) -> tensor<1x32x64xf32>
return %123 : tensor<1x32x64xf32>
}
func.func @fn_val_124(%125: tensor<1x2x1x2xf32>, %126: tensor<1x2x2x3xf32>, %127: tensor<1x2x2x1xf32>, %128: tensor<1x2x3x2xf32>, %129: tensor<1x2x1x2xf32>, %130: tensor<1x1x1x1xf32>) -> (tensor<1x2x2x4xf32>, tensor<1x2x4x2xf32>, tensor<1x2x1x2xf32>) attributes {llvm.emit_c_interface} {
%131 = tensor.empty() : tensor<1x2x2x4xf32>
%132 = tensor.insert_slice %126 into %131[0, 0, 0, 0] [1, 2, 2, 3] [1, 1, 1, 1] : tensor<1x2x2x3xf32> into tensor<1x2x2x4xf32>
%133 = tensor.insert_slice %127 into %132[0, 0, 0, 3] [1, 2, 2, 1] [1, 1, 1, 1] : tensor<1x2x2x1xf32> into tensor<1x2x2x4xf32>
%134 = tensor.empty() : tensor<1x2x4x2xf32>
%135 = tensor.insert_slice %128 into %134[0, 0, 0, 0] [1, 2, 3, 2] [1, 1, 1, 1] : tensor<1x2x3x2xf32> into tensor<1x2x4x2xf32>
%136 = tensor.insert_slice %129 into %135[0, 0, 3, 0] [1, 2, 1, 2] [1, 1, 1, 1] : tensor<1x2x1x2xf32> into tensor<1x2x4x2xf32>
%137 = tensor.collapse_shape %125 [[0, 1], [2], [3]] : tensor<1x2x1x2xf32> into tensor<2x1x2xf32>
%138 = tensor.collapse_shape %133 [[0, 1], [2], [3]] : tensor<1x2x2x4xf32> into tensor<2x2x4xf32>
%139 = arith.constant dense<0.000000e+00> : tensor<2x1x4xf32>
%140 = linalg.batch_matmul ins(%137, %138 : tensor<2x1x2xf32>, tensor<2x2x4xf32>) outs(%139 : tensor<2x1x4xf32>) -> tensor<2x1x4xf32>
%141 = tensor.expand_shape %140 [[0, 1], [2], [3]] : tensor<2x1x4xf32> into tensor<1x2x1x4xf32>
%142 = tensor.empty() : tensor<1x2x1x4xf32>
%143 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2, d3) -> (0, 0, 0, 0)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>],
iterator_types = ["parallel", "parallel", "parallel", "parallel"]
} ins(%130 : tensor<1x1x1x1xf32>) outs(%142 : tensor<1x2x1x4xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x2x1x4xf32>
%144 = tensor.empty() : tensor<1x2x1x4xf32>
%145 = linalg.mul ins(%141, %143 : tensor<1x2x1x4xf32>, tensor<1x2x1x4xf32>) outs(%144 : tensor<1x2x1x4xf32>) -> tensor<1x2x1x4xf32>
%148 = arith.constant 0xFF800000 : f32
%146 = tensor.empty() : tensor<1x2x1x1xf32>
%147 = linalg.fill ins(%148 : f32) outs(%146 : tensor<1x2x1x1xf32>) -> tensor<1x2x1x1xf32>
%149 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, 0)>],
iterator_types = ["parallel", "parallel", "parallel", "reduction"]
} ins(%145 : tensor<1x2x1x4xf32>) outs(%147 : tensor<1x2x1x1xf32>) {
^bb0(%a0: f32, %a1: f32):
%150 = arith.maximumf %a0, %a1 : f32
linalg.yield %150 : f32
} -> tensor<1x2x1x1xf32>
%151 = tensor.empty() : tensor<1x2x1x4xf32>
%152 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2, d3) -> (0, d1, 0, 0)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>],
iterator_types = ["parallel", "parallel", "parallel", "parallel"]
} ins(%149 : tensor<1x2x1x1xf32>) outs(%151 : tensor<1x2x1x4xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x2x1x4xf32>
%153 = tensor.empty() : tensor<1x2x1x4xf32>
%154 = linalg.sub ins(%145, %152 : tensor<1x2x1x4xf32>, tensor<1x2x1x4xf32>) outs(%153 : tensor<1x2x1x4xf32>) -> tensor<1x2x1x4xf32>
%155 = tensor.empty() : tensor<1x2x1x4xf32>
%156 = linalg.exp ins(%154 : tensor<1x2x1x4xf32>) outs(%155 : tensor<1x2x1x4xf32>) -> tensor<1x2x1x4xf32>
%159 = arith.constant 0xFF800000 : f32
%157 = tensor.empty() : tensor<1x2x1x1xf32>
%158 = linalg.fill ins(%159 : f32) outs(%157 : tensor<1x2x1x1xf32>) -> tensor<1x2x1x1xf32>
%160 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, 0)>],
iterator_types = ["parallel", "parallel", "parallel", "reduction"]
} ins(%145 : tensor<1x2x1x4xf32>) outs(%158 : tensor<1x2x1x1xf32>) {
^bb0(%a0: f32, %a1: f32):
%161 = arith.maximumf %a0, %a1 : f32
linalg.yield %161 : f32
} -> tensor<1x2x1x1xf32>
%162 = tensor.empty() : tensor<1x2x1x4xf32>
%163 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2, d3) -> (0, d1, 0, 0)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>],
iterator_types = ["parallel", "parallel", "parallel", "parallel"]
} ins(%160 : tensor<1x2x1x1xf32>) outs(%162 : tensor<1x2x1x4xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x2x1x4xf32>
%164 = tensor.empty() : tensor<1x2x1x4xf32>
%165 = linalg.sub ins(%145, %163 : tensor<1x2x1x4xf32>, tensor<1x2x1x4xf32>) outs(%164 : tensor<1x2x1x4xf32>) -> tensor<1x2x1x4xf32>
%166 = tensor.empty() : tensor<1x2x1x4xf32>
%167 = linalg.exp ins(%165 : tensor<1x2x1x4xf32>) outs(%166 : tensor<1x2x1x4xf32>) -> tensor<1x2x1x4xf32>
%170 = arith.constant 0.000000e+00 : f32
%168 = tensor.empty() : tensor<1x2x1x1xf32>
%169 = linalg.fill ins(%170 : f32) outs(%168 : tensor<1x2x1x1xf32>) -> tensor<1x2x1x1xf32>
%171 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, 0)>],
iterator_types = ["parallel", "parallel", "parallel", "reduction"]
} ins(%167 : tensor<1x2x1x4xf32>) outs(%169 : tensor<1x2x1x1xf32>) {
^bb0(%a0: f32, %a1: f32):
%172 = arith.addf %a0, %a1 : f32
linalg.yield %172 : f32
} -> tensor<1x2x1x1xf32>
%173 = tensor.empty() : tensor<1x2x1x4xf32>
%174 = linalg.generic {
indexing_maps = [affine_map<(d0, d1, d2, d3) -> (0, d1, 0, 0)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>],
iterator_types = ["parallel", "parallel", "parallel", "parallel"]
} ins(%171 : tensor<1x2x1x1xf32>) outs(%173 : tensor<1x2x1x4xf32>) {
^bb0(%a0: f32, %a1: f32):
linalg.yield %a0 : f32
} -> tensor<1x2x1x4xf32>
%175 = tensor.empty() : tensor<1x2x1x4xf32>
%176 = linalg.div ins(%156, %174 : tensor<1x2x1x4xf32>, tensor<1x2x1x4xf32>) outs(%175 : tensor<1x2x1x4xf32>) -> tensor<1x2x1x4xf32>
%177 = tensor.collapse_shape %176 [[0, 1], [2], [3]] : tensor<1x2x1x4xf32> into tensor<2x1x4xf32>
%178 = tensor.collapse_shape %136 [[0, 1], [2], [3]] : tensor<1x2x4x2xf32> into tensor<2x4x2xf32>
%179 = arith.constant dense<0.000000e+00> : tensor<2x1x2xf32>
%180 = linalg.batch_matmul ins(%177, %178 : tensor<2x1x4xf32>, tensor<2x4x2xf32>) outs(%179 : tensor<2x1x2xf32>) -> tensor<2x1x2xf32>
%181 = tensor.expand_shape %180 [[0, 1], [2], [3]] : tensor<2x1x2xf32> into tensor<1x2x1x2xf32>
return %133, %136, %181 : tensor<1x2x2x4xf32>, tensor<1x2x4x2xf32>, tensor<1x2x1x2xf32>
}
func.func @main() -> (tensor<1x2x2x4xf32>, tensor<1x2x4x2xf32>, tensor<1x2x1x2xf32>) {
%182 = arith.constant dense<0.000000e+00> : tensor<1x2x1x2xf32>
%183 = arith.constant dense<0.000000e+00> : tensor<1x2x2x3xf32>
%184 = arith.constant dense<0.000000e+00> : tensor<1x2x2x1xf32>
%185 = arith.constant dense<0.000000e+00> : tensor<1x2x3x2xf32>
%186 = arith.constant dense<0.000000e+00> : tensor<1x2x1x2xf32>
%187 = arith.constant dense<0.000000e+00> : tensor<1x1x1x1xf32>
%188, %189, %190 = func.call @fn_val_124(%182, %183, %184, %185, %186, %187) : (tensor<1x2x1x2xf32>, tensor<1x2x2x3xf32>, tensor<1x2x2x1xf32>, tensor<1x2x3x2xf32>, tensor<1x2x1x2xf32>, tensor<1x1x1x1xf32>) -> (tensor<1x2x2x4xf32>, tensor<1x2x4x2xf32>, tensor<1x2x1x2xf32>)
return %188, %189, %190 : tensor<1x2x2x4xf32>, tensor<1x2x4x2xf32>, tensor<1x2x1x2xf32>
}
}