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

Added options: * -f[no-]repack-arrays * -f[no-]stack-repack-arrays * -frepack-arrays-contiguity=whole/innermost
248 lines
12 KiB
Fortran
248 lines
12 KiB
Fortran
! RUN: bbc -emit-hlfir -frepack-arrays -fstack-repack-arrays -frepack-arrays-continuity-whole %s -o - -I nowhere | FileCheck --check-prefixes=ALL,STACK,WHOLE %s
|
|
! RUN: bbc -emit-hlfir -frepack-arrays -fstack-repack-arrays=false -frepack-arrays-continuity-whole %s -o - -I nowhere | FileCheck --check-prefixes=ALL,HEAP,WHOLE %s
|
|
! RUN: bbc -emit-hlfir -frepack-arrays -fstack-repack-arrays -frepack-arrays-continuity-whole=false %s -o - -I nowhere | FileCheck --check-prefixes=ALL,STACK,INNER %s
|
|
! RUN: bbc -emit-hlfir -frepack-arrays -fstack-repack-arrays=false -frepack-arrays-continuity-whole=false %s -o - -I nowhere | FileCheck --check-prefixes=ALL,HEAP,INNER %s
|
|
|
|
! ALL-LABEL: func.func @_QPtest1(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {
|
|
subroutine test1(x)
|
|
real :: x(:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {uniq_name = "_QFtest1Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : !fir.box<!fir.array<?xf32>>
|
|
end subroutine test1
|
|
|
|
! ALL-LABEL: func.func @_QPtest2(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.ref<i32> {fir.bindc_name = "n"},
|
|
! ALL-SAME: %[[VAL_1:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?x?x!fir.char<1,?>>> {fir.bindc_name = "x"}) {
|
|
subroutine test2(n, x)
|
|
integer :: n
|
|
character(n) :: x(:,:)
|
|
! ALL: %[[VAL_8:.*]] = fir.pack_array %[[VAL_1]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! INNER-SAME: innermost
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: typeparams %[[VAL_7:.*]] : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>, i32) -> !fir.box<!fir.array<?x?x!fir.char<1,?>>>
|
|
! ALL: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_8]] typeparams %[[VAL_7]] dummy_scope %{{.*}} {uniq_name = "_QFtest2Ex"} : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>, i32, !fir.dscope) -> (!fir.box<!fir.array<?x?x!fir.char<1,?>>>, !fir.box<!fir.array<?x?x!fir.char<1,?>>>)
|
|
! ALL: fir.unpack_array %[[VAL_8]] to %[[VAL_1]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : !fir.box<!fir.array<?x?x!fir.char<1,?>>>
|
|
end subroutine test2
|
|
|
|
! ALL-LABEL: func.func @_QPtest3(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?x?x!fir.type<_QFtest3Tt>>> {fir.bindc_name = "x"}) {
|
|
subroutine test3(x)
|
|
type t
|
|
end type t
|
|
type(t) :: x(:,:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! INNER-SAME: innermost
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : (!fir.box<!fir.array<?x?x!fir.type<_QFtest3Tt>>>) -> !fir.box<!fir.array<?x?x!fir.type<_QFtest3Tt>>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {uniq_name = "_QFtest3Ex"} : (!fir.box<!fir.array<?x?x!fir.type<_QFtest3Tt>>>, !fir.dscope) -> (!fir.box<!fir.array<?x?x!fir.type<_QFtest3Tt>>>, !fir.box<!fir.array<?x?x!fir.type<_QFtest3Tt>>>)
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : !fir.box<!fir.array<?x?x!fir.type<_QFtest3Tt>>>
|
|
end subroutine test3
|
|
|
|
! ALL-LABEL: func.func @_QPtest4(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {
|
|
subroutine test4(x)
|
|
real, intent(inout) :: x(:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {fortran_attrs = #fir.var_attrs<intent_inout>, uniq_name = "_QFtest4Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : !fir.box<!fir.array<?xf32>>
|
|
end subroutine test4
|
|
|
|
! ALL-LABEL: func.func @_QPtest5(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {
|
|
subroutine test5(x)
|
|
real, intent(in) :: x(:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {fortran_attrs = #fir.var_attrs<intent_in>, uniq_name = "_QFtest5Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-SAME no_copy : !fir.box<!fir.array<?xf32>>
|
|
end subroutine test5
|
|
|
|
! ALL-LABEL: func.func @_QPtest6(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {
|
|
subroutine test6(x)
|
|
real, intent(out) :: x(:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! ALL-SAME no_copy : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {fortran_attrs = #fir.var_attrs<intent_out>, uniq_name = "_QFtest6Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : !fir.box<!fir.array<?xf32>>
|
|
end subroutine test6
|
|
|
|
! ALL-LABEL: func.func @_QPtest7(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.class<!fir.array<?x!fir.type<_QFtest7Tt>>> {fir.bindc_name = "x"}) {
|
|
subroutine test7(x)
|
|
type t
|
|
end type t
|
|
class(t) :: x(:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : (!fir.class<!fir.array<?x!fir.type<_QFtest7Tt>>>) -> !fir.class<!fir.array<?x!fir.type<_QFtest7Tt>>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {uniq_name = "_QFtest7Ex"} : (!fir.class<!fir.array<?x!fir.type<_QFtest7Tt>>>, !fir.dscope) -> (!fir.class<!fir.array<?x!fir.type<_QFtest7Tt>>>, !fir.class<!fir.array<?x!fir.type<_QFtest7Tt>>>)
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : !fir.class<!fir.array<?x!fir.type<_QFtest7Tt>>>
|
|
end subroutine test7
|
|
|
|
! ALL-LABEL: func.func @_QPtest8(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {
|
|
subroutine test8(x)
|
|
real :: x(:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {uniq_name = "_QFtest8Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
|
|
call inner(x(1))
|
|
! ALL: fir.call @_QFtest8Pinner
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : !fir.box<!fir.array<?xf32>>
|
|
contains
|
|
! ALL-LABEL: func.func private @_QFtest8Pinner(
|
|
subroutine inner(y)
|
|
! ALL-NOT: fir.pack_array
|
|
! ALL-NOT: fir.unpack_array
|
|
real :: y
|
|
y = 1.0
|
|
end subroutine inner
|
|
end subroutine test8
|
|
|
|
! ALL-LABEL: func.func @_QPtest9(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) -> f32 {
|
|
real function test9(x)
|
|
real :: x(:)
|
|
! ALL: %[[VAL_6:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>
|
|
! ALL: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]] dummy_scope %{{.*}} {uniq_name = "_QFtest9Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>)
|
|
real :: y(10)
|
|
test9 = x(1)
|
|
! ALL: fir.unpack_array %[[VAL_6]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME : !fir.box<!fir.array<?xf32>>
|
|
! ALL-NEXT: return
|
|
return
|
|
|
|
! ALL-LABEL: func.func @_QPtest9_alt(
|
|
entry test9_alt(y)
|
|
! ALL-NOT: fir.pack_array
|
|
! ALL-NOT: fir.unpack_array
|
|
rest9_ = y(1)
|
|
end function test9
|
|
|
|
! ALL-LABEL: func.func @_QPtest10(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?x?xf32>> {fir.bindc_name = "x", fir.optional}) {
|
|
subroutine test10(x)
|
|
real, optional :: x(:,:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! INNER-SAME: innermost
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<!fir.array<?x?xf32>>
|
|
! ALL: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %{{.*}} {fortran_attrs = #fir.var_attrs<optional>, uniq_name = "_QFtest10Ex"} : (!fir.box<!fir.array<?x?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?x?xf32>>, !fir.box<!fir.array<?x?xf32>>)
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : !fir.box<!fir.array<?x?xf32>>
|
|
end subroutine test10
|
|
|
|
! ALL-LABEL: func.func @_QPtest11(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?x!fir.char<1,10>>> {fir.bindc_name = "x"}) {
|
|
subroutine test11(x)
|
|
character(10) :: x(:)
|
|
! ALL: %[[VAL_3:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! INNER-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : (!fir.box<!fir.array<?x!fir.char<1,10>>>) -> !fir.box<!fir.array<?x!fir.char<1,10>>>
|
|
! ALL: fir.unpack_array %[[VAL_3]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : !fir.box<!fir.array<?x!fir.char<1,10>>>
|
|
end subroutine test11
|
|
|
|
! ALL-LABEL: func.func @_QPtest12(
|
|
! ALL-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "x"}) {
|
|
subroutine test12(x)
|
|
character(*) :: x(:)
|
|
! ALL: %[[VAL_2:.*]] = fir.pack_array %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! WHOLE-SAME: whole
|
|
! INNER-SAME: whole
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.box<!fir.array<?x!fir.char<1,?>>>
|
|
! ALL: fir.unpack_array %[[VAL_2]] to %[[VAL_0]]
|
|
! STACK-SAME: stack
|
|
! HEAP-SAME: heap
|
|
! ALL-NOT: no_copy
|
|
! ALL-SAME: : !fir.box<!fir.array<?x!fir.char<1,?>>>
|
|
end subroutine test12
|