https://github.com/c8ef created https://github.com/llvm/llvm-project/pull/149527
None >From b1c844ef619540c36898b2194f7599f056c80805 Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Fri, 18 Jul 2025 15:04:52 +0000 Subject: [PATCH] [flang] Implement tanpi --- .../flang/Optimizer/Builder/IntrinsicCall.h | 1 + flang/lib/Evaluate/intrinsics.cpp | 1 + flang/lib/Optimizer/Builder/IntrinsicCall.cpp | 16 ++++++++++++++ flang/test/Lower/Intrinsics/tanpi.f90 | 22 +++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 flang/test/Lower/Intrinsics/tanpi.f90 diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h index d84d3593ebca6..ab08415fe32c8 100644 --- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h +++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h @@ -439,6 +439,7 @@ struct IntrinsicLibrary { mlir::ArrayRef<fir::ExtendedValue> args); void genSystemClock(llvm::ArrayRef<fir::ExtendedValue>); mlir::Value genTand(mlir::Type, llvm::ArrayRef<mlir::Value>); + mlir::Value genTanpi(mlir::Type, llvm::ArrayRef<mlir::Value>); mlir::Value genTime(mlir::Type, llvm::ArrayRef<mlir::Value>); mlir::Value genTrailz(mlir::Type, llvm::ArrayRef<mlir::Value>); fir::ExtendedValue genTransfer(mlir::Type, diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp index d44239b41fa20..9c6d49dfda3e8 100644 --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -989,6 +989,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{ {"tan", {{"x", SameFloating}}, SameFloating}, {"tand", {{"x", SameFloating}}, SameFloating}, {"tanh", {{"x", SameFloating}}, SameFloating}, + {"tanpi", {{"x", SameFloating}}, SameFloating}, {"team_number", {OptionalTEAM}, DefaultInt, Rank::scalar, IntrinsicClass::transformationalFunction}, {"this_image", diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 823b1eb887992..c7758df695db2 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -942,6 +942,7 @@ static constexpr IntrinsicHandler handlers[]{ {{{"count", asAddr}, {"count_rate", asAddr}, {"count_max", asAddr}}}, /*isElemental=*/false}, {"tand", &I::genTand}, + {"tanpi", &I::genTanpi}, {"this_grid", &I::genThisGrid, {}, /*isElemental=*/false}, {"this_thread_block", &I::genThisThreadBlock, {}, /*isElemental=*/false}, {"this_warp", &I::genThisWarp, {}, /*isElemental=*/false}, @@ -8157,6 +8158,21 @@ mlir::Value IntrinsicLibrary::genTand(mlir::Type resultType, return getRuntimeCallGenerator("tan", ftype)(builder, loc, {arg}); } +// TANPI +mlir::Value IntrinsicLibrary::genTanpi(mlir::Type resultType, + llvm::ArrayRef<mlir::Value> args) { + assert(args.size() == 1); + mlir::MLIRContext *context = builder.getContext(); + mlir::FunctionType ftype = + mlir::FunctionType::get(context, {resultType}, {args[0].getType()}); + llvm::APFloat pi = llvm::APFloat(llvm::numbers::pi); + mlir::Value dfactor = + builder.createRealConstant(loc, mlir::Float64Type::get(context), pi); + mlir::Value factor = builder.createConvert(loc, args[0].getType(), dfactor); + mlir::Value arg = builder.create<mlir::arith::MulFOp>(loc, args[0], factor); + return getRuntimeCallGenerator("tan", ftype)(builder, loc, {arg}); +} + // THIS_GRID mlir::Value IntrinsicLibrary::genThisGrid(mlir::Type resultType, llvm::ArrayRef<mlir::Value> args) { diff --git a/flang/test/Lower/Intrinsics/tanpi.f90 b/flang/test/Lower/Intrinsics/tanpi.f90 new file mode 100644 index 0000000000000..9cc3ae6ef1563 --- /dev/null +++ b/flang/test/Lower/Intrinsics/tanpi.f90 @@ -0,0 +1,22 @@ +! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK" + +function test_real4(x) + real :: x, test_real4 + test_real4 = tanpi(x) +end function + +! CHECK-LABEL: @_QPtest_real4 +! CHECK: %[[dfactor:.*]] = arith.constant 3.1415926535897931 : f64 +! CHECK: %[[factor:.*]] = fir.convert %[[dfactor]] : (f64) -> f32 +! CHECK: %[[mul:.*]] = arith.mulf %{{.*}}, %[[factor]] fastmath<contract> : f32 +! CHECK: %[[tan:.*]] = math.tan %[[mul]] fastmath<contract> : f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = tanpi(x) +end function + +! CHECK-LABEL: @_QPtest_real8 +! CHECK: %[[dfactor:.*]] = arith.constant 3.1415926535897931 : f64 +! CHECK: %[[mul:.*]] = arith.mulf %{{.*}}, %[[dfactor]] fastmath<contract> : f64 +! CHECK: %[[tan:.*]] = math.tan %[[mul]] fastmath<contract> : f64 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits