mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 15:56:40 +00:00

Fix the various complex libm selection logic issues from D155310: - disableMlirComplex is set to false. This means that using mlir complex is enabled. Yet, the current code still selects libm. - If we enable mlir complex, we should not check if use approx is enabled. Namely, we should use mlir complex either if we enable mlir complex OR use approx is enabled. To fix the issues, we flip the logic of `disableMlirComplex` to enable instead. We set it to false by default since the intention from D155310 is to use libm by default. Then we use a logical `&&` with use approx so that we select libm when BOTH mlir complex and use approx are disabled. Reviewed By: vzakhari Differential Revision: https://reviews.llvm.org/D155737
142 lines
3.3 KiB
Fortran
142 lines
3.3 KiB
Fortran
! RUN: bbc -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK,PRECISE"
|
|
! RUN: bbc --math-runtime=precise -emit-fir %s -o - | FileCheck %s --check-prefixes="PRECISE"
|
|
! RUN: bbc --force-mlir-complex -emit-fir %s -o - | FileCheck %s --check-prefixes="FAST"
|
|
! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK,PRECISE"
|
|
! RUN: %flang_fc1 -fapprox-func -emit-fir %s -o - | FileCheck %s --check-prefixes="CHECK,FAST"
|
|
! RUN: %flang_fc1 -emit-fir -mllvm --math-runtime=precise %s -o - | FileCheck %s --check-prefixes="PRECISE"
|
|
! RUN: %flang_fc1 -emit-fir -mllvm --force-mlir-complex %s -o - | FileCheck %s --check-prefixes="FAST"
|
|
|
|
! Test power operation lowering
|
|
|
|
! CHECK-LABEL: pow_r4_i4
|
|
subroutine pow_r4_i4(x, y, z)
|
|
real :: x, z
|
|
integer :: y
|
|
z = x ** y
|
|
! CHECK: math.fpowi {{.*}} : f32, i32
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_r4_r4
|
|
subroutine pow_r4_r4(x, y, z)
|
|
real :: x, z, y
|
|
z = x ** y
|
|
! CHECK: math.powf %{{.*}}, %{{.*}} : f32
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_r4_i8
|
|
subroutine pow_r4_i8(x, y, z)
|
|
real :: x, z
|
|
integer(8) :: y
|
|
z = x ** y
|
|
! CHECK: math.fpowi {{.*}} : f32, i64
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_r8_i4
|
|
subroutine pow_r8_i4(x, y, z)
|
|
real(8) :: x, z
|
|
integer :: y
|
|
z = x ** y
|
|
! CHECK: math.fpowi {{.*}} : f64, i32
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_r8_i8
|
|
subroutine pow_r8_i8(x, y, z)
|
|
real(8) :: x, z
|
|
integer(8) :: y
|
|
z = x ** y
|
|
! CHECK: math.fpowi {{.*}} : f64, i64
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_r8_r8
|
|
subroutine pow_r8_r8(x, y, z)
|
|
real(8) :: x, z, y
|
|
z = x ** y
|
|
! CHECK: math.powf %{{.*}}, %{{.*}} : f64
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_r4_r8
|
|
subroutine pow_r4_r8(x, y, z)
|
|
real(4) :: x
|
|
real(8) :: z, y
|
|
z = x ** y
|
|
! CHECK: %{{.*}} = fir.convert %{{.*}} : (f32) -> f64
|
|
! CHECK: math.powf %{{.*}}, %{{.*}} : f64
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_i1_i1
|
|
subroutine pow_i1_i1(x, y, z)
|
|
integer(1) :: x, y, z
|
|
z = x ** y
|
|
! CHECK: math.ipowi %{{.*}}, %{{.*}} : i8
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_i2_i2
|
|
subroutine pow_i2_i2(x, y, z)
|
|
integer(2) :: x, y, z
|
|
z = x ** y
|
|
! CHECK: math.ipowi %{{.*}}, %{{.*}} : i16
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_i4_i4
|
|
subroutine pow_i4_i4(x, y, z)
|
|
integer(4) :: x, y, z
|
|
z = x ** y
|
|
! CHECK: math.ipowi %{{.*}}, %{{.*}} : i32
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_i8_i8
|
|
subroutine pow_i8_i8(x, y, z)
|
|
integer(8) :: x, y, z
|
|
z = x ** y
|
|
! CHECK: math.ipowi %{{.*}}, %{{.*}} : i64
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_c4_i4
|
|
subroutine pow_c4_i4(x, y, z)
|
|
complex :: x, z
|
|
integer :: y
|
|
z = x ** y
|
|
! CHECK: call @_FortranAcpowi
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_c4_i8
|
|
subroutine pow_c4_i8(x, y, z)
|
|
complex :: x, z
|
|
integer(8) :: y
|
|
z = x ** y
|
|
! CHECK: call @_FortranAcpowk
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_c8_i4
|
|
subroutine pow_c8_i4(x, y, z)
|
|
complex(8) :: x, z
|
|
integer :: y
|
|
z = x ** y
|
|
! CHECK: call @_FortranAzpowi
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_c8_i8
|
|
subroutine pow_c8_i8(x, y, z)
|
|
complex(8) :: x, z
|
|
integer(8) :: y
|
|
z = x ** y
|
|
! CHECK: call @_FortranAzpowk
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_c4_c4
|
|
subroutine pow_c4_c4(x, y, z)
|
|
complex :: x, y, z
|
|
z = x ** y
|
|
! FAST: complex.pow %{{.*}}, %{{.*}} : complex<f32>
|
|
! PRECISE: call @cpowf
|
|
end subroutine
|
|
|
|
! CHECK-LABEL: pow_c8_c8
|
|
subroutine pow_c8_c8(x, y, z)
|
|
complex(8) :: x, y, z
|
|
z = x ** y
|
|
! FAST: complex.pow %{{.*}}, %{{.*}} : complex<f64>
|
|
! PRECISE: call @cpow
|
|
end subroutine
|
|
|