! 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) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFscalar_intEy"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0 ! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : i32, !fir.ref 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.ref>, !fir.ref>) ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFscalar_logicalEy"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0 ! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : !fir.logical<4>, !fir.ref> 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) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFscalar_realEy"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0 ! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : f32, !fir.ref 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>) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFscalar_complexEy"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0 ! CHECK: hlfir.assign %[[VAL_4]] to %[[VAL_2]]#0 : !fir.complex<4>, !fir.ref> 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>, index) -> (!fir.boxchar<1>, !fir.ref>) ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFscalar_characterEy"} : (!fir.ref>, index) -> (!fir.boxchar<1>, !fir.ref>) ! 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) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_2:.*]] = arith.constant 42 : i32 ! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_1]]#0 : i32, !fir.ref 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.ref>, !fir.ref>) ! 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> 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) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_2:.*]] = arith.constant 3.140000e+00 : f32 ! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_1]]#0 : f32, !fir.ref 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>) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32 ! CHECK: %[[VAL_3:.*]] = arith.constant -1.000000e+00 : f32 ! CHECK: %[[VAL_4:.*]] = fir.undefined !fir.complex<4> ! CHECK: %[[VAL_5:.*]] = fir.insert_value %[[VAL_4]], %[[VAL_2]], [0 : index] : (!fir.complex<4>, f32) -> !fir.complex<4> ! CHECK: %[[VAL_6:.*]] = fir.insert_value %[[VAL_5]], %[[VAL_3]], [1 : index] : (!fir.complex<4>, f32) -> !fir.complex<4> ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : !fir.complex<4>, !fir.ref> 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>, index) -> (!fir.boxchar<1>, !fir.ref>) ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} {fortran_attrs = #fir.var_attrs, uniq_name = "_QQclX68656C6C6F"} : (!fir.ref>, index) -> (!fir.ref>, !fir.ref>) ! CHECK: hlfir.assign %[[VAL_5]]#0 to %[[VAL_2]]#0 : !fir.ref>, !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.box>, !fir.box>) ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFarrayEy"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) ! CHECK: hlfir.assign %[[VAL_5]]#0 to %[[VAL_2]]#0 : !fir.ref>, !fir.box> 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.shapeshift<1>) -> (!fir.box>>, !fir.ref>>) ! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFarray_lbsEy"} : (!fir.ref>>, !fir.shapeshift<1>) -> (!fir.box>>, !fir.ref>>) ! CHECK: hlfir.assign %[[VAL_9]]#0 to %[[VAL_5]]#0 : !fir.box>>, !fir.box>> 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.shape<1>, index) -> (!fir.box>>, !fir.ref>>) ! CHECK: %[[VAL_11:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFarray_characterEy"} : (!fir.ref>>, !fir.shape<1>, index) -> (!fir.box>>, !fir.ref>>) ! CHECK: hlfir.assign %[[VAL_11]]#0 to %[[VAL_6]]#0 : !fir.box>>, !fir.box>> 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>>> ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref>>> ! CHECK: hlfir.assign %[[VAL_3]] to %[[VAL_4]] : !fir.box>>, !fir.box>> ! ----------------------------------------------------------------------------- ! 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.shape<1>) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFarray_scalarEy"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_5]]#0 ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_4]]#0 : i32, !fir.ref> ! ----------------------------------------------------------------------------- ! 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.ref>>> 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>>> 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>>>