| // RUN: iree-opt --split-input-file --iree-stablehlo-input-transformation-pipeline %s | FileCheck %s | |
| // Composite ops must be replaced by their decomposition, which is then inlined | |
| // and lowered like any other StableHLO computation. | |
| // CHECK-LABEL: func.func @acos_composite | |
| // CHECK-NOT: stablehlo.composite | |
| // CHECK-NOT: func.call | |
| // CHECK: linalg.generic | |
| // CHECK: math.atan2 | |
| func.func @acos_composite(%arg0: tensor<8x32xf32>) -> tensor<8x32xf32> { | |
| %0 = stablehlo.composite "chlo.acos" %arg0 {decomposition = @chlo.acos.impl, version = 1 : i32} : (tensor<8x32xf32>) -> tensor<8x32xf32> | |
| return %0 : tensor<8x32xf32> | |
| } | |
| func.func private @chlo.acos.impl(%arg0: tensor<8x32xf32>) -> tensor<8x32xf32> { | |
| %cst = stablehlo.constant dense<1.000000e+00> : tensor<8x32xf32> | |
| %0 = stablehlo.subtract %cst, %arg0 : tensor<8x32xf32> | |
| %1 = stablehlo.add %cst, %arg0 : tensor<8x32xf32> | |
| %2 = stablehlo.multiply %0, %1 : tensor<8x32xf32> | |
| %3 = stablehlo.sqrt %2 : tensor<8x32xf32> | |
| %4 = stablehlo.atan2 %3, %arg0 : tensor<8x32xf32> | |
| return %4 : tensor<8x32xf32> | |
| } | |
| // ----- | |
| // A composite taking multiple operands and returning multiple results. | |
| // CHECK-LABEL: func.func @multi_result_composite | |
| // CHECK-NOT: stablehlo.composite | |
| // CHECK-NOT: func.call | |
| // CHECK: arith.addf | |
| // CHECK: arith.mulf | |
| func.func @multi_result_composite(%arg0: tensor<4xf32>, %arg1: tensor<4xf32>) | |
| -> (tensor<4xf32>, tensor<4xf32>) { | |
| %0:2 = stablehlo.composite "my_namespace.add_mul" %arg0, %arg1 { | |
| decomposition = @add_mul.impl, | |
| composite_attributes = {my_attribute = "my_value"}, | |
| version = 1 : i32 | |
| } : (tensor<4xf32>, tensor<4xf32>) -> (tensor<4xf32>, tensor<4xf32>) | |
| return %0#0, %0#1 : tensor<4xf32>, tensor<4xf32> | |
| } | |
| func.func private @add_mul.impl(%arg0: tensor<4xf32>, %arg1: tensor<4xf32>) | |
| -> (tensor<4xf32>, tensor<4xf32>) { | |
| %0 = stablehlo.add %arg0, %arg1 : tensor<4xf32> | |
| %1 = stablehlo.multiply %arg0, %arg1 : tensor<4xf32> | |
| return %0, %1 : tensor<4xf32>, tensor<4xf32> | |
| } |