! RUN: %flang_fc1 -emit-hlfir %s -o - -mllvm -math-runtime=fast | FileCheck %s ! RUN: %flang_fc1 -emit-hlfir %s -o - -mllvm -math-runtime=relaxed | FileCheck %s ! RUN: %flang_fc1 -emit-hlfir %s -o - -mllvm -math-runtime=precise | FileCheck %s ! CHECK-LABEL: func.func @_QPtest_real4 ! CHECK-SAME: (%[[argx:.*]]: !fir.ref{{.*}}, %[[argn:.*]]: !fir.ref{{.*}}) -> f32 function test_real4(x, n) real :: x, test_real4 integer :: n ! CHECK: %[[n_decl:.*]]:2 = hlfir.declare %[[argn]] {{.*}} ! CHECK: %[[res_decl:.*]]:2 = hlfir.declare %{{.*}} {{.*}} ! CHECK: %[[x_decl:.*]]:2 = hlfir.declare %[[argx]] {{.*}} ! CHECK-DAG: %[[n:.*]] = fir.load %[[n_decl]]#0 : !fir.ref ! CHECK-DAG: %[[x:.*]] = fir.load %[[x_decl]]#0 : !fir.ref ! CHECK: %[[jn:.*]] = fir.call @jnf(%[[n]], %[[x]]) {{.*}} : (i32, f32) -> f32 ! CHECK: hlfir.assign %[[jn]] to %[[res_decl]]#0 : f32, !fir.ref test_real4 = bessel_jn(n, x) end function ! CHECK-LABEL: func.func @_QPtest_real8 ! CHECK-SAME: (%[[argx:.*]]: !fir.ref{{.*}}, %[[argn:.*]]: !fir.ref{{.*}}) -> f64 function test_real8(x, n) real(8) :: x, test_real8 integer :: n ! CHECK: %[[n_decl:.*]]:2 = hlfir.declare %[[argn]] {{.*}} ! CHECK: %[[res_decl:.*]]:2 = hlfir.declare %{{.*}} {{.*}} ! CHECK: %[[x_decl:.*]]:2 = hlfir.declare %[[argx]] {{.*}} ! CHECK-DAG: %[[n:.*]] = fir.load %[[n_decl]]#0 : !fir.ref ! CHECK-DAG: %[[x:.*]] = fir.load %[[x_decl]]#0 : !fir.ref ! CHECK: %[[jn:.*]] = fir.call @jn(%[[n]], %[[x]]) {{.*}} : (i32, f64) -> f64 ! CHECK: hlfir.assign %[[jn]] to %[[res_decl]]#0 : f64, !fir.ref test_real8 = bessel_jn(n, x) end function ! CHECK-LABEL: func.func @_QPtest_transformational_real4 ! CHECK-SAME: %[[argx:.*]]: !fir.ref{{.*}}, %[[argn1:.*]]: !fir.ref{{.*}}, %[[argn2:.*]]: !fir.ref{{.*}}, %[[argr:.*]]: !fir.box>{{.*}} subroutine test_transformational_real4(x, n1, n2, r) real(4) :: x integer :: n1, n2 real(4) :: r(:) ! CHECK: %[[n1_decl:.*]]:2 = hlfir.declare %[[argn1]] {{.*}} ! CHECK: %[[n2_decl:.*]]:2 = hlfir.declare %[[argn2]] {{.*}} ! CHECK: %[[r_decl:.*]]:2 = hlfir.declare %[[argr]] {{.*}} ! CHECK: %[[x_decl:.*]]:2 = hlfir.declare %[[argx]] {{.*}} ! CHECK-DAG: %[[n1:.*]] = fir.load %[[n1_decl]]#0 : !fir.ref ! CHECK-DAG: %[[n2:.*]] = fir.load %[[n2_decl]]#0 : !fir.ref ! CHECK-DAG: %[[x:.*]] = fir.load %[[x_decl]]#0 : !fir.ref ! CHECK: fir.if %{{.*}} { ! CHECK: fir.call @_FortranABesselJnX0_4(%{{.*}}, %[[n1]], %[[n2]], {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, !fir.ref, i32) -> () ! CHECK: } else { ! CHECK: fir.if %{{.*}} { ! CHECK: fir.call @_FortranABesselJn_4(%{{.*}}, %[[n1]], %[[n2]], %[[x]], %{{.*}}, %{{.*}}, {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, f32, f32, f32, !fir.ref, i32) -> () ! CHECK: } else { ! CHECK: fir.if %{{.*}} { ! CHECK: fir.call @_FortranABesselJn_4(%{{.*}}, %[[n1]], %[[n2]], %[[x]], %{{.*}}, %{{.*}}, {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, f32, f32, f32, !fir.ref, i32) -> () ! CHECK: } else { ! CHECK: fir.call @_FortranABesselJn_4(%{{.*}}, %[[n1]], %[[n2]], %[[x]], %{{.*}}, %{{.*}}, {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, f32, f32, f32, !fir.ref, i32) -> () ! CHECK: } ! CHECK: } ! CHECK: } r = bessel_jn(n1, n2, x) ! CHECK: hlfir.assign %{{.*}} to %[[r_decl]]#0 : !hlfir.expr, !fir.box> end subroutine test_transformational_real4 ! CHECK-LABEL: func.func @_QPtest_transformational_real8 ! CHECK-SAME: %[[argx:.*]]: !fir.ref{{.*}}, %[[argn1:.*]]: !fir.ref{{.*}}, %[[argn2:.*]]: !fir.ref{{.*}}, %[[argr:.*]]: !fir.box>{{.*}} subroutine test_transformational_real8(x, n1, n2, r) real(8) :: x integer :: n1, n2 real(8) :: r(:) ! CHECK: %[[n1_decl:.*]]:2 = hlfir.declare %[[argn1]] {{.*}} ! CHECK: %[[n2_decl:.*]]:2 = hlfir.declare %[[argn2]] {{.*}} ! CHECK: %[[r_decl:.*]]:2 = hlfir.declare %[[argr]] {{.*}} ! CHECK: %[[x_decl:.*]]:2 = hlfir.declare %[[argx]] {{.*}} ! CHECK-DAG: %[[n1:.*]] = fir.load %[[n1_decl]]#0 : !fir.ref ! CHECK-DAG: %[[n2:.*]] = fir.load %[[n2_decl]]#0 : !fir.ref ! CHECK-DAG: %[[x:.*]] = fir.load %[[x_decl]]#0 : !fir.ref ! CHECK: fir.if %{{.*}} { ! CHECK: fir.call @_FortranABesselJnX0_8(%{{.*}}, %[[n1]], %[[n2]], {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, !fir.ref, i32) -> () ! CHECK: } else { ! CHECK: fir.if %{{.*}} { ! CHECK: fir.call @_FortranABesselJn_8(%{{.*}}, %[[n1]], %[[n2]], %[[x]], %{{.*}}, %{{.*}}, {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, f64, f64, f64, !fir.ref, i32) -> () ! CHECK: } else { ! CHECK: fir.if %{{.*}} { ! CHECK: fir.call @_FortranABesselJn_8(%{{.*}}, %[[n1]], %[[n2]], %[[x]], %{{.*}}, %{{.*}}, {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, f64, f64, f64, !fir.ref, i32) -> () ! CHECK: } else { ! CHECK: fir.call @_FortranABesselJn_8(%{{.*}}, %[[n1]], %[[n2]], %[[x]], %{{.*}}, %{{.*}}, {{.*}}, {{.*}}) {{.*}} : (!fir.ref>, i32, i32, f64, f64, f64, !fir.ref, i32) -> () ! CHECK: } ! CHECK: } ! CHECK: } r = bessel_jn(n1, n2, x) ! CHECK: hlfir.assign %{{.*}} to %[[r_decl]]#0 : !hlfir.expr, !fir.box> end subroutine test_transformational_real8