blob: 8d9b192a679e08f43875c91b4e398db050fedfae [file] [edit]
! Test lowering of intrinsic assignments to HLFIR
! RUN: bbc -emit-hlfir -o - %s 2>&1 | FileCheck %s
! -----------------------------------------------------------------------------
! Test assignments with scalar variable LHS and RHS
! -----------------------------------------------------------------------------
subroutine scalar_int(x, y)
integer :: x, y
x = y
end subroutine
! CHECK-LABEL: func.func @_QPscalar_int(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_intEx") : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_intEy") : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0
! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : i32, !fir.ref<i32>
subroutine scalar_logical(x, y)
logical :: x, y
x = y
end subroutine
! CHECK-LABEL: func.func @_QPscalar_logical(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_logicalEx") : (!fir.ref<!fir.logical<4>>, !fir.dscope) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_logicalEy") : (!fir.ref<!fir.logical<4>>, !fir.dscope) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0
! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
subroutine scalar_real(x, y)
real :: x, y
x = y
end subroutine
! CHECK-LABEL: func.func @_QPscalar_real(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_realEx") : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_realEy") : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0
! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : f32, !fir.ref<f32>
subroutine scalar_complex(x, y)
complex :: x, y
x = y
end subroutine
! CHECK-LABEL: func.func @_QPscalar_complex(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_complexEx") : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_complexEy") : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0
! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : complex<f32>, !fir.ref<complex<f32>>
subroutine scalar_character(x, y)
character(*) :: x, y
x = y
end subroutine
! CHECK-LABEL: func.func @_QPscalar_character(
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_characterEx") : (!fir.ref<!fir.char<1,?>>, index, !fir.dscope) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_characterEy") : (!fir.ref<!fir.char<1,?>>, index, !fir.dscope) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
! CHECK: hlfir.assign %[[VAL_5]]#0 to %[[VAL_3]]#0 : !fir.boxchar<1>, !fir.boxchar<1>
! -----------------------------------------------------------------------------
! Test assignments with scalar variable LHS and expression RHS
! -----------------------------------------------------------------------------
subroutine scalar_int_2(x)
integer :: x
x = 42
end subroutine
! CHECK-LABEL: func.func @_QPscalar_int_2(
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_int_2Ex") : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
! CHECK: %[[VAL_2:.*]] = arith.constant 42 : i32
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_1]]#0 : i32, !fir.ref<i32>
subroutine scalar_logical_2(x)
logical :: x
x = .true.
end subroutine
! CHECK-LABEL: func.func @_QPscalar_logical_2(
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_logical_2Ex") : (!fir.ref<!fir.logical<4>>, !fir.dscope) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
! CHECK: %[[VAL_2:.*]] = arith.constant true
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (i1) -> !fir.logical<4>
! CHECK: hlfir.assign %[[VAL_3]] to %[[VAL_1]]#0 : !fir.logical<4>, !fir.ref<!fir.logical<4>>
subroutine scalar_real_2(x)
real :: x
x = 3.14
end subroutine
! CHECK-LABEL: func.func @_QPscalar_real_2(
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_real_2Ex") : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
! CHECK: %[[VAL_2:.*]] = arith.constant 3.140000e+00 : f32
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_1]]#0 : f32, !fir.ref<f32>
subroutine scalar_complex_2(x)
complex :: x
x = (1., -1.)
end subroutine
! CHECK-LABEL: func.func @_QPscalar_complex_2(
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_complex_2Ex") : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
! CHECK: %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32
! CHECK: %[[VAL_3:.*]] = arith.constant -1.000000e+00 : f32
! CHECK: %[[VAL_4:.*]] = fir.undefined complex<f32>
! CHECK: %[[VAL_5:.*]] = fir.insert_value %[[VAL_4]], %[[VAL_2]], [0 : index] : (complex<f32>, f32) -> complex<f32>
! CHECK: %[[VAL_6:.*]] = fir.insert_value %[[VAL_5]], %[[VAL_3]], [1 : index] : (complex<f32>, f32) -> complex<f32>
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : complex<f32>, !fir.ref<complex<f32>>
subroutine scalar_character_2(x)
character(*) :: x
x = "hello"
end subroutine
! CHECK-LABEL: func.func @_QPscalar_character_2(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFscalar_character_2Ex") : (!fir.ref<!fir.char<1,?>>, index, !fir.dscope) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QQclX68656C6C6F") fortran_attrs<parameter> : (!fir.ref<!fir.char<1,5>>, index) -> (!fir.ref<!fir.char<1,5>>, !fir.ref<!fir.char<1,5>>)
! CHECK: hlfir.assign %[[VAL_5]]#0 to %[[VAL_2]]#0 : !fir.ref<!fir.char<1,5>>, !fir.boxchar<1>
! -----------------------------------------------------------------------------
! Test assignments with array variable LHS and RHS
! -----------------------------------------------------------------------------
subroutine array(x, y)
integer :: x(:), y(100)
x = y
end subroutine
! CHECK-LABEL: func.func @_QParray(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarrayEx") : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarrayEy") : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<100xi32>>)
! CHECK: hlfir.assign %[[VAL_5]]#0 to %[[VAL_2]]#0 : !fir.ref<!fir.array<100xi32>>, !fir.box<!fir.array<?xi32>>
subroutine array_lbs(x, y)
logical :: x(2:21), y(3:22)
x = y
end subroutine
! CHECK-LABEL: func.func @_QParray_lbs(
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarray_lbsEx") : (!fir.ref<!fir.array<20x!fir.logical<4>>>, !fir.shapeshift<1>, !fir.dscope) -> (!fir.box<!fir.array<20x!fir.logical<4>>>, !fir.ref<!fir.array<20x!fir.logical<4>>>)
! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarray_lbsEy") : (!fir.ref<!fir.array<20x!fir.logical<4>>>, !fir.shapeshift<1>, !fir.dscope) -> (!fir.box<!fir.array<20x!fir.logical<4>>>, !fir.ref<!fir.array<20x!fir.logical<4>>>)
! CHECK: hlfir.assign %[[VAL_9]]#0 to %[[VAL_5]]#0 : !fir.box<!fir.array<20x!fir.logical<4>>>, !fir.box<!fir.array<20x!fir.logical<4>>>
subroutine array_character(x, y)
character(*) :: x(10), y(10)
x = y
end subroutine
! CHECK-LABEL: func.func @_QParray_character(
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarray_characterEx") : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shape<1>, index, !fir.dscope) -> (!fir.box<!fir.array<10x!fir.char<1,?>>>, !fir.ref<!fir.array<10x!fir.char<1,?>>>)
! CHECK: %[[VAL_11:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarray_characterEy") : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shape<1>, index, !fir.dscope) -> (!fir.box<!fir.array<10x!fir.char<1,?>>>, !fir.ref<!fir.array<10x!fir.char<1,?>>>)
! CHECK: hlfir.assign %[[VAL_11]]#0 to %[[VAL_6]]#0 : !fir.box<!fir.array<10x!fir.char<1,?>>>, !fir.box<!fir.array<10x!fir.char<1,?>>>
subroutine array_pointer(x, y)
real, pointer :: x(:), y(:)
x = y
end subroutine
! CHECK-LABEL: func.func @_QParray_pointer(
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %{{.*}}Ex
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %{{.*}}Ey
! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
! CHECK: hlfir.assign %[[VAL_3]] to %[[VAL_4]] : !fir.box<!fir.ptr<!fir.array<?xf32>>>, !fir.box<!fir.ptr<!fir.array<?xf32>>>
! -----------------------------------------------------------------------------
! Test assignments with array LHS and scalar RHS
! -----------------------------------------------------------------------------
subroutine array_scalar(x, y)
integer :: x(100), y
x = y
end subroutine
! CHECK-LABEL: func.func @_QParray_scalar(
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarray_scalarEx") : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<100xi32>>)
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} uniq_name("_QFarray_scalarEy") : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_5]]#0
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_4]]#0 : i32, !fir.ref<!fir.array<100xi32>>
! -----------------------------------------------------------------------------
! Test assignments with whole allocatable LHS
! -----------------------------------------------------------------------------
subroutine test_whole_allocatable_assignment(x, y)
integer, allocatable :: x(:)
integer :: y(:)
x = y
end subroutine
! CHECK-LABEL: func.func @_QPtest_whole_allocatable_assignment(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}}Ex"
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}}Ey"
! CHECK: hlfir.assign %[[VAL_3]]#0 to %[[VAL_2]]#0 realloc : !fir.box<!fir.array<?xi32>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
subroutine test_whole_allocatable_deferred_char(x, y)
character(:), allocatable :: x
character(*) :: y
x = y
end subroutine
! CHECK-LABEL: func.func @_QPtest_whole_allocatable_deferred_char(
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}}Ex"
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare {{.*}}Ey"
! CHECK: hlfir.assign %[[VAL_4]]#0 to %[[VAL_2]]#0 realloc : !fir.boxchar<1>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
subroutine test_whole_allocatable_assumed_char(x, y)
character(*), allocatable :: x
character(*) :: y
x = y
end subroutine
! CHECK-LABEL: func.func @_QPtest_whole_allocatable_assumed_char(
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare {{.*}}Ex"
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare {{.*}}Ey"
! CHECK: hlfir.assign %[[VAL_6]]#0 to %[[VAL_4]]#0 realloc keep_lhs_len : !fir.boxchar<1>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>