Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 1 | // RUN: mlir-opt %s -inline | FileCheck %s |
| 2 | |
| 3 | // These tests verify that regions with operations from TOSA dialect |
| 4 | // can be inlined. |
| 5 | |
| 6 | // CHECK-LABEL: func @inlined_if_fn |
| 7 | // Check that both the calls and the functions are eliminated after inlining: |
| 8 | // CHECK-NOT: @add |
| 9 | // CHECK-NOT: @sub |
River Riddle | c48e3a1 | 2022-04-20 23:19:48 | [diff] [blame] | 10 | func.func @inlined_if_fn(%arg0: tensor<f32>, %arg1: tensor<f32>, %arg2: tensor<i1>) -> tensor<f32> { |
Mogball | 5c36ee8 | 2022-01-18 07:47:25 | [diff] [blame] | 11 | %0 = "tosa.cond_if"(%arg2, %arg0, %arg1) ({ |
Hanhan Wang | 0a1569a | 2022-11-28 22:17:55 | [diff] [blame] | 12 | ^bb0(%arg3: tensor<f32>, %arg4: tensor<f32>): |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 13 | %1 = call @add(%arg3, %arg4) : (tensor<f32>, tensor<f32>) -> tensor<f32> |
| 14 | "tosa.yield"(%1) : (tensor<f32>) -> () |
| 15 | }, { |
Hanhan Wang | 0a1569a | 2022-11-28 22:17:55 | [diff] [blame] | 16 | ^bb0(%arg3: tensor<f32>, %arg4: tensor<f32>): |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 17 | %1 = call @sub(%arg3, %arg4) : (tensor<f32>, tensor<f32>) -> tensor<f32> |
| 18 | "tosa.yield"(%1) : (tensor<f32>) -> () |
| 19 | }) : (tensor<i1>, tensor<f32>, tensor<f32>) -> tensor<f32> |
| 20 | return %0 : tensor<f32> |
| 21 | } |
River Riddle | c48e3a1 | 2022-04-20 23:19:48 | [diff] [blame] | 22 | func.func private @add(%arg0: tensor<f32>, %arg1: tensor<f32>) -> tensor<f32> { |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 23 | %0 = "tosa.add"(%arg0, %arg1) : (tensor<f32>, tensor<f32>) -> tensor<f32> |
| 24 | return %0 : tensor<f32> |
| 25 | } |
River Riddle | c48e3a1 | 2022-04-20 23:19:48 | [diff] [blame] | 26 | func.func private @sub(%arg0: tensor<f32>, %arg1: tensor<f32>) -> tensor<f32> { |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 27 | %0 = "tosa.sub"(%arg0, %arg1) : (tensor<f32>, tensor<f32>) -> tensor<f32> |
| 28 | return %0 : tensor<f32> |
| 29 | } |
| 30 | |
| 31 | // ----- |
| 32 | |
| 33 | // CHECK-LABEL: func @inlined_while_fn |
River Riddle | c48e3a1 | 2022-04-20 23:19:48 | [diff] [blame] | 34 | func.func @inlined_while_fn(%arg0: tensor<i32>, %arg1: tensor<i32>, %arg2: tensor<i32>, %arg3: tensor<10xi32>) -> tensor<10xi32> { |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 35 | // Check that calls are inlined and functions eliminated: |
| 36 | // CHECK-NOT: @while |
Mogball | 5c36ee8 | 2022-01-18 07:47:25 | [diff] [blame] | 37 | %1:4 = "tosa.while_loop"(%arg0, %arg1, %arg2, %arg3) ({ |
Hanhan Wang | 0a1569a | 2022-11-28 22:17:55 | [diff] [blame] | 38 | ^bb0(%arg4: tensor<i32>, %arg5: tensor<i32>, %arg6: tensor<i32>, %arg7: tensor<10xi32>): |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 39 | %2 = call @while_cond_40(%arg4, %arg5, %arg6, %arg7) : (tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32>) -> tensor<i1> |
| 40 | "tosa.yield"(%2) : (tensor<i1>) -> () |
| 41 | }, { |
Hanhan Wang | 0a1569a | 2022-11-28 22:17:55 | [diff] [blame] | 42 | ^bb0(%arg4: tensor<i32>, %arg5: tensor<i32>, %arg6: tensor<i32>, %arg7: tensor<10xi32>): |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 43 | %2:4 = call @while_body_50(%arg4, %arg5, %arg6, %arg7) : (tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32>) -> (tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32>) |
| 44 | "tosa.yield"(%2#0, %2#1, %2#2, %2#3) : (tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32>) -> () |
| 45 | }) : (tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32>) -> (tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32>) |
| 46 | return %1#3 : tensor<10xi32> |
| 47 | } |
River Riddle | c48e3a1 | 2022-04-20 23:19:48 | [diff] [blame] | 48 | func.func private @while_body_50(%arg0: tensor<i32>, %arg1: tensor<i32>, %arg2: tensor<i32>, %arg3: tensor<10xi32>) -> (tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32>) { |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 49 | %1 = "tosa.add"(%arg0, %arg1) : (tensor<i32>, tensor<i32>) -> tensor<i32> |
Jerry-Ge | 472c2e3 | 2025-03-06 22:55:50 | [diff] [blame] | 50 | %4 = "tosa.const_shape"() {values = dense<1> : tensor<1xindex>} : () -> !tosa.shape<1> |
TatWai Chong | 571a987 | 2025-02-07 18:24:52 | [diff] [blame] | 51 | %3 = "tosa.reshape"(%1, %4) : (tensor<i32>, !tosa.shape<1>) -> tensor<1xi32> |
Tai Ly | 729f958 | 2025-01-22 13:21:04 | [diff] [blame] | 52 | %2 = "tosa.add"(%arg3, %3) : (tensor<10xi32>, tensor<1xi32>) -> tensor<10xi32> |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 53 | return %1, %arg1, %arg2, %2: tensor<i32>, tensor<i32>, tensor<i32>, tensor<10xi32> |
| 54 | } |
River Riddle | c48e3a1 | 2022-04-20 23:19:48 | [diff] [blame] | 55 | func.func private @while_cond_40(%arg0: tensor<i32>, %arg1: tensor<i32>, %arg2: tensor<i32>, %arg3: tensor<10xi32>) -> tensor<i1> { |
Suraj Sudhir | b281211 | 2020-11-07 16:35:27 | [diff] [blame] | 56 | %0 = "tosa.greater_equal"(%arg0, %arg1) : (tensor<i32>, tensor<i32>) -> tensor<i1> |
| 57 | %1 = "tosa.logical_not"(%0) : (tensor<i1>) -> tensor<i1> |
| 58 | return %1 : tensor<i1> |
| 59 | } |