[mlir][math] Added math::tan operation.
Differential Revision: https://reviews.llvm.org/D129539
This commit is contained in:
		
							parent
							
								
									f5d9de8cc3
								
							
						
					
					
						commit
						451e5e2b28
					
				| 
						 | 
				
			
			@ -632,6 +632,26 @@ def Math_SqrtOp : Math_FloatUnaryOp<"sqrt"> {
 | 
			
		|||
  let hasFolder = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
// TanOp
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
 | 
			
		||||
def Math_TanOp : Math_FloatUnaryOp<"tan"> {
 | 
			
		||||
  let summary = "tangent of the specified value";
 | 
			
		||||
  let description = [{
 | 
			
		||||
    The `tan` operation computes the tangent. It takes one operand
 | 
			
		||||
    of floating point type (i.e., scalar, tensor or vector) and returns one
 | 
			
		||||
    result of the same type. It has no standard attributes.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
 | 
			
		||||
    ```mlir
 | 
			
		||||
    // Scalar tangent value.
 | 
			
		||||
    %a = math.tan %b : f64
 | 
			
		||||
    ```
 | 
			
		||||
  }];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
// TanhOp
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,13 +143,13 @@ void mlir::populateMathToLibmConversionPatterns(RewritePatternSet &patterns,
 | 
			
		|||
  patterns.add<VecOpToScalarOp<math::Atan2Op>, VecOpToScalarOp<math::ExpM1Op>,
 | 
			
		||||
               VecOpToScalarOp<math::TanhOp>, VecOpToScalarOp<math::CosOp>,
 | 
			
		||||
               VecOpToScalarOp<math::SinOp>, VecOpToScalarOp<math::ErfOp>,
 | 
			
		||||
               VecOpToScalarOp<math::RoundOp>, VecOpToScalarOp<math::AtanOp>>(
 | 
			
		||||
      patterns.getContext(), benefit);
 | 
			
		||||
               VecOpToScalarOp<math::RoundOp>, VecOpToScalarOp<math::AtanOp>,
 | 
			
		||||
               VecOpToScalarOp<math::TanOp>>(patterns.getContext(), benefit);
 | 
			
		||||
  patterns.add<PromoteOpToF32<math::Atan2Op>, PromoteOpToF32<math::ExpM1Op>,
 | 
			
		||||
               PromoteOpToF32<math::TanhOp>, PromoteOpToF32<math::CosOp>,
 | 
			
		||||
               PromoteOpToF32<math::SinOp>, PromoteOpToF32<math::ErfOp>,
 | 
			
		||||
               PromoteOpToF32<math::RoundOp>, PromoteOpToF32<math::AtanOp>>(
 | 
			
		||||
      patterns.getContext(), benefit);
 | 
			
		||||
               PromoteOpToF32<math::RoundOp>, PromoteOpToF32<math::AtanOp>,
 | 
			
		||||
               PromoteOpToF32<math::TanOp>>(patterns.getContext(), benefit);
 | 
			
		||||
  patterns.add<ScalarOpToLibmCall<math::AtanOp>>(patterns.getContext(), "atanf",
 | 
			
		||||
                                                 "atan", benefit);
 | 
			
		||||
  patterns.add<ScalarOpToLibmCall<math::Atan2Op>>(patterns.getContext(),
 | 
			
		||||
| 
						 | 
				
			
			@ -158,6 +158,8 @@ void mlir::populateMathToLibmConversionPatterns(RewritePatternSet &patterns,
 | 
			
		|||
                                                "erf", benefit);
 | 
			
		||||
  patterns.add<ScalarOpToLibmCall<math::ExpM1Op>>(patterns.getContext(),
 | 
			
		||||
                                                  "expm1f", "expm1", benefit);
 | 
			
		||||
  patterns.add<ScalarOpToLibmCall<math::TanOp>>(patterns.getContext(), "tanf",
 | 
			
		||||
                                                "tan", benefit);
 | 
			
		||||
  patterns.add<ScalarOpToLibmCall<math::TanhOp>>(patterns.getContext(), "tanhf",
 | 
			
		||||
                                                 "tanh", benefit);
 | 
			
		||||
  patterns.add<ScalarOpToLibmCall<math::RoundOp>>(patterns.getContext(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,8 @@
 | 
			
		|||
// CHECK-DAG: @expm1f(f32) -> f32
 | 
			
		||||
// CHECK-DAG: @atan2(f64, f64) -> f64
 | 
			
		||||
// CHECK-DAG: @atan2f(f32, f32) -> f32
 | 
			
		||||
// CHECK-DAG: @tan(f64) -> f64
 | 
			
		||||
// CHECK-DAG: @tanf(f32) -> f32
 | 
			
		||||
// CHECK-DAG: @tanh(f64) -> f64
 | 
			
		||||
// CHECK-DAG: @tanhf(f32) -> f32
 | 
			
		||||
// CHECK-DAG: @round(f64) -> f64
 | 
			
		||||
| 
						 | 
				
			
			@ -254,3 +256,50 @@ func.func @round_vec_caller(%float: vector<2xf32>, %double: vector<2xf64>) -> (v
 | 
			
		|||
  // CHECK:           return %[[VAL_11]], %[[VAL_17]] : vector<2xf32>, vector<2xf64>
 | 
			
		||||
  return %float_result, %double_result : vector<2xf32>, vector<2xf64>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CHECK-LABEL: func @tan_caller
 | 
			
		||||
// CHECK-SAME: %[[FLOAT:.*]]: f32
 | 
			
		||||
// CHECK-SAME: %[[DOUBLE:.*]]: f64
 | 
			
		||||
// CHECK-SAME: %[[HALF:.*]]: f16
 | 
			
		||||
// CHECK-SAME: %[[BFLOAT:.*]]: bf16
 | 
			
		||||
func.func @tan_caller(%float: f32, %double: f64, %half: f16, %bfloat: bf16) -> (f32, f64, f16, bf16)  {
 | 
			
		||||
  // CHECK: %[[FLOAT_RESULT:.*]] = call @tanf(%[[FLOAT]]) : (f32) -> f32
 | 
			
		||||
  %float_result = math.tan %float : f32
 | 
			
		||||
  // CHECK: %[[DOUBLE_RESULT:.*]] = call @tan(%[[DOUBLE]]) : (f64) -> f64
 | 
			
		||||
  %double_result = math.tan %double : f64
 | 
			
		||||
  // CHECK: %[[HALF_PROMOTED:.*]] = arith.extf %[[HALF]] : f16 to f32
 | 
			
		||||
  // CHECK: %[[HALF_CALL:.*]] = call @tanf(%[[HALF_PROMOTED]]) : (f32) -> f32
 | 
			
		||||
  // CHECK: %[[HALF_RESULT:.*]] = arith.truncf %[[HALF_CALL]] : f32 to f16
 | 
			
		||||
  %half_result = math.tan %half : f16
 | 
			
		||||
  // CHECK: %[[BFLOAT_PROMOTED:.*]] = arith.extf %[[BFLOAT]] : bf16 to f32
 | 
			
		||||
  // CHECK: %[[BFLOAT_CALL:.*]] = call @tanf(%[[BFLOAT_PROMOTED]]) : (f32) -> f32
 | 
			
		||||
  // CHECK: %[[BFLOAT_RESULT:.*]] = arith.truncf %[[BFLOAT_CALL]] : f32 to bf16
 | 
			
		||||
  %bfloat_result = math.tan %bfloat : bf16
 | 
			
		||||
  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]], %[[HALF_RESULT]], %[[BFLOAT_RESULT]]
 | 
			
		||||
  return %float_result, %double_result, %half_result, %bfloat_result : f32, f64, f16, bf16
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CHECK-LABEL:   func @tan_vec_caller(
 | 
			
		||||
// CHECK-SAME:                           %[[VAL_0:.*]]: vector<2xf32>,
 | 
			
		||||
// CHECK-SAME:                           %[[VAL_1:.*]]: vector<2xf64>) -> (vector<2xf32>, vector<2xf64>) {
 | 
			
		||||
// CHECK-DAG:       %[[CVF:.*]] = arith.constant dense<0.000000e+00> : vector<2xf32>
 | 
			
		||||
// CHECK-DAG:       %[[CVD:.*]] = arith.constant dense<0.000000e+00> : vector<2xf64>
 | 
			
		||||
// CHECK:           %[[IN0_F32:.*]] = vector.extract %[[VAL_0]][0] : vector<2xf32>
 | 
			
		||||
// CHECK:           %[[OUT0_F32:.*]] = call @tanf(%[[IN0_F32]]) : (f32) -> f32
 | 
			
		||||
// CHECK:           %[[VAL_8:.*]] = vector.insert %[[OUT0_F32]], %[[CVF]] [0] : f32 into vector<2xf32>
 | 
			
		||||
// CHECK:           %[[IN1_F32:.*]] = vector.extract %[[VAL_0]][1] : vector<2xf32>
 | 
			
		||||
// CHECK:           %[[OUT1_F32:.*]] = call @tanf(%[[IN1_F32]]) : (f32) -> f32
 | 
			
		||||
// CHECK:           %[[VAL_11:.*]] = vector.insert %[[OUT1_F32]], %[[VAL_8]] [1] : f32 into vector<2xf32>
 | 
			
		||||
// CHECK:           %[[IN0_F64:.*]] = vector.extract %[[VAL_1]][0] : vector<2xf64>
 | 
			
		||||
// CHECK:           %[[OUT0_F64:.*]] = call @tan(%[[IN0_F64]]) : (f64) -> f64
 | 
			
		||||
// CHECK:           %[[VAL_14:.*]] = vector.insert %[[OUT0_F64]], %[[CVD]] [0] : f64 into vector<2xf64>
 | 
			
		||||
// CHECK:           %[[IN1_F64:.*]] = vector.extract %[[VAL_1]][1] : vector<2xf64>
 | 
			
		||||
// CHECK:           %[[OUT1_F64:.*]] = call @tan(%[[IN1_F64]]) : (f64) -> f64
 | 
			
		||||
// CHECK:           %[[VAL_17:.*]] = vector.insert %[[OUT1_F64]], %[[VAL_14]] [1] : f64 into vector<2xf64>
 | 
			
		||||
// CHECK:           return %[[VAL_11]], %[[VAL_17]] : vector<2xf32>, vector<2xf64>
 | 
			
		||||
// CHECK:         }
 | 
			
		||||
func.func @tan_vec_caller(%float: vector<2xf32>, %double: vector<2xf64>) -> (vector<2xf32>, vector<2xf64>) {
 | 
			
		||||
  %float_result = math.tan %float : vector<2xf32>
 | 
			
		||||
  %double_result = math.tan %double : vector<2xf64>
 | 
			
		||||
  return %float_result, %double_result : vector<2xf32>, vector<2xf64>
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -183,6 +183,18 @@ func.func @sqrt(%f: f32, %v: vector<4xf32>, %t: tensor<4x4x?xf32>) {
 | 
			
		|||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CHECK-LABEL: func @tan(
 | 
			
		||||
// CHECK-SAME:             %[[F:.*]]: f32, %[[V:.*]]: vector<4xf32>, %[[T:.*]]: tensor<4x4x?xf32>)
 | 
			
		||||
func.func @tan(%f: f32, %v: vector<4xf32>, %t: tensor<4x4x?xf32>) {
 | 
			
		||||
  // CHECK: %{{.*}} = math.tan %[[F]] : f32
 | 
			
		||||
  %0 = math.tan %f : f32
 | 
			
		||||
  // CHECK: %{{.*}} = math.tan %[[V]] : vector<4xf32>
 | 
			
		||||
  %1 = math.tan %v : vector<4xf32>
 | 
			
		||||
  // CHECK: %{{.*}} = math.tan %[[T]] : tensor<4x4x?xf32>
 | 
			
		||||
  %2 = math.tan %t : tensor<4x4x?xf32>
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CHECK-LABEL: func @tanh(
 | 
			
		||||
// CHECK-SAME:             %[[F:.*]]: f32, %[[V:.*]]: vector<4xf32>, %[[T:.*]]: tensor<4x4x?xf32>)
 | 
			
		||||
func.func @tanh(%f: f32, %v: vector<4xf32>, %t: tensor<4x4x?xf32>) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue