blob: c5b5a106dc7b77c7700bcad7917862e17709c499 [file] [edit]
! One combined reduction(foo : a, b, c) clause over mixed-shape allocatables with
! non-default lower bounds (b(6:9), c(3,8:9)) must lower.
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=45 %s -o - | FileCheck %s
subroutine test_udr_combined()
implicit none
integer :: i
integer, allocatable :: a, b(:), c(:,:)
!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) &
!$omp & initializer (omp_priv = 0)
allocate(a, b(6:9), c(3, 8:9))
a = 0
b = 0
c = 0
!$omp parallel do reduction(foo : a, b, c)
do i = 1, 10
a = a + i
b = b + i
c = c + i
end do
end subroutine
! One boxed op per shape is synthesized from the single scalar base op.
! CHECK-DAG: omp.declare_reduction @{{.*}}foo_byref_box_heap_i32 byref_element_type({{.*}}) : !fir.ref<!fir.box<!fir.heap<i32>>>
! CHECK-DAG: omp.declare_reduction @{{.*}}foo_byref_box_heap_Uxi32 byref_element_type({{.*}}) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
! CHECK-DAG: omp.declare_reduction @{{.*}}foo_byref_box_heap_UxUxi32 byref_element_type({{.*}}) : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
! CHECK-DAG: omp.declare_reduction @{{.*}}foo_i32 : i32
! The one combined clause binds all three boxed ops in a single wsloop.
! CHECK-LABEL: func.func @_QPtest_udr_combined
! CHECK: omp.wsloop {{.*}}reduction(byref @{{.*}}foo_byref_box_heap_i32 {{.*}}byref @{{.*}}foo_byref_box_heap_Uxi32 {{.*}}byref @{{.*}}foo_byref_box_heap_UxUxi32 {{.*}}!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>)