brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.4 KiB · 8c3a90b Raw
466 lines · plain
1! Test lowering of OPTIONAL VALUE dummy argument on caller side.2! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s3 4! A copy must be made if the actual is a variable (and no copy-out), but care5! has to be take if the actual argument may be absent at runtime: the copy6! must be conditional. When the allocation is dynamic, the temp allocation and7! deallocation are also conditionals.8 9module test10interface11  subroutine scalar(i)12    integer, optional, value :: i13  end subroutine14  subroutine dyn_char(c)15    character(*), optional, value :: c16  end subroutine17  subroutine array(i)18    integer, optional, value :: i(100)19  end subroutine20  subroutine dyn_array(i, n)21    integer(8) :: n22    integer, optional, value :: i(n)23  end subroutine24  subroutine dyn_char_array(c, n)25    integer(8) :: n26    character(*), optional, value :: c(n)27  end subroutine28  function returns_ptr()29    integer, pointer :: returns_ptr30  end function31end interface32contains33 34! CHECK-LABEL: func @_QMtestPtest_scalar_not_a_var() {35subroutine test_scalar_not_a_var()36  call scalar(42)37! CHECK:  %[[VAL_0:.*]] = fir.alloca i32 {adapt.valuebyref}38! CHECK:  %[[VAL_1:.*]] = arith.constant 42 : i3239! CHECK:  fir.store %[[VAL_1]] to %[[VAL_0]] : !fir.ref<i32>40! CHECK:  fir.call @_QPscalar(%[[VAL_0]]) {{.*}}: (!fir.ref<i32>) -> ()41end subroutine42 43! CHECK-LABEL: func @_QMtestPtest_scalar(44! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i", fir.optional}) {45subroutine test_scalar(i)46  integer, optional :: i47  call scalar(i)48! CHECK:  %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}49! CHECK:  %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<i32>) -> i150! CHECK:  %[[VAL_3:.*]] = fir.if %[[VAL_2]] -> (!fir.ref<i32>) {51! CHECK:    %[[VAL_4:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>52! CHECK:    fir.store %[[VAL_4]] to %[[VAL_1]] : !fir.ref<i32>53! CHECK:    fir.result %[[VAL_1]] : !fir.ref<i32>54! CHECK:  } else {55! CHECK:    %[[VAL_5:.*]] = fir.absent !fir.ref<i32>56! CHECK:    fir.result %[[VAL_5]] : !fir.ref<i32>57! CHECK:  }58! CHECK:  fir.call @_QPscalar(%[[VAL_6:.*]]) {{.*}}: (!fir.ref<i32>) -> ()59end subroutine60 61! CHECK-LABEL: func @_QMtestPtest_scalar2(62! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i", fir.optional}) {63subroutine test_scalar2(i)64  integer, optional, value :: i65  call scalar(i)66! CHECK:  %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}67! CHECK:  %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<i32>) -> i168! CHECK:  %[[VAL_3:.*]] = fir.if %[[VAL_2]] -> (!fir.ref<i32>) {69! CHECK:    %[[VAL_4:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>70! CHECK:    fir.store %[[VAL_4]] to %[[VAL_1]] : !fir.ref<i32>71! CHECK:    fir.result %[[VAL_1]] : !fir.ref<i32>72! CHECK:  } else {73! CHECK:    %[[VAL_5:.*]] = fir.absent !fir.ref<i32>74! CHECK:    fir.result %[[VAL_5]] : !fir.ref<i32>75! CHECK:  }76! CHECK:  fir.call @_QPscalar(%[[VAL_6:.*]]) {{.*}}: (!fir.ref<i32>) -> ()77end subroutine78 79! CHECK-LABEL: func @_QMtestPtest_scalar3(80! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i", fir.optional}) {81subroutine test_scalar3(i)82  integer, optional :: i83  ! i must be present when it appears in "()"84  call scalar((i))85! CHECK:  %[[VAL_1:.*]] = fir.alloca i3286! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>87! CHECK:  %[[VAL_3:.*]] = fir.no_reassoc %[[VAL_2]] : i3288! CHECK:  fir.store %[[VAL_3]] to %[[VAL_1]] : !fir.ref<i32>89! CHECK:  fir.call @_QPscalar(%[[VAL_1]]) {{.*}}: (!fir.ref<i32>) -> ()90end subroutine91 92! CHECK-LABEL: func @_QMtestPtest_scalar_ptr(93! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "i"}) {94subroutine test_scalar_ptr(i)95  integer, pointer :: i96  call scalar(i)97! CHECK:  %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}98! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<i32>>>99! CHECK:  %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>100! CHECK:  %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ptr<i32>) -> i64101! CHECK:  %[[VAL_5:.*]] = arith.constant 0 : i64102! CHECK:  %[[VAL_6:.*]] = arith.cmpi ne, %[[VAL_4]], %[[VAL_5]] : i64103! CHECK:  %[[VAL_7:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<i32>>>104! CHECK:  %[[VAL_8:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>105! CHECK:  %[[VAL_9:.*]] = fir.if %[[VAL_6]] -> (!fir.ref<i32>) {106! CHECK:    %[[VAL_10:.*]] = fir.load %[[VAL_8]] : !fir.ptr<i32>107! CHECK:    fir.store %[[VAL_10]] to %[[VAL_1]] : !fir.ref<i32>108! CHECK:    fir.result %[[VAL_1]] : !fir.ref<i32>109! CHECK:  } else {110! CHECK:    %[[VAL_11:.*]] = fir.absent !fir.ref<i32>111! CHECK:    fir.result %[[VAL_11]] : !fir.ref<i32>112! CHECK:  }113! CHECK:  fir.call @_QPscalar(%[[VAL_12:.*]]) {{.*}}: (!fir.ref<i32>) -> ()114end subroutine115 116! CHECK-LABEL: func @_QMtestPtest_scalar_simple_var(117! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i"}) {118subroutine test_scalar_simple_var(i)119  integer :: i120  call scalar(i)121! CHECK:  %[[VAL_1:.*]] = fir.alloca i32122! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>123! CHECK:  fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<i32>124! CHECK:  fir.call @_QPscalar(%[[VAL_1]]) {{.*}}: (!fir.ref<i32>) -> ()125end subroutine126 127 128! CHECK-LABEL: func @_QMtestPtest_scalar_alloc(129! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<i32>>> {fir.bindc_name = "i"}) {130subroutine test_scalar_alloc(i)131  integer, allocatable :: i132  call scalar(i)133! CHECK:  %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}134! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>135! CHECK:  %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>136! CHECK:  %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.heap<i32>) -> i64137! CHECK:  %[[VAL_5:.*]] = arith.constant 0 : i64138! CHECK:  %[[VAL_6:.*]] = arith.cmpi ne, %[[VAL_4]], %[[VAL_5]] : i64139! CHECK:  %[[VAL_7:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>140! CHECK:  %[[VAL_8:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>141! CHECK:  %[[VAL_9:.*]] = fir.if %[[VAL_6]] -> (!fir.ref<i32>) {142! CHECK:    %[[VAL_10:.*]] = fir.load %[[VAL_8]] : !fir.heap<i32>143! CHECK:    fir.store %[[VAL_10]] to %[[VAL_1]] : !fir.ref<i32>144! CHECK:    fir.result %[[VAL_1]] : !fir.ref<i32>145! CHECK:  } else {146! CHECK:    %[[VAL_11:.*]] = fir.absent !fir.ref<i32>147! CHECK:    fir.result %[[VAL_11]] : !fir.ref<i32>148! CHECK:  }149! CHECK:  fir.call @_QPscalar(%[[VAL_12:.*]]) {{.*}}: (!fir.ref<i32>) -> ()150end subroutine151 152! CHECK-LABEL: func @_QMtestPtest_ptr_2() {153subroutine test_ptr_2()154  call scalar(returns_ptr())155! CHECK:  %[[VAL_0:.*]] = fir.alloca i32 {adapt.valuebyref}156! CHECK:  %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = ".result"}157! CHECK:  %[[VAL_2:.*]] = fir.call @_QPreturns_ptr() {{.*}}: () -> !fir.box<!fir.ptr<i32>>158! CHECK:  fir.save_result %[[VAL_2]] to %[[VAL_1]] : !fir.box<!fir.ptr<i32>>, !fir.ref<!fir.box<!fir.ptr<i32>>>159! CHECK:  %[[VAL_3:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<i32>>>160! CHECK:  %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>161! CHECK:  %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (!fir.ptr<i32>) -> i64162! CHECK:  %[[VAL_6:.*]] = arith.constant 0 : i64163! CHECK:  %[[VAL_7:.*]] = arith.cmpi ne, %[[VAL_5]], %[[VAL_6]] : i64164! CHECK:  %[[VAL_8:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<i32>>>165! CHECK:  %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>166! CHECK:  %[[VAL_10:.*]] = fir.if %[[VAL_7]] -> (!fir.ref<i32>) {167! CHECK:    %[[VAL_11:.*]] = fir.load %[[VAL_9]] : !fir.ptr<i32>168! CHECK:    fir.store %[[VAL_11]] to %[[VAL_0]] : !fir.ref<i32>169! CHECK:    fir.result %[[VAL_0]] : !fir.ref<i32>170! CHECK:  } else {171! CHECK:    %[[VAL_12:.*]] = fir.absent !fir.ref<i32>172! CHECK:    fir.result %[[VAL_12]] : !fir.ref<i32>173! CHECK:  }174! CHECK:  fir.call @_QPscalar(%[[VAL_13:.*]]) {{.*}}: (!fir.ref<i32>) -> ()175end subroutine176 177! CHECK-LABEL: func @_QMtestPtest_array(178! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "i", fir.optional}) {179subroutine test_array(i)180  integer, optional :: i(100)181  call array(i)182! CHECK:  %[[VAL_1:.*]] = arith.constant 100 : index183! CHECK:  %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<!fir.array<100xi32>>) -> i1184! CHECK:  %[[VAL_3:.*]] = fir.if %[[VAL_2]] -> (!fir.heap<!fir.array<100xi32>>) {185! CHECK:    %[[VAL_4:.*]] = fir.allocmem !fir.array<100xi32>, %[[VAL_1]] {uniq_name = ".copy"}186! CHECK:    %[[VAL_5:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>187! CHECK:    %[[VAL_6:.*]] = fir.array_load %[[VAL_4]](%[[VAL_5]]) : (!fir.heap<!fir.array<100xi32>>, !fir.shape<1>) -> !fir.array<100xi32>188! CHECK:    %[[VAL_7:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>189! CHECK:    %[[VAL_8:.*]] = fir.array_load %[[VAL_0]](%[[VAL_7]]) : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>) -> !fir.array<100xi32>190! CHECK:    %[[VAL_9:.*]] = arith.constant 1 : index191! CHECK:    %[[VAL_10:.*]] = arith.constant 0 : index192! CHECK:    %[[VAL_11:.*]] = arith.subi %[[VAL_1]], %[[VAL_9]] : index193! CHECK:    %[[VAL_12:.*]] = fir.do_loop %[[VAL_13:.*]] = %[[VAL_10]] to %[[VAL_11]] step %[[VAL_9]] unordered iter_args(%[[VAL_14:.*]] = %[[VAL_6]]) -> (!fir.array<100xi32>) {194! CHECK:      %[[VAL_15:.*]] = fir.array_fetch %[[VAL_8]], %[[VAL_13]] : (!fir.array<100xi32>, index) -> i32195! CHECK:      %[[VAL_16:.*]] = fir.array_update %[[VAL_14]], %[[VAL_15]], %[[VAL_13]] : (!fir.array<100xi32>, i32, index) -> !fir.array<100xi32>196! CHECK:      fir.result %[[VAL_16]] : !fir.array<100xi32>197! CHECK:    }198! CHECK:    fir.array_merge_store %[[VAL_6]], %[[VAL_17:.*]] to %[[VAL_4]] : !fir.array<100xi32>, !fir.array<100xi32>, !fir.heap<!fir.array<100xi32>>199! CHECK:    fir.result %[[VAL_4]] : !fir.heap<!fir.array<100xi32>>200! CHECK:  } else {201! CHECK:    %[[VAL_18:.*]] = fir.zero_bits !fir.heap<!fir.array<100xi32>>202! CHECK:    fir.result %[[VAL_18]] : !fir.heap<!fir.array<100xi32>>203! CHECK:  }204! CHECK:  %[[VAL_19:.*]] = fir.convert %[[VAL_20:.*]] : (!fir.heap<!fir.array<100xi32>>) -> !fir.ref<!fir.array<100xi32>>205! CHECK:  fir.call @_QParray(%[[VAL_19]]) {{.*}}: (!fir.ref<!fir.array<100xi32>>) -> ()206! CHECK:  fir.if %[[VAL_2]] {207! CHECK:    fir.freemem %[[VAL_20]] : !fir.heap<!fir.array<100xi32>>208! CHECK:  }209end subroutine210 211! CHECK-LABEL: func @_QMtestPtest_array2(212! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<?xi32>> {fir.bindc_name = "i", fir.optional},213subroutine test_array2(i, n)214  integer(8) :: n215  integer, optional, value :: i(n)216  call array(i)217! CHECK-SAME:  %[[VAL_1:.*]]: !fir.ref<i64> {fir.bindc_name = "n"}) {218! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<i64>219! CHECK:  %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (i64) -> index220! CHECK:  %[[VAL_4:.*]] = arith.constant 0 : index221! CHECK:  %[[VAL_5:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[VAL_4]] : index222! CHECK:  %[[VAL_6:.*]] = arith.select %[[VAL_5]], %[[VAL_3]], %[[VAL_4]] : index223! CHECK:  %[[VAL_7:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<!fir.array<?xi32>>) -> i1224! CHECK:  %[[VAL_8:.*]] = fir.if %[[VAL_7]] -> (!fir.heap<!fir.array<?xi32>>) {225! CHECK:    %[[VAL_9:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_6]] {uniq_name = ".copy"}226! CHECK:    %[[VAL_17:.*]] = fir.do_loop227! CHECK:    }228! CHECK:    fir.array_merge_store %{{.*}}, %[[VAL_17]] to %[[VAL_9]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.heap<!fir.array<?xi32>>229! CHECK:    fir.result %[[VAL_9]] : !fir.heap<!fir.array<?xi32>>230! CHECK:  } else {231! CHECK:    %[[VAL_23:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>232! CHECK:    fir.result %[[VAL_23]] : !fir.heap<!fir.array<?xi32>>233! CHECK:  }234! CHECK:  %[[VAL_24:.*]] = fir.convert %[[VAL_8]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<100xi32>>235! CHECK:  fir.call @_QParray(%[[VAL_24]]) {{.*}}: (!fir.ref<!fir.array<100xi32>>) -> ()236! CHECK:  fir.if %[[VAL_7]] {237! CHECK:    fir.freemem %[[VAL_8]] : !fir.heap<!fir.array<?xi32>>238! CHECK:  }239end subroutine240 241! CHECK-LABEL: func @_QMtestPtest_dyn_array(242! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<?xi32>> {fir.bindc_name = "i", fir.optional},243! CHECK-SAME:  %[[VAL_1:.*]]: !fir.ref<i64> {fir.bindc_name = "n"}) {244subroutine test_dyn_array(i, n)245  integer(8) :: n246  integer, optional :: i(n)247  call dyn_array(i, n)248! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<i64>249! CHECK:  %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (i64) -> index250! CHECK:  %[[VAL_4:.*]] = arith.constant 0 : index251! CHECK:  %[[VAL_5:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[VAL_4]] : index252! CHECK:  %[[VAL_6:.*]] = arith.select %[[VAL_5]], %[[VAL_3]], %[[VAL_4]] : index253! CHECK:  %[[VAL_7:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<!fir.array<?xi32>>) -> i1254! CHECK:  %[[VAL_8:.*]] = fir.if %[[VAL_7]] -> (!fir.heap<!fir.array<?xi32>>) {255! CHECK:    %[[VAL_9:.*]] = fir.allocmem !fir.array<?xi32>, %{{.*}} {uniq_name = ".copy"}256! CHECK:    %[[VAL_17:.*]] = fir.do_loop257! CHECK:    }258! CHECK:    fir.array_merge_store %{{.*}}, %[[VAL_17]] to %[[VAL_9]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.heap<!fir.array<?xi32>>259! CHECK:    fir.result %[[VAL_9]] : !fir.heap<!fir.array<?xi32>>260! CHECK:  } else {261! CHECK:    %[[VAL_23:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>262! CHECK:    fir.result %[[VAL_23]] : !fir.heap<!fir.array<?xi32>>263! CHECK:  }264! CHECK:  %[[VAL_24:.*]] = fir.convert %[[VAL_8]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>265! CHECK:  fir.call @_QPdyn_array(%[[VAL_24]], %[[VAL_1]]) {{.*}}: (!fir.ref<!fir.array<?xi32>>, !fir.ref<i64>) -> ()266! CHECK:  fir.if %[[VAL_7]] {267! CHECK:    fir.freemem %[[VAL_8]] : !fir.heap<!fir.array<?xi32>>268! CHECK:  }269end subroutine270 271! CHECK-LABEL: func @_QMtestPtest_dyn_array_from_assumed(272! CHECK-SAME:  %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i", fir.optional},273! CHECK-SAME:  %[[VAL_1:.*]]: !fir.ref<i64> {fir.bindc_name = "n"}) {274subroutine test_dyn_array_from_assumed(i, n)275  integer(8) :: n276  integer, optional :: i(:)277  call dyn_array(i, n)278! CHECK:  %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.box<!fir.array<?xi32>>) -> i1279! CHECK:  %[[VAL_3:.*]] = fir.zero_bits !fir.ref<!fir.array<?xi32>>280! CHECK:  %[[VAL_4:.*]] = arith.constant 0 : index281! CHECK:  %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>282! CHECK:  %[[VAL_6:.*]] = fir.embox %[[VAL_3]](%[[VAL_5]]) : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<?xi32>>283! CHECK:  %[[VAL_7:.*]] = arith.select %[[VAL_2]], %[[VAL_0]], %[[VAL_6]] : !fir.box<!fir.array<?xi32>>284! CHECK:  %[[box_none:.*]] = fir.convert %[[VAL_7]] : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none>285! CHECK:  %[[is_contiguous:.*]] = fir.call @_FortranAIsContiguous(%[[box_none]]) {{.*}}: (!fir.box<none>) -> i1286! CHECK:  %[[VAL_8:.*]] = fir.if %[[VAL_2]] -> (!fir.heap<!fir.array<?xi32>>) {287! CHECK:    %[[VAL_9:.*]] = arith.constant 0 : index288! CHECK:    %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_7]], %[[VAL_9]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)289! CHECK:    %[[VAL_11:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_10]]#1 {uniq_name = ".copy"}290! CHECK:    fir.call @_FortranAAssign291! CHECK:    fir.result %[[VAL_11]] : !fir.heap<!fir.array<?xi32>>292! CHECK:  } else {293! CHECK:    %[[VAL_24:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>294! CHECK:    fir.result %[[VAL_24]] : !fir.heap<!fir.array<?xi32>>295! CHECK:  }296! CHECK:  %[[not_contiguous:.*]] = arith.cmpi eq, %[[is_contiguous]], %false{{.*}} : i1297! CHECK:  %[[and:.*]] = arith.andi %[[VAL_2]], %[[not_contiguous]] : i1298! CHECK:  %[[VAL_25:.*]] = fir.convert %[[VAL_8]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>299! CHECK:  fir.call @_QPdyn_array(%[[VAL_25]], %[[VAL_1]]) {{.*}}: (!fir.ref<!fir.array<?xi32>>, !fir.ref<i64>) -> ()300! CHECK:  fir.if %[[and]] {301! CHECK:    fir.zero302! CHECK:    fir.call @_FortranACopyOutAssign303! CHECK:  }304end subroutine305 306! CHECK-LABEL: func @_QMtestPtest_array_ptr(307! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "i"}) {308subroutine test_array_ptr(i)309  integer, pointer :: i(:)310  call array(i)311! CHECK:         %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.array<?xi32>>312! CHECK:         %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>313! CHECK:         %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.ptr<!fir.array<?xi32>>314! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ptr<!fir.array<?xi32>>) -> i64315! CHECK:         %[[VAL_5:.*]] = arith.constant 0 : i64316! CHECK:         %[[VAL_6:.*]] = arith.cmpi ne, %[[VAL_4]], %[[VAL_5]] : i64317! CHECK:         %[[VAL_7:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>318! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.box<none>319! CHECK:         %[[VAL_9:.*]] = fir.call @_FortranAIsContiguous(%[[VAL_8]]) fastmath<contract> : (!fir.box<none>) -> i1320! CHECK:         %[[VAL_10:.*]] = fir.if %[[VAL_6]] -> (!fir.heap<!fir.array<?xi32>>) {321! CHECK:           %[[VAL_11:.*]] = fir.if %[[VAL_9]] -> (!fir.heap<!fir.array<?xi32>>) {322! CHECK:             %[[VAL_12:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>323! CHECK:             fir.result %[[VAL_12]] : !fir.heap<!fir.array<?xi32>>324! CHECK:           } else {325! CHECK:             %[[VAL_13:.*]] = arith.constant 0 : index326! CHECK:             %[[VAL_14:.*]]:3 = fir.box_dims %[[VAL_7]], %[[VAL_13]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)327! CHECK:             %[[VAL_15:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_14]]#1 {uniq_name = ".copy"}328! CHECK:             %[[VAL_16:.*]] = fir.shape %[[VAL_14]]#1 : (index) -> !fir.shape<1>329! CHECK:             %[[VAL_17:.*]] = fir.embox %[[VAL_15]](%[[VAL_16]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<?xi32>>330! CHECK:             fir.store %[[VAL_17]] to %[[VAL_1]] : !fir.ref<!fir.box<!fir.array<?xi32>>>331! CHECK:             %[[VAL_18:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{.*}}>>332! CHECK:             %[[VAL_19:.*]] = arith.constant {{.*}} : i32333! CHECK:             %[[VAL_20:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.box<!fir.array<?xi32>>>) -> !fir.ref<!fir.box<none>>334! CHECK:             %[[VAL_21:.*]] = fir.convert %[[VAL_7]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.box<none>335! CHECK:             %[[VAL_22:.*]] = fir.convert %[[VAL_18]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>336! CHECK:             fir.call @_FortranAAssignTemporary(%[[VAL_20]], %[[VAL_21]], %[[VAL_22]], %[[VAL_19]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.ref<i8>, i32) -> ()337! CHECK:             fir.result %[[VAL_15]] : !fir.heap<!fir.array<?xi32>>338! CHECK:           }339! CHECK:           fir.result %[[VAL_24:.*]] : !fir.heap<!fir.array<?xi32>>340! CHECK:         } else {341! CHECK:           %[[VAL_25:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>342! CHECK:           fir.result %[[VAL_25]] : !fir.heap<!fir.array<?xi32>>343! CHECK:         }344! CHECK:         %[[VAL_26:.*]] = arith.constant false345! CHECK:         %[[VAL_27:.*]] = arith.cmpi eq, %[[VAL_9]], %[[VAL_26]] : i1346! CHECK:         %[[VAL_28:.*]] = arith.andi %[[VAL_6]], %[[VAL_27]] : i1347! CHECK:         %[[VAL_29:.*]] = fir.convert %[[VAL_30:.*]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<100xi32>>348! CHECK:         fir.call @_QParray(%[[VAL_29]]) fastmath<contract> : (!fir.ref<!fir.array<100xi32>>) -> ()349! CHECK:         fir.if %[[VAL_28]] {350! CHECK:           fir.zero351! CHECK:           fir.call @_FortranACopyOutAssign352! CHECK:         }353! CHECK:         return354! CHECK:       }355end subroutine356 357! CHECK-LABEL: func @_QMtestPtest_char(358! CHECK-SAME:  %[[VAL_0:.*]]: !fir.boxchar<1> {fir.bindc_name = "c", fir.optional}) {359subroutine test_char(c)360  character(*), optional :: c361  call dyn_char(c)362! CHECK:  %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)363! CHECK:  %[[VAL_2:.*]] = fir.is_present %[[VAL_1]]#0 : (!fir.ref<!fir.char<1,?>>) -> i1364! CHECK:  %[[VAL_3:.*]] = arith.constant 0 : index365! CHECK:  %[[VAL_4:.*]] = arith.select %[[VAL_2]], %[[VAL_1]]#1, %[[VAL_3]] : index366! CHECK:  %[[VAL_5:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_4]] : index) {adapt.valuebyref}367! CHECK:  %[[VAL_6:.*]] = fir.if %[[VAL_2]] -> (!fir.ref<!fir.char<1,?>>) {368! CHECK:    %[[VAL_13:.*]] = fir.convert %[[VAL_5]] : (!fir.ref<!fir.char<1,?>>) -> !llvm.ptr369! CHECK:    %[[VAL_14:.*]] = fir.convert %[[VAL_1]]#0 : (!fir.ref<!fir.char<1,?>>) -> !llvm.ptr370! CHECK:    "llvm.intr.memmove"(%[[VAL_13]], %[[VAL_14]], %{{.*}}) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()371! CHECK:    fir.result %[[VAL_5]] : !fir.ref<!fir.char<1,?>>372! CHECK:  } else {373! CHECK:    %[[VAL_24:.*]] = fir.absent !fir.ref<!fir.char<1,?>>374! CHECK:    fir.result %[[VAL_24]] : !fir.ref<!fir.char<1,?>>375! CHECK:  }376! CHECK:  %[[VAL_25:.*]] = fir.emboxchar %[[VAL_6]], %[[VAL_4]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>377! CHECK:  fir.call @_QPdyn_char(%[[VAL_25]]) {{.*}}: (!fir.boxchar<1>) -> ()378end subroutine379 380! CHECK-LABEL: func @_QMtestPtest_char_ptr(381! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>> {fir.bindc_name = "c"}) {382subroutine test_char_ptr(c)383  character(:), pointer :: c384  call dyn_char(c)385! CHECK:  %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>386! CHECK:  %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> !fir.ptr<!fir.char<1,?>>387! CHECK:  %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ptr<!fir.char<1,?>>) -> i64388! CHECK:  %[[VAL_4:.*]] = arith.constant 0 : i64389! CHECK:  %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64390! CHECK:  %[[VAL_6:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>391! CHECK:  %[[VAL_7:.*]] = fir.box_elesize %[[VAL_6]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> index392! CHECK:  %[[VAL_8:.*]] = fir.box_addr %[[VAL_6]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> !fir.ptr<!fir.char<1,?>>393! CHECK:  %[[VAL_9:.*]] = arith.constant 0 : index394! CHECK:  %[[VAL_10:.*]] = arith.select %[[VAL_5]], %[[VAL_7]], %[[VAL_9]] : index395! CHECK:  %[[VAL_11:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_10]] : index) {adapt.valuebyref}396! CHECK:  %[[VAL_12:.*]] = fir.if %[[VAL_5]] -> (!fir.ref<!fir.char<1,?>>) {397! CHECK:    %[[VAL_19:.*]] = fir.convert %[[VAL_11]] : (!fir.ref<!fir.char<1,?>>) -> !llvm.ptr398! CHECK:    %[[VAL_20:.*]] = fir.convert %[[VAL_8]] : (!fir.ptr<!fir.char<1,?>>) -> !llvm.ptr399! CHECK:    "llvm.intr.memmove"(%[[VAL_19]], %[[VAL_20]], %{{.*}}) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()400! CHECK:    fir.result %[[VAL_11]] : !fir.ref<!fir.char<1,?>>401! CHECK:  } else {402! CHECK:    %[[VAL_30:.*]] = fir.absent !fir.ref<!fir.char<1,?>>403! CHECK:    fir.result %[[VAL_30]] : !fir.ref<!fir.char<1,?>>404! CHECK:  }405! CHECK:  %[[VAL_31:.*]] = fir.emboxchar %[[VAL_12]], %[[VAL_10]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>406! CHECK:  fir.call @_QPdyn_char(%[[VAL_31]]) {{.*}}: (!fir.boxchar<1>) -> ()407end subroutine408 409! CHECK-LABEL: func @_QMtestPtest_char_array(410! CHECK-SAME:  %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c", fir.optional}) {411subroutine test_char_array(c)412  integer(8) :: n413  character(*), optional :: c(:)414  call dyn_char_array(c, n)415! CHECK:         %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.array<?x!fir.char<1,?>>>416! CHECK:         %[[VAL_2:.*]] = fir.alloca i64 {bindc_name = "n", uniq_name = "_QMtestFtest_char_arrayEn"}417! CHECK:         %[[VAL_3:.*]] = fir.is_present %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> i1418! CHECK:         %[[VAL_4:.*]] = fir.zero_bits !fir.ref<!fir.array<?x!fir.char<1,?>>>419! CHECK:         %[[VAL_5:.*]] = arith.constant 0 : index420! CHECK:         %[[VAL_6:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>421! CHECK:         %[[VAL_7:.*]] = arith.constant 0 : index422! CHECK:         %[[VAL_8:.*]] = fir.embox %[[VAL_4]](%[[VAL_6]]) typeparams %[[VAL_7]] : (!fir.ref<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.array<?x!fir.char<1,?>>>423! CHECK:         %[[VAL_9:.*]] = arith.select %[[VAL_3]], %[[VAL_0]], %[[VAL_8]] : !fir.box<!fir.array<?x!fir.char<1,?>>>424! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.box<none>425! CHECK:         %[[VAL_11:.*]] = fir.call @_FortranAIsContiguous(%[[VAL_10]]) fastmath<contract> : (!fir.box<none>) -> i1426! CHECK:         %[[VAL_12:.*]] = fir.if %[[VAL_3]] -> (!fir.heap<!fir.array<?x!fir.char<1,?>>>) {427! CHECK:           %[[VAL_13:.*]] = fir.if %[[VAL_11]] -> (!fir.heap<!fir.array<?x!fir.char<1,?>>>) {428! CHECK:             %[[VAL_14:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.heap<!fir.array<?x!fir.char<1,?>>>429! CHECK:             fir.result %[[VAL_14]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>430! CHECK:           } else {431! CHECK:             %[[VAL_15:.*]] = arith.constant 0 : index432! CHECK:             %[[VAL_16:.*]]:3 = fir.box_dims %[[VAL_9]], %[[VAL_15]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>, index) -> (index, index, index)433! CHECK:             %[[VAL_17:.*]] = fir.box_elesize %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index434! CHECK:             %[[VAL_18:.*]] = fir.allocmem !fir.array<?x!fir.char<1,?>>(%[[VAL_17]] : index), %[[VAL_16]]#1 {uniq_name = ".copy"}435! CHECK:             %[[VAL_19:.*]] = fir.shape %[[VAL_16]]#1 : (index) -> !fir.shape<1>436! CHECK:             %[[VAL_20:.*]] = fir.embox %[[VAL_18]](%[[VAL_19]]) typeparams %[[VAL_17]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.array<?x!fir.char<1,?>>>437! CHECK:             fir.store %[[VAL_20]] to %[[VAL_1]] : !fir.ref<!fir.box<!fir.array<?x!fir.char<1,?>>>>438! CHECK:             %[[VAL_21:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{.*}}>>439! CHECK:             %[[VAL_22:.*]] = arith.constant {{.*}} : i32440! CHECK:             %[[VAL_23:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.box<!fir.array<?x!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>>441! CHECK:             %[[VAL_24:.*]] = fir.convert %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.box<none>442! CHECK:             %[[VAL_25:.*]] = fir.convert %[[VAL_21]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>443! CHECK:             fir.call @_FortranAAssignTemporary(%[[VAL_23]], %[[VAL_24]], %[[VAL_25]], %[[VAL_22]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.ref<i8>, i32) -> ()444! CHECK:             fir.result %[[VAL_18]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>445! CHECK:           }446! CHECK:           fir.result %[[VAL_27:.*]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>447! CHECK:         } else {448! CHECK:           %[[VAL_28:.*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.char<1,?>>>449! CHECK:           fir.result %[[VAL_28]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>450! CHECK:         }451! CHECK:         %[[VAL_29:.*]] = fir.box_elesize %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index452! CHECK:         %[[VAL_30:.*]] = arith.constant false453! CHECK:         %[[VAL_31:.*]] = arith.cmpi eq, %[[VAL_11]], %[[VAL_30]] : i1454! CHECK:         %[[VAL_32:.*]] = arith.andi %[[VAL_3]], %[[VAL_31]] : i1455! CHECK:         %[[VAL_33:.*]] = fir.convert %[[VAL_34:.*]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.char<1,?>>456! CHECK:         %[[VAL_35:.*]] = fir.emboxchar %[[VAL_33]], %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>457! CHECK:         fir.call @_QPdyn_char_array(%[[VAL_35]], %[[VAL_2]]) fastmath<contract> : (!fir.boxchar<1>, !fir.ref<i64>) -> ()458! CHECK:         fir.if %[[VAL_32]] {459! CHECK:          fir.zero460! CHECK:          fir.call @_FortranACopyOutAssign461! CHECK:         }462! CHECK:         return463! CHECK:       }464end subroutine465end466