brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.2 KiB · 5641a37 Raw
342 lines · plain
1! Test lowering of structure constructors2! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s3 4module m_struct_ctor5  implicit none6  type t_simple7    real :: x8  end type9  type t_char_scalar10    real :: x11    character(3) :: c12  end type13  type t_array14    real :: x15    integer :: i(5)16  end type17  type t_char_array18    real :: x19    character(3) :: c(5)20  end type21  type t_ptr22    real :: x23    integer, pointer :: p(:,:)24  end type25  type t_nested26    real :: x27    type(t_array) :: dt28  end type29contains30  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_simple(31  ! CHECK-SAME: %[[x:.*]]: !fir.ref<f32>{{.*}})32  subroutine test_simple(x)33    real :: x34    ! CHECK: %[[tmp:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_simple{x:f32}>35    ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[tmp]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_simple{x:f32}>>) -> !fir.ref<f32>36    ! CHECK: %[[val:.*]] = fir.load %[[x]] : !fir.ref<f32>37    ! CHECK: fir.store %[[val]] to %[[xcoor]] : !fir.ref<f32>38    call print_simple(t_simple(x=x))39  end subroutine40 41  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_char_scalar(42  ! CHECK-SAME: %[[x:.*]]: !fir.ref<f32>{{.*}})43  subroutine test_char_scalar(x)44    ! CHECK: %[[tmp:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>45    ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[tmp]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>>) -> !fir.ref<f32>46    ! CHECK: %[[val:.*]] = fir.load %[[x]] : !fir.ref<f32>47    ! CHECK: fir.store %[[val]] to %[[xcoor]] : !fir.ref<f32>48 49    ! CHECK: %[[ccoor:.*]] = fir.coordinate_of %[[tmp]], c : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_scalar{x:f32,c:!fir.char<1,3>}>>) -> !fir.ref<!fir.char<1,3>>50    ! CHECK: %[[cst:.*]] = fir.address_of(@_QQ{{.*}}) : !fir.ref<!fir.char<1,3>>51    ! CHECK-DAG: %[[ccast:.*]] = fir.convert %[[ccoor]] : (!fir.ref<!fir.char<1,3>>) -> !llvm.ptr52    ! CHECK-DAG: %[[cstcast:.*]] = fir.convert %[[cst]] : (!fir.ref<!fir.char<1,3>>) -> !llvm.ptr53    ! CHECK: "llvm.intr.memmove"(%[[ccast]], %[[cstcast]], %{{.*}}) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()54    real :: x55    call print_char_scalar(t_char_scalar(x=x, c="abc"))56  end subroutine57 58  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_simple_array(59  ! CHECK-SAME: %[[x:.*]]: !fir.ref<f32>{{.*}}, %[[j:.*]]: !fir.ref<!fir.array<5xi32>>{{.*}})60  subroutine test_simple_array(x, j)61    real :: x62    integer :: j(5)63    call print_simple_array(t_array(x=x, i=2*j))64    ! CHECK: %[[tmp:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>65    ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[tmp]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>) -> !fir.ref<f32>66    ! CHECK: %[[val:.*]] = fir.load %[[x]] : !fir.ref<f32>67    ! CHECK: fir.store %[[val]] to %[[xcoor]] : !fir.ref<f32>68 69    ! CHECK: %[[icoor:.*]] = fir.coordinate_of %[[tmp]], i : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>) -> !fir.ref<!fir.array<5xi32>>70    ! CHECK: %[[iload:.*]] = fir.array_load %[[icoor]](%{{.*}}) : (!fir.ref<!fir.array<5xi32>>, !fir.shape<1>) -> !fir.array<5xi32>71    ! CHECK: %[[jload:.*]] = fir.array_load %[[j]](%{{.*}}) : (!fir.ref<!fir.array<5xi32>>, !fir.shape<1>) -> !fir.array<5xi32>72    ! CHECK: %[[loop:.*]] = fir.do_loop %[[idx:.*]] = %c0{{.*}} to %{{.*}} step %c1{{.*}} iter_args(%[[res:.*]] = %[[iload]]) -> (!fir.array<5xi32>) {73    ! CHECK:   %[[jval:.*]] = fir.array_fetch %[[jload]], %[[idx]] : (!fir.array<5xi32>, index) -> i3274    ! CHECK:   %[[ival:.*]] = arith.muli %c2{{.*}}, %[[jval]] : i3275    ! CHECK:   %[[iupdate:.*]] = fir.array_update %[[res]], %[[ival]], %[[idx]] : (!fir.array<5xi32>, i32, index) -> !fir.array<5xi32>76    ! CHECK:   fir.result %[[iupdate]] : !fir.array<5xi32>77    ! CHECK: fir.array_merge_store %[[iload]], %[[loop]] to %[[icoor]] : !fir.array<5xi32>, !fir.array<5xi32>, !fir.ref<!fir.array<5xi32>>78 79  end subroutine80 81! CHECK-LABEL: func @_QMm_struct_ctorPtest_char_array(82! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<f32>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) {83  subroutine test_char_array(x, c1)84  ! CHECK: %[[VAL_3:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>85  ! CHECK: %[[VAL_4:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)86  ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<5x!fir.char<1,3>>>87  ! CHECK: %[[VAL_6:.*]] = arith.constant 5 : index88  ! CHECK: %[[VAL_8:.*]] = fir.coordinate_of %[[VAL_3]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>>) -> !fir.ref<f32>89  ! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_0]] : !fir.ref<f32>90  ! CHECK: fir.store %[[VAL_9]] to %[[VAL_8]] : !fir.ref<f32>91  ! CHECK: %[[VAL_11:.*]] = fir.coordinate_of %[[VAL_3]], c : (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>>) -> !fir.ref<!fir.array<5x!fir.char<1,3>>>92  ! CHECK: %[[VAL_12:.*]] = arith.constant 5 : index93  ! CHECK: %[[VAL_13:.*]] = fir.shape %[[VAL_12]] : (index) -> !fir.shape<1>94  ! CHECK: %[[VAL_14:.*]] = fir.array_load %[[VAL_11]](%[[VAL_13]]) : (!fir.ref<!fir.array<5x!fir.char<1,3>>>, !fir.shape<1>) -> !fir.array<5x!fir.char<1,3>>95  ! CHECK: %[[VAL_15:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>96  ! CHECK: %[[VAL_16:.*]] = fir.array_load %[[VAL_5]](%[[VAL_15]]) : (!fir.ref<!fir.array<5x!fir.char<1,3>>>, !fir.shape<1>) -> !fir.array<5x!fir.char<1,3>>97  ! CHECK: %[[char_temp:.*]] = fir.alloca !fir.char<1,3> {bindc_name = ".chrtmp"}98  ! CHECK: %[[VAL_17:.*]] = arith.constant 1 : index99  ! CHECK: %[[VAL_18:.*]] = arith.constant 0 : index100  ! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_12]], %[[VAL_17]] : index101  ! CHECK: %[[VAL_20:.*]] = fir.do_loop %[[VAL_21:.*]] = %[[VAL_18]] to %[[VAL_19]] step %[[VAL_17]] unordered iter_args(%[[VAL_22:.*]] = %[[VAL_14]]) -> (!fir.array<5x!fir.char<1,3>>) {102  ! CHECK: %[[VAL_23:.*]] = fir.array_access %[[VAL_16]], %[[VAL_21]] : (!fir.array<5x!fir.char<1,3>>, index) -> !fir.ref<!fir.char<1,3>>103  ! CHECK: %[[VAL_24:.*]] = fir.array_access %[[VAL_22]], %[[VAL_21]] : (!fir.array<5x!fir.char<1,3>>, index) -> !fir.ref<!fir.char<1,3>>104  ! CHECK: %[[VAL_25:.*]] = arith.constant 3 : index105  ! CHECK: %[[VAL_26:.*]] = arith.constant 1 : i64106  ! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_25]] : (index) -> i64107  ! CHECK: %[[VAL_28:.*]] = arith.muli %[[VAL_26]], %[[VAL_27]] : i64108  ! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_24]] : (!fir.ref<!fir.char<1,3>>) -> !llvm.ptr109  ! CHECK: %[[VAL_31:.*]] = fir.convert %[[char_temp]] : (!fir.ref<!fir.char<1,3>>) -> !llvm.ptr110  ! CHECK: "llvm.intr.memmove"(%[[VAL_30]], %[[VAL_31]], %[[VAL_28]]) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()111  ! CHECK: %[[VAL_32:.*]] = fir.array_amend %[[VAL_22]], %[[VAL_24]] : (!fir.array<5x!fir.char<1,3>>, !fir.ref<!fir.char<1,3>>) -> !fir.array<5x!fir.char<1,3>>112  ! CHECK: fir.result %[[VAL_32]] : !fir.array<5x!fir.char<1,3>>113  ! CHECK: }114  ! CHECK: fir.array_merge_store %[[VAL_14]], %[[VAL_33:.*]] to %[[VAL_11]] : !fir.array<5x!fir.char<1,3>>, !fir.array<5x!fir.char<1,3>>, !fir.ref<!fir.array<5x!fir.char<1,3>>>115  ! CHECK: fir.call @_QMm_struct_ctorPprint_char_array(%[[VAL_3]]) {{.*}}: (!fir.ref<!fir.type<_QMm_struct_ctorTt_char_array{x:f32,c:!fir.array<5x!fir.char<1,3>>}>>) -> ()116 117    real :: x118    character(3) :: c1(5)119    call print_char_array(t_char_array(x=x, c=c1))120    ! CHECK: return121    ! CHECK: }122  end subroutine123 124  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_ptr(125  ! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<f32>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?x?xi32>> {{{.*}}, fir.target}) {126  ! CHECK:         %[[VAL_3:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>127  ! CHECK:         %[[VAL_5:.*]] = fir.coordinate_of %[[VAL_3]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>) -> !fir.ref<f32>128  ! CHECK:         %[[VAL_6:.*]] = fir.load %[[VAL_0]] : !fir.ref<f32>129  ! CHECK:         fir.store %[[VAL_6]] to %[[VAL_5]] : !fir.ref<f32>130  ! CHECK:         %[[VAL_8:.*]] = fir.coordinate_of %[[VAL_3]], p : (!fir.ref<!fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>131  ! CHECK:         %[[VAL_9:.*]] = arith.constant 1 : i64132  ! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i64) -> index133  ! CHECK:         %[[VAL_11:.*]] = arith.constant 2 : i64134  ! CHECK:         %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i64) -> index135  ! CHECK:         %[[VAL_13:.*]] = arith.constant 4 : i64136  ! CHECK:         %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i64) -> index137  ! CHECK:         %[[VAL_15:.*]] = arith.constant 1 : i64138  ! CHECK:         %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i64) -> index139  ! CHECK:         %[[VAL_17:.*]] = arith.constant 1 : i64140  ! CHECK:         %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (i64) -> index141  ! CHECK:         %[[VAL_19:.*]] = arith.constant 3 : i64142  ! CHECK:         %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i64) -> index143  ! CHECK:         %[[VAL_21:.*]] = fir.slice %[[VAL_10]], %[[VAL_14]], %[[VAL_12]], %[[VAL_16]], %[[VAL_20]], %[[VAL_18]] : (index, index, index, index, index, index) -> !fir.slice<2>144  ! CHECK:         %[[VAL_22:.*]] = fir.rebox %[[VAL_1]] {{\[}}%[[VAL_21]]] : (!fir.box<!fir.array<?x?xi32>>, !fir.slice<2>) -> !fir.box<!fir.array<2x3xi32>>145  ! CHECK:         %[[VAL_23:.*]] = fir.rebox %[[VAL_22]] : (!fir.box<!fir.array<2x3xi32>>) -> !fir.box<!fir.ptr<!fir.array<?x?xi32>>>146  ! CHECK:         fir.store %[[VAL_23]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>147  ! CHECK:         fir.call @_QMm_struct_ctorPprint_ptr(%[[VAL_3]]) {{.*}}: (!fir.ref<!fir.type<_QMm_struct_ctorTt_ptr{x:f32,p:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>) -> ()148  ! CHECK:         return149  ! CHECK:       }150 151  subroutine test_ptr(x, a)152    real :: x153    integer, target :: a(:, :)154    call print_ptr(t_ptr(x=x, p=a(1:4:2, 1:3:1)))155  end subroutine156 157  ! CHECK-LABEL: func @_QMm_struct_ctorPtest_nested(158  ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<f32>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>159  subroutine test_nested(x, d)160    real :: x161    type(t_array) :: d162  ! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>163  ! CHECK:         %[[VAL_4:.*]] = fir.coordinate_of %[[VAL_2]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>>) -> !fir.ref<f32>164  ! CHECK:         %[[VAL_5:.*]] = fir.load %[[VAL_0]] : !fir.ref<f32>165  ! CHECK:         fir.store %[[VAL_5]] to %[[VAL_4]] : !fir.ref<f32>166  ! CHECK:         %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_2]], dt : (!fir.ref<!fir.type<_QMm_struct_ctorTt_nested{x:f32,dt:!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>}>>) -> !fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>167  ! CHECK:         %[[VAL_9:.*]] = fir.coordinate_of %[[VAL_1]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>) -> !fir.ref<f32>168  ! CHECK:         %[[VAL_10:.*]] = fir.coordinate_of %[[VAL_7]], x : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>) -> !fir.ref<f32>169  ! CHECK:         %[[VAL_11:.*]] = fir.load %[[VAL_9]] : !fir.ref<f32>170  ! CHECK:         fir.store %[[VAL_11]] to %[[VAL_10]] : !fir.ref<f32>171  ! CHECK:         %[[VAL_13:.*]] = fir.coordinate_of %[[VAL_1]], i : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>) -> !fir.ref<!fir.array<5xi32>>172  ! CHECK:         %[[VAL_14:.*]] = fir.coordinate_of %[[VAL_7]], i : (!fir.ref<!fir.type<_QMm_struct_ctorTt_array{x:f32,i:!fir.array<5xi32>}>>) -> !fir.ref<!fir.array<5xi32>>173  ! CHECK:         %[[VAL_15:.*]] = arith.constant 0 : index174  ! CHECK:         %[[VAL_16:.*]] = arith.constant 1 : index175  ! CHECK:         %[[VAL_17:.*]] = arith.constant 4 : index176  ! CHECK:         fir.do_loop %[[VAL_18:.*]] = %[[VAL_15]] to %[[VAL_17]] step %[[VAL_16]] {177  ! CHECK:           %[[VAL_19:.*]] = fir.coordinate_of %[[VAL_14]], %[[VAL_18]] : (!fir.ref<!fir.array<5xi32>>, index) -> !fir.ref<i32>178  ! CHECK:           %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_13]], %[[VAL_18]] : (!fir.ref<!fir.array<5xi32>>, index) -> !fir.ref<i32>179  ! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<i32>180  ! CHECK:           fir.store %[[VAL_21]] to %[[VAL_19]] : !fir.ref<i32>181  ! CHECK:         }182    call print_nested(t_nested(x=x, dt=d))183  end subroutine184 185  subroutine print_simple(t)186    type(t_simple) :: t187    print *, t%x188  end subroutine189  subroutine print_char_scalar(t)190    type(t_char_scalar) :: t191    print *, t%x, t%c192  end subroutine193  subroutine print_simple_array(t)194    type(t_array) :: t195    print *, t%x, t%i196  end subroutine197  subroutine print_char_array(t)198    type(t_char_array) :: t199    print *, t%x, t%c200  end subroutine201  subroutine print_ptr(t)202    type(t_ptr) :: t203    print *, t%x, t%p204  end subroutine205  subroutine print_nested(t)206    type(t_nested) :: t207    print *, t%x, t%dt%x, t%dt%i208  end subroutine209 210end module211 212  use m_struct_ctor213  integer, target :: i(4,3) = reshape([1,2,3,4,5,6,7,8,9,10,11,12], [4,3])214  call test_simple(42.)215  call test_char_scalar(42.)216  call test_simple_array(42., [1,2,3,4,5])217  call test_char_array(42., ["abc", "def", "geh", "ijk", "lmn"])218  call test_ptr(42., i)219  call test_nested(42., t_array(x=43., i=[5,6,7,8,9]))220end221 222! CHECK-LABEL: func.func @_QPtest_parent_component1() {223! CHECK:         %[[VAL_0:.*]] = fir.alloca !fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>224! CHECK:         %[[VAL_1:.*]] = fir.alloca !fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>225! CHECK:         %[[VAL_15:.*]] = fir.coordinate_of %[[VAL_0]], x : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>) -> !fir.ref<i32>226! CHECK:         %[[VAL_16:.*]] = arith.constant 1 : i32227! CHECK:         fir.store %[[VAL_16]] to %[[VAL_15]] : !fir.ref<i32>228! CHECK:         %[[VAL_18:.*]] = fir.coordinate_of %[[VAL_0]], y : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>) -> !fir.ref<!fir.array<2xi32>>229! CHECK:         %[[VAL_19:.*]] = arith.constant 2 : index230! CHECK:         %[[VAL_20:.*]] = fir.shape %[[VAL_19]] : (index) -> !fir.shape<1>231! CHECK:         %[[VAL_21:.*]] = fir.array_load %[[VAL_18]](%[[VAL_20]]) : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> !fir.array<2xi32>232! CHECK:         %[[VAL_23:.*]] = arith.constant 2 : index233! CHECK:         %[[VAL_24:.*]] = fir.shape %[[VAL_23]] : (index) -> !fir.shape<1>234! CHECK:         %[[VAL_25:.*]] = fir.array_load %[[VAL_22:.*]](%[[VAL_24]]) : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> !fir.array<2xi32>235! CHECK:         %[[VAL_26:.*]] = arith.constant 1 : index236! CHECK:         %[[VAL_27:.*]] = arith.constant 0 : index237! CHECK:         %[[VAL_28:.*]] = arith.subi %[[VAL_19]], %[[VAL_26]] : index238! CHECK:         %[[VAL_29:.*]] = fir.do_loop %[[VAL_30:.*]] = %[[VAL_27]] to %[[VAL_28]] step %[[VAL_26]] unordered iter_args(%[[VAL_31:.*]] = %[[VAL_21]]) -> (!fir.array<2xi32>) {239! CHECK:           %[[VAL_32:.*]] = fir.array_fetch %[[VAL_25]], %[[VAL_30]] : (!fir.array<2xi32>, index) -> i32240! CHECK:           %[[VAL_33:.*]] = fir.array_update %[[VAL_31]], %[[VAL_32]], %[[VAL_30]] : (!fir.array<2xi32>, i32, index) -> !fir.array<2xi32>241! CHECK:           fir.result %[[VAL_33]] : !fir.array<2xi32>242! CHECK:         }243! CHECK:         fir.array_merge_store %[[VAL_21]], %[[VAL_34:.*]] to %[[VAL_18]] : !fir.array<2xi32>, !fir.array<2xi32>, !fir.ref<!fir.array<2xi32>>244! CHECK:         %[[VAL_35:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>245! CHECK:         %[[VAL_37:.*]] = fir.coordinate_of %[[VAL_0]], x : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>) -> !fir.ref<i32>246! CHECK:         %[[VAL_39:.*]] = fir.coordinate_of %[[VAL_35]], x : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>) -> !fir.ref<i32>247! CHECK:         %[[VAL_40:.*]] = fir.load %[[VAL_37]] : !fir.ref<i32>248! CHECK:         fir.store %[[VAL_40]] to %[[VAL_39]] : !fir.ref<i32>249! CHECK:         %[[VAL_42:.*]] = fir.coordinate_of %[[VAL_0]], y : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>) -> !fir.ref<!fir.array<2xi32>>250! CHECK:         %[[VAL_44:.*]] = fir.coordinate_of %[[VAL_35]], y : (!fir.ref<!fir.type<_QFtest_parent_component1Tbase{x:i32,y:!fir.array<2xi32>}>>) -> !fir.ref<!fir.array<2xi32>>251! CHECK:         %[[VAL_45:.*]] = arith.constant 0 : index252! CHECK:         %[[VAL_46:.*]] = arith.constant 1 : index253! CHECK:         %[[VAL_47:.*]] = arith.constant 1 : index254! CHECK:         fir.do_loop %[[VAL_48:.*]] = %[[VAL_45]] to %[[VAL_47]] step %[[VAL_46]] {255! CHECK:           %[[VAL_49:.*]] = fir.coordinate_of %[[VAL_44]], %[[VAL_48]] : (!fir.ref<!fir.array<2xi32>>, index) -> !fir.ref<i32>256! CHECK:           %[[VAL_50:.*]] = fir.coordinate_of %[[VAL_42]], %[[VAL_48]] : (!fir.ref<!fir.array<2xi32>>, index) -> !fir.ref<i32>257! CHECK:           %[[VAL_51:.*]] = fir.load %[[VAL_50]] : !fir.ref<i32>258! CHECK:           fir.store %[[VAL_51]] to %[[VAL_49]] : !fir.ref<i32>259! CHECK:         }260! CHECK:         %[[VAL_53:.*]] = fir.coordinate_of %[[VAL_1]], mask : (!fir.ref<!fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.logical<4>>261! CHECK:         %[[VAL_54:.*]] = arith.constant true262! CHECK:         %[[VAL_55:.*]] = fir.convert %[[VAL_54]] : (i1) -> !fir.logical<4>263! CHECK:         fir.store %[[VAL_55]] to %[[VAL_53]] : !fir.ref<!fir.logical<4>>264! CHECK:         fir.call @_QPprint_parent_component1(%[[VAL_1]]) {{.*}}: (!fir.ref<!fir.type<_QFtest_parent_component1Tmid{x:i32,y:!fir.array<2xi32>,mask:!fir.logical<4>}>>) -> ()265! CHECK:         return266! CHECK:       }267 268subroutine test_parent_component1()269  type base270    integer :: x, y(2)271  end type base272  type, extends(base) :: mid273    logical :: mask274  end type mid275 276  call print_parent_component1(mid(base = base(1, [2, 3]), mask = .true.))277end278 279! CHECK-LABEL: func.func @_QPtest_parent_component2() {280! CHECK:         %[[VAL_0:.*]] = fir.alloca !fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>281! CHECK:         %[[VAL_1:.*]] = fir.address_of(@_QFtest_parent_component2Epv) : !fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>282! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<!fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>283! CHECK:         %[[VAL_10:.*]] = fir.coordinate_of %[[VAL_1]], z : (!fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>) -> !fir.ref<!fir.char<1,5>>284! CHECK:         %[[VAL_12:.*]] = fir.coordinate_of %[[VAL_8]], z : (!fir.ref<!fir.type<_QFtest_parent_component2Tbase{z:!fir.char<1,5>}>>) -> !fir.ref<!fir.char<1,5>>285! CHECK:         %[[VAL_13:.*]] = arith.constant 5 : index286! CHECK:         %[[VAL_14:.*]] = arith.constant 1 : i64287! CHECK:         %[[VAL_15:.*]] = fir.convert %[[VAL_13]] : (index) -> i64288! CHECK:         %[[VAL_16:.*]] = arith.muli %[[VAL_14]], %[[VAL_15]] : i64289! CHECK:         %[[VAL_18:.*]] = fir.convert %[[VAL_12]] : (!fir.ref<!fir.char<1,5>>) -> !llvm.ptr290! CHECK:         %[[VAL_19:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,5>>) -> !llvm.ptr291! CHECK:         "llvm.intr.memmove"(%[[VAL_18]], %[[VAL_19]], %[[VAL_16]]) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()292! CHECK:         %[[VAL_21:.*]] = fir.coordinate_of %[[VAL_0]], mask : (!fir.ref<!fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.logical<4>>293! CHECK:         %[[VAL_22:.*]] = arith.constant true294! CHECK:         %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i1) -> !fir.logical<4>295! CHECK:         fir.store %[[VAL_23]] to %[[VAL_21]] : !fir.ref<!fir.logical<4>>296! CHECK:         fir.call @_QPprint_parent_component2(%[[VAL_0]]) {{.*}}: (!fir.ref<!fir.type<_QFtest_parent_component2Tmid{z:!fir.char<1,5>,mask:!fir.logical<4>}>>) -> ()297! CHECK:         return298! CHECK:       }299 300subroutine test_parent_component2()301  type base302    character(5) :: z303  end type base304  type, extends(base) :: mid305    logical :: mask306  end type mid307  type(base) :: pv = base("aaa")308 309  call print_parent_component2(mid(base = pv, mask = .true.))310end311 312! CHECK-LABEL: func.func @_QPtest_parent_component3(313! CHECK-SAME:                                       %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>> {fir.bindc_name = "pp"}) {314! CHECK:         %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>315! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>316! CHECK:         %[[VAL_9:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>>317! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>318! CHECK:         %[[VAL_11:.*]] = fir.embox %[[VAL_10]] : (!fir.ref<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>) -> !fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>319! CHECK:         fir.store %[[VAL_11]] to %[[VAL_1]] : !fir.ref<!fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>320! CHECK:         %[[VAL_14:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.box<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>) -> !fir.ref<!fir.box<none>>321! CHECK:         %[[VAL_15:.*]] = fir.convert %[[VAL_9]] : (!fir.box<!fir.ptr<!fir.type<_QFtest_parent_component3Tbase{m:!fir.array<2x!fir.char<1,5>>}>>>) -> !fir.box<none>322! CHECK:         fir.call @_FortranAAssign(%[[VAL_14]], %[[VAL_15]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.ref<i8>, i32) -> ()323! CHECK:         %[[VAL_19:.*]] = fir.coordinate_of %[[VAL_2]], mask : (!fir.ref<!fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>>) -> !fir.ref<!fir.logical<4>>324! CHECK:         %[[VAL_20:.*]] = arith.constant true325! CHECK:         %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i1) -> !fir.logical<4>326! CHECK:         fir.store %[[VAL_21]] to %[[VAL_19]] : !fir.ref<!fir.logical<4>>327! CHECK:         fir.call @_QPprint_parent_component3(%[[VAL_2]]) {{.*}}: (!fir.ref<!fir.type<_QFtest_parent_component3Tmid{m:!fir.array<2x!fir.char<1,5>>,mask:!fir.logical<4>}>>) -> ()328! CHECK:         return329! CHECK:       }330 331subroutine test_parent_component3(pp)332  type base333    character(5) :: m(2)334  end type base335  type, extends(base) :: mid336    logical :: mask337  end type mid338  type(base), pointer :: pp339 340  call print_parent_component3(mid(base = pp, mask = .true.))341end342