blob: 8782080f60db66c99217b4f58cc16ca5d81b6bfb [file] [edit]
! Test inlining of hlfir.assign for pointer-based array assignment with OpenMP.
! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | fir-opt --inline-hlfir-assign | FileCheck %s --check-prefix=FIRST_INLINE
! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | fir-opt --inline-hlfir-assign --bufferize-hlfir | FileCheck %s --check-prefix=BUFFERIZE
! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | fir-opt --inline-hlfir-assign --bufferize-hlfir --inline-hlfir-assign | FileCheck %s --check-prefix=INLINE_HLFIR
subroutine test()
integer,target,dimension(64):: a, b
integer,pointer:: sum(:)
integer :: i
b = (/(i,i=1,64)/)
!$omp parallel do private(sum)
do i=1, 32
sum => b(i:i+32)
a(i:i+32) = sum
end do
!$omp end parallel do
end subroutine test
!! =============================================================================
!! After 1st InlineHLFIRAssign
!! =============================================================================
! FIRST_INLINE-LABEL: func.func @_QPtest
! FIRST_INLINE: omp.parallel
! FIRST_INLINE: %[[SUM:.*]] = fir.load %{{.*}} : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
! FIRST_INLINE: %[[LHS:.*]] = hlfir.designate %{{.*}} (%{{.*}}:%{{.*}}:%{{.*}}) shape %{{.*}} : (!fir.ref<!fir.array<64xi32>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<?xi32>>
! FIRST_INLINE: %[[LHS_ADDR:.*]] = fir.box_addr %[[LHS]]
! FIRST_INLINE: %[[LHS_BASE:.*]] = fir.convert %[[LHS_ADDR]] : {{.*}} -> i64
! FIRST_INLINE: fir.box_elesize %[[LHS]]
! FIRST_INLINE: fir.box_dims %[[LHS]], %{{.*}}
! FIRST_INLINE: %[[LHS_START:.*]] = arith.addi %[[LHS_BASE]], %{{.*}} : i64
! FIRST_INLINE: %[[LHS_END:.*]] = arith.addi %[[LHS_BASE]], %{{.*}} : i64
! FIRST_INLINE: %[[RHS_ADDR:.*]] = fir.box_addr %[[SUM]]
! FIRST_INLINE: %[[RHS_BASE:.*]] = fir.convert %[[RHS_ADDR]] : {{.*}} -> i64
! FIRST_INLINE: fir.box_elesize %[[SUM]]
! FIRST_INLINE: fir.box_dims %[[SUM]], %{{.*}}
! FIRST_INLINE: %[[RHS_START:.*]] = arith.addi %[[RHS_BASE]], %{{.*}} : i64
! FIRST_INLINE: %[[RHS_END:.*]] = arith.addi %[[RHS_BASE]], %{{.*}} : i64
! FIRST_INLINE: %[[CMP1:.*]] = arith.cmpi ult, %[[LHS_END]], %[[RHS_START]] : i64
! FIRST_INLINE: %[[CMP2:.*]] = arith.cmpi ult, %[[RHS_END]], %[[LHS_START]] : i64
! FIRST_INLINE: %[[DISJOINT:.*]] = arith.ori %[[CMP1]], %[[CMP2]] : i1
! FIRST_INLINE: fir.if %[[DISJOINT]] {
! FIRST_INLINE: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! FIRST_INLINE: hlfir.designate %[[SUM]] (%{{.*}})
! FIRST_INLINE: fir.load
! FIRST_INLINE: hlfir.designate %[[LHS]] (%{{.*}})
! FIRST_INLINE: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>
! FIRST_INLINE: }
! FIRST_INLINE: } else {
! FIRST_INLINE: %[[ALLOC:.*]] = fir.allocmem !fir.array<?xi32>, %{{.*}} {bindc_name = ".tmp", uniq_name = ""}
! FIRST_INLINE: %[[TEMP:.*]]:2 = hlfir.declare %[[ALLOC]](%{{.*}}) {uniq_name = ".tmp"}
! FIRST_INLINE: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! FIRST_INLINE: hlfir.designate %[[SUM]] (%{{.*}})
! FIRST_INLINE: fir.load
! FIRST_INLINE: hlfir.designate %[[TEMP]]#0 (%{{.*}})
! FIRST_INLINE: hlfir.assign %{{.*}} to %{{.*}} temporary_lhs : i32, !fir.ref<i32>
! FIRST_INLINE: }
! FIRST_INLINE: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! FIRST_INLINE: hlfir.designate %[[TEMP]]#0 (%{{.*}})
! FIRST_INLINE: fir.load
! FIRST_INLINE: hlfir.designate %[[LHS]] (%{{.*}})
! FIRST_INLINE: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>
! FIRST_INLINE: }
! FIRST_INLINE: fir.freemem %{{.*}}
! FIRST_INLINE: }
!! =============================================================================
!! After BufferizeHLFIR
!! =============================================================================
! BUFFERIZE-LABEL: func.func @_QPtest
! BUFFERIZE: omp.parallel
! BUFFERIZE: fir.if %{{.*}} {
! BUFFERIZE: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! BUFFERIZE: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>
! BUFFERIZE: }
! BUFFERIZE: } else {
! BUFFERIZE: %[[ALLOC:.*]] = fir.allocmem !fir.array<?xi32>, %{{.*}} {bindc_name = ".tmp", uniq_name = ""}
! BUFFERIZE: %[[TEMP:.*]]:2 = hlfir.declare %[[ALLOC]](%{{.*}}) {uniq_name = ".tmp"}
! BUFFERIZE: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! BUFFERIZE: hlfir.designate %{{.*}} (%{{.*}})
! BUFFERIZE: fir.load
! BUFFERIZE: hlfir.designate %[[TEMP]]#0 (%{{.*}})
! BUFFERIZE: hlfir.assign %{{.*}} to %{{.*}} temporary_lhs : i32, !fir.ref<i32>
! BUFFERIZE: }
! BUFFERIZE: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! BUFFERIZE: hlfir.designate %[[TEMP]]#0 (%{{.*}})
! BUFFERIZE: fir.load
! BUFFERIZE: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>
! BUFFERIZE: }
! BUFFERIZE: fir.freemem %{{.*}}
! BUFFERIZE: }
!! =============================================================================
!! After 2nd InlineHLFIRAssign
!! =============================================================================
! INLINE_HLFIR-LABEL: func.func @_QPtest
! INLINE_HLFIR: omp.parallel
! INLINE_HLFIR: fir.if %{{.*}} {
! INLINE_HLFIR: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! INLINE_HLFIR: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>
! INLINE_HLFIR: }
! INLINE_HLFIR: } else {
! INLINE_HLFIR: %[[ALLOC2:.*]] = fir.allocmem !fir.array<?xi32>, %{{.*}} {bindc_name = ".tmp", uniq_name = ""}
! INLINE_HLFIR: %[[TEMP2:.*]]:2 = hlfir.declare %[[ALLOC2]](%{{.*}}) {uniq_name = ".tmp"}
! INLINE_HLFIR: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! INLINE_HLFIR: hlfir.designate %{{.*}} (%{{.*}})
! INLINE_HLFIR: fir.load
! INLINE_HLFIR: hlfir.designate %[[TEMP2]]#0 (%{{.*}})
! INLINE_HLFIR: hlfir.assign %{{.*}} to %{{.*}} temporary_lhs : i32, !fir.ref<i32>
! INLINE_HLFIR: }
! INLINE_HLFIR: fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} unordered {
! INLINE_HLFIR: hlfir.designate %[[TEMP2]]#0 (%{{.*}})
! INLINE_HLFIR: fir.load
! INLINE_HLFIR: hlfir.designate %{{.*}} (%{{.*}})
! INLINE_HLFIR: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>
! INLINE_HLFIR: }
! INLINE_HLFIR: fir.freemem %{{.*}}
! INLINE_HLFIR: }
! INLINE_HLFIR-NOT: hlfir.as_expr
! INLINE_HLFIR-NOT: hlfir.apply
! INLINE_HLFIR-NOT: hlfir.destroy