223 lines
11 KiB
Fortran
223 lines
11 KiB
Fortran
! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
|
|
! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
|
|
|
|
! Test LOC intrinsic
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_scalar() {
|
|
subroutine loc_scalar()
|
|
integer(8) :: p
|
|
integer :: x
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_4:.*]] = fir.embox %[[VAL_3]]#1 : (!fir.ref<i32>) -> !fir.box<i32>
|
|
! CHECK: %[[VAL_5:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box<i32>) -> !fir.ref<i32>
|
|
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (!fir.ref<i32>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_char() {
|
|
subroutine loc_char()
|
|
integer(8) :: p
|
|
character(5) :: x = "abcde"
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] typeparams %[[VAL_3:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_5:.*]] = fir.embox %[[VAL_4]]#1 : (!fir.ref<!fir.char<1,5>>) -> !fir.box<!fir.char<1,5>>
|
|
! CHECK: %[[VAL_6:.*]] = fir.box_addr %[[VAL_5]] : (!fir.box<!fir.char<1,5>>) -> !fir.ref<!fir.char<1,5>>
|
|
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.ref<!fir.char<1,5>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_substring() {
|
|
subroutine loc_substring()
|
|
integer(8) :: p
|
|
character(5) :: x = "abcde"
|
|
p = loc(x(2:))
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] typeparams %[[VAL_3:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : index
|
|
! CHECK: %[[VAL_6:.*]] = arith.constant 5 : index
|
|
! CHECK: %[[VAL_7:.*]] = arith.constant 4 : index
|
|
! CHECK: %[[VAL_8:.*]] = hlfir.designate %[[VAL_4]]#0 substr %[[VAL_5]], %[[VAL_6]] typeparams %[[VAL_7]] : (!fir.ref<!fir.char<1,5>>, index, index, index) -> !fir.ref<!fir.char<1,4>>
|
|
! CHECK: %[[VAL_9:.*]] = fir.embox %[[VAL_8]] : (!fir.ref<!fir.char<1,4>>) -> !fir.box<!fir.char<1,4>>
|
|
! CHECK: %[[VAL_10:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box<!fir.char<1,4>>) -> !fir.ref<!fir.char<1,4>>
|
|
! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,4>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_11]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_array() {
|
|
subroutine loc_array
|
|
integer(8) :: p
|
|
integer :: x(10)
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3:[a-z0-9]*]](%[[VAL_4:[a-z0-9]*]]) {{.*}}Ex
|
|
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_5]]#1(%{{.*}}) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<10xi32>>
|
|
! CHECK: %[[VAL_8:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>
|
|
! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (!fir.ref<!fir.array<10xi32>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_9]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_chararray() {
|
|
subroutine loc_chararray()
|
|
integer(8) :: p
|
|
character(5) :: x(2)
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_4:[a-z0-9]*]](%[[VAL_5:[a-z0-9]*]]) typeparams %[[VAL_2:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_6]]#1(%{{.*}}) : (!fir.ref<!fir.array<2x!fir.char<1,5>>>, !fir.shape<1>) -> !fir.box<!fir.array<2x!fir.char<1,5>>>
|
|
! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box<!fir.array<2x!fir.char<1,5>>>) -> !fir.ref<!fir.array<2x!fir.char<1,5>>>
|
|
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.ref<!fir.array<2x!fir.char<1,5>>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_arrayelement() {
|
|
subroutine loc_arrayelement()
|
|
integer(8) :: p
|
|
integer :: x(10)
|
|
p = loc(x(7))
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3:[a-z0-9]*]](%[[VAL_4:[a-z0-9]*]]) {{.*}}Ex
|
|
! CHECK: %[[VAL_6:.*]] = arith.constant 7 : index
|
|
! CHECK: %[[VAL_7:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_6]]) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
|
|
! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_7]] : (!fir.ref<i32>) -> !fir.box<i32>
|
|
! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box<i32>) -> !fir.ref<i32>
|
|
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.ref<i32>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_arraysection(
|
|
! CHECK-SAME: %[[arg:.*]]: !fir.ref<i32> {{.*}}) {
|
|
subroutine loc_arraysection(i)
|
|
integer(8) :: p
|
|
integer :: i
|
|
real :: x(11)
|
|
p = loc(x(i:))
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ei
|
|
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_5:[a-z0-9]*]](%[[VAL_6:[a-z0-9]*]]) {{.*}}Ex
|
|
! CHECK: %[[VAL_19:.*]] = hlfir.designate %[[VAL_7]]#0 (%{{.*}}:%{{.*}}:%{{.*}}) shape %{{.*}} : (!fir.ref<!fir.array<11xf32>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<?xf32>>
|
|
! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
|
|
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.array<?xf32>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_21]] to %[[VAL_3]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_non_save_pointer_scalar() {
|
|
subroutine loc_non_save_pointer_scalar()
|
|
integer(8) :: p
|
|
real, pointer :: x
|
|
real, target :: t
|
|
x => t
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Et
|
|
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_4:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_3]]#1 : (!fir.ref<f32>) -> !fir.box<!fir.ptr<f32>>
|
|
! CHECK: fir.store %[[VAL_8]] to %[[VAL_7]]#1 : !fir.ref<!fir.box<!fir.ptr<f32>>>
|
|
! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref<!fir.box<!fir.ptr<f32>>>
|
|
! CHECK: %[[VAL_10:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>
|
|
! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.ptr<f32>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_11]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_save_pointer_scalar() {
|
|
subroutine loc_save_pointer_scalar()
|
|
integer :: p
|
|
real, pointer, save :: x
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#1 : !fir.ref<!fir.box<!fir.ptr<f32>>>
|
|
! CHECK: %[[VAL_5:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>
|
|
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (!fir.ptr<f32>) -> i64
|
|
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i64) -> i32
|
|
! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_1]]#0 : i32, !fir.ref<i32>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_derived_type() {
|
|
subroutine loc_derived_type
|
|
integer(8) :: p
|
|
type dt
|
|
integer :: i
|
|
end type
|
|
type(dt) :: xdt
|
|
p = loc(xdt)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Exdt
|
|
! CHECK: %[[VAL_4:.*]] = fir.embox %[[VAL_3]]#1 : (!fir.ref<!fir.type<_QFloc_derived_typeTdt{i:i32}>>) -> !fir.box<!fir.type<_QFloc_derived_typeTdt{i:i32}>>
|
|
! CHECK: %[[VAL_5:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box<!fir.type<_QFloc_derived_typeTdt{i:i32}>>) -> !fir.ref<!fir.type<_QFloc_derived_typeTdt{i:i32}>>
|
|
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (!fir.ref<!fir.type<_QFloc_derived_typeTdt{i:i32}>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_pointer_array() {
|
|
subroutine loc_pointer_array
|
|
integer(8) :: p
|
|
integer, pointer :: x(:)
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
|
|
! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.ptr<!fir.array<?xi32>>
|
|
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.ptr<!fir.array<?xi32>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPloc_allocatable_array() {
|
|
subroutine loc_allocatable_array
|
|
integer(8) :: p
|
|
integer, allocatable :: x(:)
|
|
p = loc(x)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
|
|
! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
|
|
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.heap<!fir.array<?xi32>>) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPtest_external() {
|
|
subroutine test_external()
|
|
integer(8) :: p
|
|
integer, external :: f
|
|
p = loc(x=f)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPf) : () -> i32
|
|
! CHECK: %[[VAL_3:.*]] = fir.emboxproc %[[VAL_2]] : (() -> i32) -> !fir.boxproc<() -> ()>
|
|
! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.boxproc<() -> ()>) -> (() -> ())
|
|
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (() -> ()) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPtest_proc() {
|
|
subroutine test_proc()
|
|
integer(8) :: p
|
|
procedure() :: g
|
|
p = loc(x=g)
|
|
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPg) : () -> ()
|
|
! CHECK: %[[VAL_3:.*]] = fir.emboxproc %[[VAL_2]] : (() -> ()) -> !fir.boxproc<() -> ()>
|
|
! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.boxproc<() -> ()>) -> (() -> ())
|
|
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (() -> ()) -> i64
|
|
! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_1]]#0 : i64, !fir.ref<i64>
|
|
end
|
|
|
|
! CHECK-LABEL: func.func @_QPtest_assumed_shape_optional(
|
|
subroutine test_assumed_shape_optional(x)
|
|
integer(8) :: p
|
|
real, optional :: x(:)
|
|
p = loc(x=x)
|
|
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1:[a-z0-9]*]] {{.*}}Ep
|
|
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ex
|
|
! CHECK: %[[VAL_4:.*]] = fir.is_present %[[VAL_3]]#1 : (!fir.box<!fir.array<?xf32>>) -> i1
|
|
! CHECK: %[[VAL_5:.*]] = fir.if %[[VAL_4]] -> (i64) {
|
|
! CHECK: %[[VAL_6:.*]] = fir.box_addr %[[VAL_3]]#1 : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
|
|
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.ref<!fir.array<?xf32>>) -> i64
|
|
! CHECK: fir.result %[[VAL_7]] : i64
|
|
! CHECK: } else {
|
|
! CHECK: %[[VAL_8:.*]] = arith.constant 0 : i64
|
|
! CHECK: fir.result %[[VAL_8]] : i64
|
|
! CHECK: }
|
|
! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_2]]#0 : i64, !fir.ref<i64>
|
|
end subroutine
|