diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 178b6770d6b53..679ed735ccd64 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -2645,16 +2645,18 @@ mlir::Value IntrinsicLibrary::genAbs(mlir::Type resultType, // ACOSD mlir::Value IntrinsicLibrary::genAcosd(mlir::Type resultType, llvm::ArrayRef args) { + // maps ACOSD to ACOS * 180 / pi assert(args.size() == 1); mlir::MLIRContext *context = builder.getContext(); mlir::FunctionType ftype = mlir::FunctionType::get(context, {resultType}, {args[0].getType()}); + mlir::Value result = + getRuntimeCallGenerator("acos", ftype)(builder, loc, {args[0]}); llvm::APFloat pi = llvm::APFloat(llvm::numbers::pi); mlir::Value dfactor = builder.createRealConstant( - loc, mlir::Float64Type::get(context), pi / llvm::APFloat(180.0)); + loc, mlir::Float64Type::get(context), llvm::APFloat(180.0) / pi); mlir::Value factor = builder.createConvert(loc, args[0].getType(), dfactor); - mlir::Value arg = builder.create(loc, args[0], factor); - return getRuntimeCallGenerator("acos", ftype)(builder, loc, {arg}); + return builder.create(loc, result, factor); } // ADJUSTL & ADJUSTR @@ -2796,16 +2798,18 @@ IntrinsicLibrary::genAny(mlir::Type resultType, // ASIND mlir::Value IntrinsicLibrary::genAsind(mlir::Type resultType, llvm::ArrayRef args) { + // maps ASIND to ASIN * 180 / pi assert(args.size() == 1); mlir::MLIRContext *context = builder.getContext(); mlir::FunctionType ftype = mlir::FunctionType::get(context, {resultType}, {args[0].getType()}); + mlir::Value result = + getRuntimeCallGenerator("asin", ftype)(builder, loc, {args[0]}); llvm::APFloat pi = llvm::APFloat(llvm::numbers::pi); mlir::Value dfactor = builder.createRealConstant( - loc, mlir::Float64Type::get(context), pi / llvm::APFloat(180.0)); + loc, mlir::Float64Type::get(context), llvm::APFloat(180.0) / pi); mlir::Value factor = builder.createConvert(loc, args[0].getType(), dfactor); - mlir::Value arg = builder.create(loc, args[0], factor); - return getRuntimeCallGenerator("asin", ftype)(builder, loc, {arg}); + return builder.create(loc, result, factor); } // ATAND, ATAN2D diff --git a/flang/test/Lower/Intrinsics/acosd.f90 b/flang/test/Lower/Intrinsics/acosd.f90 index 3f558d66c35a1..7dfa28fd6494e 100644 --- a/flang/test/Lower/Intrinsics/acosd.f90 +++ b/flang/test/Lower/Intrinsics/acosd.f90 @@ -1,5 +1,3 @@ -! RUN: bbc -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK" -! RUN: bbc --math-runtime=precise -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK,CHECK-PRECISE" ! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK" function test_real4(x) @@ -8,10 +6,10 @@ function test_real4(x) end function ! CHECK-LABEL: @_QPtest_real4 -! CHECK: %[[dfactor:.*]] = arith.constant 0.017453292519943295 : f64 +! CHECK: %[[dfactor:.*]] = arith.constant 57.295779513082323 : f64 +! CHECK: %[[result:.*]] = math.acos %{{.*}} fastmath : f32 ! CHECK: %[[factor:.*]] = fir.convert %[[dfactor]] : (f64) -> f32 -! CHECK: %[[arg:.*]] = arith.mulf %{{[A-Za-z0-9._]+}}, %[[factor]] fastmath : f32 -! CHECK-PRECISE: %{{.*}} = fir.call @acosf(%[[arg]]) fastmath : (f32) -> f32 +! CHECK: %[[arg:.*]] = arith.mulf %[[result]], %[[factor]] fastmath : f32 function test_real8(x) real(8) :: x, test_real8 @@ -19,6 +17,6 @@ function test_real8(x) end function ! CHECK-LABEL: @_QPtest_real8 -! CHECK: %[[factor:.*]] = arith.constant 0.017453292519943295 : f64 -! CHECK: %[[arg:.*]] = arith.mulf %{{[A-Za-z0-9._]+}}, %[[factor]] fastmath : f64 -! CHECK-PRECISE: %{{.*}} = fir.call @acos(%[[arg]]) fastmath : (f64) -> f64 +! CHECK: %[[dfactor:.*]] = arith.constant 57.295779513082323 : f64 +! CHECK: %[[result:.*]] = math.acos %{{.*}} fastmath : f64 +! CHECK: %[[arg:.*]] = arith.mulf %[[result]], %[[dfactor]] fastmath : f64 diff --git a/flang/test/Lower/Intrinsics/asind.f90 b/flang/test/Lower/Intrinsics/asind.f90 index e03f2e5598555..564fa955fa969 100644 --- a/flang/test/Lower/Intrinsics/asind.f90 +++ b/flang/test/Lower/Intrinsics/asind.f90 @@ -1,5 +1,3 @@ -! RUN: bbc -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK" -! RUN: bbc --math-runtime=precise -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK,CHECK-PRECISE" ! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK" function test_real4(x) @@ -8,10 +6,10 @@ function test_real4(x) end function ! CHECK-LABEL: @_QPtest_real4 -! CHECK: %[[dfactor:.*]] = arith.constant 0.017453292519943295 : f64 +! CHECK: %[[dfactor:.*]] = arith.constant 57.295779513082323 : f64 +! CHECK: %[[result:.*]] = math.asin %{{.*}} fastmath : f32 ! CHECK: %[[factor:.*]] = fir.convert %[[dfactor]] : (f64) -> f32 -! CHECK: %[[arg:.*]] = arith.mulf %{{[A-Za-z0-9._]+}}, %[[factor]] fastmath : f32 -! CHECK-PRECISE: %{{.*}} = fir.call @asinf(%[[arg]]) fastmath : (f32) -> f32 +! CHECK: %[[arg:.*]] = arith.mulf %[[result]], %[[factor]] fastmath : f32 function test_real8(x) real(8) :: x, test_real8 @@ -19,6 +17,6 @@ function test_real8(x) end function ! CHECK-LABEL: @_QPtest_real8 -! CHECK: %[[factor:.*]] = arith.constant 0.017453292519943295 : f64 -! CHECK: %[[arg:.*]] = arith.mulf %{{[A-Za-z0-9._]+}}, %[[factor]] fastmath : f64 -! CHECK-PRECISE: %{{.*}} = fir.call @asin(%[[arg]]) fastmath : (f64) -> f64 +! CHECK: %[[dfactor:.*]] = arith.constant 57.295779513082323 : f64 +! CHECK: %[[result:.*]] = math.asin %{{.*}} fastmath : f64 +! CHECK: %[[arg:.*]] = arith.mulf %[[result]], %[[dfactor]] fastmath : f64