llvm-project/flang/test/Lower/array-elemental-calls.f90
Eugene Epshteyn 4c171a202f
[flang][NFC] Converted five tests from old lowering to new lowering (part 4) (#174906)
From this point on, the conversion is done to HLFIR, not to FIR.

Tests converted in Lower: allocatables.f90,
allocate-source-pointers.f90, array-constructor-2.f90,
array-elemental-calls-3.f90, array-elemental-calls.f90
2026-01-08 13:53:58 -05:00

81 lines
2.8 KiB
Fortran

! Test lowering of elemental calls in array expressions.
! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
module scalar_in_elem
contains
elemental integer function elem_by_ref(a,b) result(r)
integer, intent(in) :: a
real, intent(in) :: b
r = a + b
end function
elemental integer function elem_by_valueref(a,b) result(r)
integer, value :: a
real, value :: b
r = a + b
end function
! CHECK-LABEL: func @_QMscalar_in_elemPtest_elem_by_ref(
! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<100xi32>>{{.*}}, %[[arg1:.*]]: !fir.ref<!fir.array<100xi32>>{{.*}}) {
subroutine test_elem_by_ref(i, j)
integer :: i(100), j(100)
! CHECK: %[[i_decl:.*]]:2 = hlfir.declare %[[arg0]]
! CHECK: %[[j_decl:.*]]:2 = hlfir.declare %[[arg1]]
! CHECK: %[[cst:.*]] = arith.constant 4.200000e+01 : f32
! CHECK: hlfir.elemental {{.*}} {
! CHECK: ^bb0(%[[idx:.*]]: index):
! CHECK: %[[j_elem:.*]] = hlfir.designate %[[j_decl]]#0 (%[[idx]])
! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[cst]]
! CHECK: fir.call @_QMscalar_in_elemPelem_by_ref(%[[j_elem]], %[[assoc]]#0)
! CHECK: }
i = elem_by_ref(j, 42.)
end
! CHECK-LABEL: func @_QMscalar_in_elemPtest_elem_by_valueref(
! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<100xi32>>{{.*}}, %[[arg1:.*]]: !fir.ref<!fir.array<100xi32>>{{.*}}) {
subroutine test_elem_by_valueref(i, j)
integer :: i(100), j(100)
! CHECK: %[[i_decl:.*]]:2 = hlfir.declare %[[arg0]]
! CHECK: %[[j_decl:.*]]:2 = hlfir.declare %[[arg1]]
! CHECK: %[[cst:.*]] = arith.constant 4.200000e+01 : f32
! CHECK: hlfir.elemental {{.*}} {
! CHECK: ^bb0(%[[idx:.*]]: index):
! CHECK: %[[j_elem_addr:.*]] = hlfir.designate %[[j_decl]]#0 (%[[idx]])
! CHECK: %[[j_val:.*]] = fir.load %[[j_elem_addr]]
! CHECK: fir.call @_QMscalar_in_elemPelem_by_valueref(%[[j_val]], %[[cst]])
! CHECK: }
i = elem_by_valueref(j, 42.)
end
end module
! Test that impure elemental functions cause ordered loops to be emitted
subroutine test_loop_order(i, j)
integer :: i(:), j(:)
interface
elemental integer function pure_func(j)
integer, intent(in) :: j
end function
elemental impure integer function impure_func(j)
integer, intent(in) :: j
end function
end interface
i = 42 + pure_func(j)
i = 42 + impure_func(j)
end subroutine
! CHECK-LABEL: func @_QPtest_loop_order(
! CHECK-SAME: %[[i:.*]]: !fir.box<!fir.array<?xi32>>{{.*}}, %[[j:.*]]: !fir.box<!fir.array<?xi32>>{{.*}}) {
! CHECK: %[[i_decl:.*]]:2 = hlfir.declare %[[i]]
! CHECK: %[[j_decl:.*]]:2 = hlfir.declare %[[j]]
! CHECK: hlfir.elemental {{.*}} unordered
! CHECK: fir.call @_QPpure_func
! CHECK: hlfir.assign
! CHECK: hlfir.elemental {{.*}} : (!fir.shape<1>) -> !hlfir.expr<?xi32> {
! CHECK-NOT: unordered
! CHECK: fir.call @_QPimpure_func
! CHECK: hlfir.assign
! CHECK: }