1// RUN: %if aarch64-registered-target %{tco --target=aarch64-unknown-linux-gnu %s | FileCheck %s --check-prefixes=CHECK,CHECK-AARCH64 %} 2// RUN: %if x86-registered-target %{tco --target=x86_64-unknown-linux-gnu %s | FileCheck %s --check-prefixes=CHECK,CHECK-X86 %} 3// RUN: %if powerpc-registered-target %{tco --target=powerpc64le-unknown-linux-gnu %s | FileCheck %s --check-prefixes=CHECK,CHECK-PPC %} 4 5// CHECK-LABEL: define void @_QPtest_proc_dummy() 6// CHECK-AARCH64: %[[VAL_3:.*]] = alloca [36 x i8], i64 1, align 1 7// CHECK-X86: %[[VAL_3:.*]] = alloca [32 x i8], i64 1, align 1 8// CHECK-PPC: %[[VAL_3:.*]] = alloca [4{{[0-8]+}} x i8], i64 1, align 1 9// CHECK: %[[VAL_1:.*]] = alloca { ptr }, i64 1, align 8 10// CHECK: %[[VAL_0:.*]] = alloca i32, i64 1, align 4 11// CHECK: %[[VAL_2:.*]] = getelementptr { ptr }, ptr %[[VAL_1]], i32 0, i32 0 12// CHECK: store ptr %[[VAL_0]], ptr %[[VAL_2]], align 8 13// CHECK: store i32 1, ptr %[[VAL_0]], align 4 14// CHECK: call void @llvm.init.trampoline(ptr %[[VAL_3]], ptr @_QFtest_proc_dummyPtest_proc_dummy_a, ptr %[[VAL_1]]) 15// CHECK: %[[VAL_6:.*]] = call ptr @llvm.adjust.trampoline(ptr %[[VAL_3]]) 16// CHECK: call void @_QPtest_proc_dummy_other(ptr %[[VAL_6]]) 17 18// CHECK-LABEL: define void @_QFtest_proc_dummyPtest_proc_dummy_a(ptr 19// CHECK-SAME: captures(none) %[[VAL_0:.*]], ptr nest captures(none) %[[VAL_1:.*]]) 20 21// CHECK-LABEL: define void @_QPtest_proc_dummy_other(ptr 22// CHECK-SAME: %[[VAL_0:.*]]) 23// CHECK: call void %[[VAL_0]](ptr %{{.*}}) 24 25func.func @_QPtest_proc_dummy() { 26 %c0_i32 = arith.constant 0 : i32 27 %c1_i32 = arith.constant 1 : i32 28 %c-1_i32 = arith.constant -1 : i32 29 %c5_i32 = arith.constant 5 : i32 30 %0 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFtest_proc_dummyEi"} 31 %1 = fir.alloca tuple<!fir.ref<i32>> 32 %2 = fir.coordinate_of %1, %c0_i32 : (!fir.ref<tuple<!fir.ref<i32>>>, i32) -> !fir.llvm_ptr<!fir.ref<i32>> 33 fir.store %0 to %2 : !fir.llvm_ptr<!fir.ref<i32>> 34 fir.store %c1_i32 to %0 : !fir.ref<i32> 35 %3 = fir.address_of(@_QFtest_proc_dummyPtest_proc_dummy_a) : (!fir.ref<i32>, !fir.ref<tuple<!fir.ref<i32>>>) -> () 36 %4 = fir.emboxproc %3, %1 : ((!fir.ref<i32>, !fir.ref<tuple<!fir.ref<i32>>>) -> (), !fir.ref<tuple<!fir.ref<i32>>>) -> !fir.boxproc<() -> ()> 37 fir.call @_QPtest_proc_dummy_other(%4) : (!fir.boxproc<() -> ()>) -> () 38 %5 = fir.address_of(@_QQclX2E2F682E66393000) : !fir.ref<!fir.char<1,8>> 39 %6 = fir.convert %5 : (!fir.ref<!fir.char<1,8>>) -> !fir.ref<i8> 40 %7 = fir.call @_FortranAioBeginExternalListOutput(%c-1_i32, %6, %c5_i32) : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8> 41 %8 = fir.load %0 : !fir.ref<i32> 42 %9 = fir.call @_FortranAioOutputInteger32(%7, %8) : (!fir.ref<i8>, i32) -> i1 43 %10 = fir.call @_FortranAioEndIoStatement(%7) : (!fir.ref<i8>) -> i32 44 return 45} 46func.func @_QFtest_proc_dummyPtest_proc_dummy_a(%arg0: !fir.ref<i32> {fir.bindc_name = "j"}, %arg1: !fir.ref<tuple<!fir.ref<i32>>> {fir.host_assoc}) { 47 %c0_i32 = arith.constant 0 : i32 48 %0 = fir.coordinate_of %arg1, %c0_i32 : (!fir.ref<tuple<!fir.ref<i32>>>, i32) -> !fir.llvm_ptr<!fir.ref<i32>> 49 %1 = fir.load %0 : !fir.llvm_ptr<!fir.ref<i32>> 50 %2 = fir.load %1 : !fir.ref<i32> 51 %3 = fir.load %arg0 : !fir.ref<i32> 52 %4 = arith.addi %2, %3 : i32 53 fir.store %4 to %1 : !fir.ref<i32> 54 return 55} 56func.func @_QPtest_proc_dummy_other(%arg0: !fir.boxproc<() -> ()>) { 57 %c4_i32 = arith.constant 4 : i32 58 %0 = fir.alloca i32 {adapt.valuebyref} 59 fir.store %c4_i32 to %0 : !fir.ref<i32> 60 %1 = fir.box_addr %arg0 : (!fir.boxproc<() -> ()>) -> ((!fir.ref<i32>) -> ()) 61 fir.call %1(%0) : (!fir.ref<i32>) -> () 62 return 63} 64 65// CHECK-LABEL: define void @_QPtest_proc_dummy_char() 66// CHECK-AARCH64: %[[VAL_20:.*]] = alloca [36 x i8], i64 1, align 1 67// CHECK-X86: %[[VAL_20:.*]] = alloca [32 x i8], i64 1, align 1 68// CHECK-PPC: %[[VAL_20:.*]] = alloca [4{{[0-8]+}} x i8], i64 1, align 1 69// CHECK: %[[VAL_2:.*]] = alloca { { ptr, i64 } }, i64 1, align 8 70// CHECK: %[[VAL_1:.*]] = alloca [10 x i8], i64 1, align 1 71// CHECK: %[[VAL_0:.*]] = alloca [40 x i8], i64 1, align 1 72// CHECK: %[[VAL_3:.*]] = getelementptr { { ptr, i64 } }, ptr %[[VAL_2]], i32 0, i32 0 73// CHECK: %[[VAL_5:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_1]], 0 74// CHECK: %[[VAL_6:.*]] = insertvalue { ptr, i64 } %[[VAL_5]], i64 10, 1 75// CHECK: store { ptr, i64 } %[[VAL_6]], ptr %[[VAL_3]], align 8 76// CHECK: call void @llvm.memmove.p0.p0.i64(ptr %[[VAL_1]], ptr 77// CHECK: br label %[[VAL_8:.*]] 78// CHECK: %[[VAL_11:.*]] = phi 79// CHECK: %[[VAL_13:.*]] = phi 80// CHECK: %[[VAL_15:.*]] = icmp sgt i64 %[[VAL_13]], 0 81// CHECK: %[[VAL_18:.*]] = getelementptr [10 x [1 x i8]], ptr %[[VAL_1]], i32 0, i64 %[[VAL_11]] 82// CHECK: store [1 x i8] c" ", ptr %[[VAL_18]], align 1 83// CHECK: call void @llvm.init.trampoline(ptr %[[VAL_20]], ptr @_QFtest_proc_dummy_charPgen_message, ptr %[[VAL_2]]) 84// CHECK: %[[VAL_23:.*]] = call ptr @llvm.adjust.trampoline(ptr %[[VAL_20]]) 85// CHECK: %[[VAL_25:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_23]], 0 86// CHECK: %[[VAL_26:.*]] = insertvalue { ptr, i64 } %[[VAL_25]], i64 10, 1 87// CHECK: %[[VAL_27:.*]] = call ptr @llvm.stacksave.p0() 88// CHECK: %[[VAL_28:.*]] = extractvalue { ptr, i64 } %[[VAL_26]], 0 89// CHECK: %[[VAL_29:.*]] = extractvalue { ptr, i64 } %[[VAL_26]], 1 90// CHECK: %[[VAL_30:.*]] = call { ptr, i64 } @_QPget_message(ptr %[[VAL_0]], i64 40, ptr %[[VAL_28]], i64 %[[VAL_29]]) 91// CHECK: %[[VAL_32:.*]] = call i1 @_FortranAioOutputAscii(ptr %{{.*}}, ptr %[[VAL_0]], i64 40) 92// CHECK: call void @llvm.stackrestore.p0(ptr %[[VAL_27]]) 93 94// CHECK-LABEL: define { ptr, i64 } @_QFtest_proc_dummy_charPgen_message(ptr 95// CHECK-SAME: captures(none) %[[VAL_0:.*]], i64 %[[VAL_1:.*]], ptr nest captures(none) %[[VAL_2:.*]]) 96// CHECK: %[[VAL_3:.*]] = getelementptr { { ptr, i64 } }, ptr %[[VAL_2]], i32 0, i32 0 97// CHECK: %[[VAL_4:.*]] = load { ptr, i64 }, ptr %[[VAL_3]], align 8 98// CHECK: %[[VAL_5:.*]] = extractvalue { ptr, i64 } %[[VAL_4]], 0 99// CHECK: %[[VAL_6:.*]] = extractvalue { ptr, i64 } %[[VAL_4]], 1 100// CHECK: %[[VAL_8:.*]] = icmp sgt i64 %[[VAL_6]], 10 101// CHECK: %[[VAL_9:.*]] = select i1 %[[VAL_8]], i64 10, i64 %[[VAL_6]] 102// CHECK: call void @llvm.memmove.p0.p0.i64(ptr %[[VAL_0]], ptr %[[VAL_5]], i64 %[[VAL_9]], i1 false) 103// CHECK: %[[VAL_10:.*]] = sub i64 10, %[[VAL_9]] 104// CHECK: br label %[[VAL_11:.*]] 105// CHECK: %[[VAL_14:.*]] = phi i64 106// CHECK: %[[VAL_16:.*]] = phi i64 107// CHECK: %[[VAL_18:.*]] = icmp sgt i64 %[[VAL_16]], 0 108// CHECK: %[[VAL_21:.*]] = getelementptr [1 x i8], ptr %[[VAL_0]], i64 %[[VAL_14]] 109// CHECK: store [1 x i8] c" ", ptr %[[VAL_21]], align 1 110// CHECK: %[[VAL_22:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_0]], 0 111// CHECK: %[[VAL_23:.*]] = insertvalue { ptr, i64 } %[[VAL_22]], i64 10, 1 112// CHECK: ret { ptr, i64 } %[[VAL_23]] 113// CHECK: } 114 115// CHECK-LABEL: define { ptr, i64 } @_QPget_message(ptr 116// CHECK-SAME: %[[VAL_0:.*]], i64 %[[VAL_1:.*]], ptr %[[VAL_2:.*]], i64 117// CHECK-SAME: %[[VAL_3:.*]]) 118// CHECK: %[[VAL_4:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_2]], 0 119// CHECK: %[[VAL_5:.*]] = insertvalue { ptr, i64 } %[[VAL_4]], i64 %[[VAL_3]], 1 120// CHECK: %[[VAL_7:.*]] = extractvalue { ptr, i64 } %[[VAL_5]], 0 121// CHECK: %[[VAL_8:.*]] = extractvalue { ptr, i64 } %[[VAL_5]], 1 122// CHECK: %[[VAL_9:.*]] = call ptr @llvm.stacksave.p0() 123// CHECK: %[[VAL_10:.*]] = alloca i8, i64 %[[VAL_8]], align 1 124// CHECK: %[[VAL_12:.*]] = call { ptr, i64 } %[[VAL_7]](ptr %[[VAL_10]], i64 %[[VAL_8]]) 125// CHECK: %[[VAL_13:.*]] = add i64 %[[VAL_8]], 12 126// CHECK: %[[VAL_14:.*]] = alloca i8, i64 %[[VAL_13]], align 1 127// CHECK: call void @llvm.memmove.p0.p0.i64(ptr %[[VAL_14]], ptr {{.*}}, i64 12, i1 false) 128// CHECK: %[[VAL_18:.*]] = phi i64 129// CHECK: %[[VAL_20:.*]] = phi i64 130// CHECK: %[[VAL_22:.*]] = icmp sgt i64 %[[VAL_20]], 0 131// CHECK: %[[VAL_24:.*]] = sub i64 %[[VAL_18]], 12 132// CHECK: %[[VAL_26:.*]] = getelementptr [1 x i8], ptr %[[VAL_10]], i64 %[[VAL_24]] 133// CHECK: %[[VAL_27:.*]] = load [1 x i8], ptr %[[VAL_26]], align 1 134// CHECK: %[[VAL_29:.*]] = getelementptr [1 x i8], ptr %[[VAL_14]], i64 %[[VAL_18]] 135// CHECK: store [1 x i8] %[[VAL_27]], ptr %[[VAL_29]], align 1 136// CHECK: %[[VAL_30:.*]] = icmp sgt i64 %[[VAL_13]], 40 137// CHECK: %[[VAL_31:.*]] = select i1 %[[VAL_30]], i64 40, i64 %[[VAL_13]] 138// CHECK: call void @llvm.memmove.p0.p0.i64(ptr %[[VAL_0]], ptr %[[VAL_14]], i64 %[[VAL_31]], i1 false) 139// CHECK: %[[VAL_32:.*]] = sub i64 40, %[[VAL_31]] 140// CHECK: %[[VAL_35:.*]] = phi i64 141// CHECK: %[[VAL_37:.*]] = phi i64 142// CHECK: %[[VAL_39:.*]] = icmp sgt i64 %[[VAL_37]], 0 143// CHECK: %[[VAL_42:.*]] = getelementptr [1 x i8], ptr %[[VAL_0]], i64 %[[VAL_35]] 144// CHECK: store [1 x i8] c" ", ptr %[[VAL_42]], align 1 145// CHECK: call void @llvm.stackrestore.p0(ptr %[[VAL_9]]) 146// CHECK: %[[VAL_43:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_0]], 0 147// CHECK: %[[VAL_44:.*]] = insertvalue { ptr, i64 } %[[VAL_43]], i64 40, 1 148// CHECK: ret { ptr, i64 } %[[VAL_44]] 149// CHECK: } 150 151func.func @_QPtest_proc_dummy_char() { 152 %c10 = arith.constant 10 : index 153 %c0_i32 = arith.constant 0 : i32 154 %c9 = arith.constant 9 : index 155 %false = arith.constant false 156 %c1 = arith.constant 1 : index 157 %c32_i8 = arith.constant 32 : i8 158 %c-1_i32 = arith.constant -1 : i32 159 %c6_i32 = arith.constant 6 : i32 160 %c10_i64 = arith.constant 10 : i64 161 %c40 = arith.constant 40 : index 162 %c0 = arith.constant 0 : index 163 %0 = fir.alloca !fir.char<1,40> {bindc_name = ".result"} 164 %1 = fir.alloca !fir.char<1,10> {bindc_name = "message", uniq_name = "_QFtest_proc_dummy_charEmessage"} 165 %2 = fir.alloca tuple<!fir.boxchar<1>> 166 %3 = fir.coordinate_of %2, %c0_i32 : (!fir.ref<tuple<!fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>> 167 %4 = fir.convert %1 : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<!fir.char<1,?>> 168 %5 = fir.emboxchar %4, %c10 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 169 fir.store %5 to %3 : !fir.ref<!fir.boxchar<1>> 170 %6 = fir.address_of(@_QQclX486920746865726521) : !fir.ref<!fir.char<1,9>> 171 %7 = fir.convert %c9 : (index) -> i64 172 %8 = fir.convert %1 : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<i8> 173 %9 = fir.convert %6 : (!fir.ref<!fir.char<1,9>>) -> !fir.ref<i8> 174 fir.call @llvm.memmove.p0.p0.i64(%8, %9, %7, %false) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 175 %10 = fir.undefined !fir.char<1> 176 %11 = fir.insert_value %10, %c32_i8, [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 177 cf.br ^bb1(%c9, %c1 : index, index) 178^bb1(%12: index, %13: index): // 2 preds: ^bb0, ^bb2 179 %14 = arith.cmpi sgt, %13, %c0 : index 180 cf.cond_br %14, ^bb2, ^bb3 181^bb2: // pred: ^bb1 182 %15 = fir.convert %1 : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<!fir.array<10x!fir.char<1>>> 183 %16 = fir.coordinate_of %15, %12 : (!fir.ref<!fir.array<10x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 184 fir.store %11 to %16 : !fir.ref<!fir.char<1>> 185 %17 = arith.addi %12, %c1 : index 186 %18 = arith.subi %13, %c1 : index 187 cf.br ^bb1(%17, %18 : index, index) 188^bb3: // pred: ^bb1 189 %19 = fir.address_of(@_QQclX2E2F682E66393000) : !fir.ref<!fir.char<1,8>> 190 %20 = fir.convert %19 : (!fir.ref<!fir.char<1,8>>) -> !fir.ref<i8> 191 %21 = fir.call @_FortranAioBeginExternalListOutput(%c-1_i32, %20, %c6_i32) : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8> 192 %22 = fir.address_of(@_QFtest_proc_dummy_charPgen_message) : (!fir.ref<!fir.char<1,10>>, index, !fir.ref<tuple<!fir.boxchar<1>>>) -> !fir.boxchar<1> 193 %23 = fir.emboxproc %22, %2 : ((!fir.ref<!fir.char<1,10>>, index, !fir.ref<tuple<!fir.boxchar<1>>>) -> !fir.boxchar<1>, !fir.ref<tuple<!fir.boxchar<1>>>) -> !fir.boxproc<() -> ()> 194 %24 = fir.undefined tuple<!fir.boxproc<() -> ()>, i64> 195 %25 = fir.insert_value %24, %23, [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64> 196 %26 = fir.insert_value %25, %c10_i64, [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64> 197 %27 = fir.call @llvm.stacksave.p0() : () -> !fir.ref<i8> 198 %28 = fir.call @_QPget_message(%0, %c40, %26) : (!fir.ref<!fir.char<1,40>>, index, tuple<!fir.boxproc<() -> ()>, i64>) -> !fir.boxchar<1> 199 %29 = fir.convert %0 : (!fir.ref<!fir.char<1,40>>) -> !fir.ref<i8> 200 %30 = fir.convert %c40 : (index) -> i64 201 %31 = fir.call @_FortranAioOutputAscii(%21, %29, %30) : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1 202 fir.call @llvm.stackrestore.p0(%27) : (!fir.ref<i8>) -> () 203 %32 = fir.call @_FortranAioEndIoStatement(%21) : (!fir.ref<i8>) -> i32 204 return 205} 206func.func @_QFtest_proc_dummy_charPgen_message(%arg0: !fir.ref<!fir.char<1,10>>, %arg1: index, %arg2: !fir.ref<tuple<!fir.boxchar<1>>> {fir.host_assoc}) -> !fir.boxchar<1> { 207 %c0_i32 = arith.constant 0 : i32 208 %c10 = arith.constant 10 : index 209 %false = arith.constant false 210 %c1 = arith.constant 1 : index 211 %c32_i8 = arith.constant 32 : i8 212 %c0 = arith.constant 0 : index 213 %0 = fir.coordinate_of %arg2, %c0_i32 : (!fir.ref<tuple<!fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>> 214 %1 = fir.load %0 : !fir.ref<!fir.boxchar<1>> 215 %2:2 = fir.unboxchar %1 : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 216 %3 = fir.convert %arg0 : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<!fir.char<1,?>> 217 %4 = arith.cmpi slt, %c10, %2#1 : index 218 %5 = arith.select %4, %c10, %2#1 : index 219 %6 = fir.convert %5 : (index) -> i64 220 %7 = fir.convert %3 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 221 %8 = fir.convert %2#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 222 fir.call @llvm.memmove.p0.p0.i64(%7, %8, %6, %false) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 223 %9 = fir.undefined !fir.char<1> 224 %10 = fir.insert_value %9, %c32_i8, [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 225 %11 = arith.subi %c10, %5 : index 226 cf.br ^bb1(%5, %11 : index, index) 227^bb1(%12: index, %13: index): // 2 preds: ^bb0, ^bb2 228 %14 = arith.cmpi sgt, %13, %c0 : index 229 cf.cond_br %14, ^bb2, ^bb3 230^bb2: // pred: ^bb1 231 %15 = fir.convert %3 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 232 %16 = fir.coordinate_of %15, %12 : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 233 fir.store %10 to %16 : !fir.ref<!fir.char<1>> 234 %17 = arith.addi %12, %c1 : index 235 %18 = arith.subi %13, %c1 : index 236 cf.br ^bb1(%17, %18 : index, index) 237^bb3: // pred: ^bb1 238 %19 = fir.emboxchar %3, %c10 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 239 return %19 : !fir.boxchar<1> 240} 241func.func @_QPget_message(%arg0: !fir.ref<!fir.char<1,40>>, %arg1: index, %arg2: tuple<!fir.boxproc<() -> ()>, i64> {fir.char_proc}) -> !fir.boxchar<1> { 242 %c40 = arith.constant 40 : index 243 %c12 = arith.constant 12 : index 244 %false = arith.constant false 245 %c1 = arith.constant 1 : index 246 %c32_i8 = arith.constant 32 : i8 247 %c0 = arith.constant 0 : index 248 %0 = fir.convert %arg0 : (!fir.ref<!fir.char<1,40>>) -> !fir.ref<!fir.char<1,?>> 249 %1 = fir.address_of(@_QQclX6D6573736167652069733A20) : !fir.ref<!fir.char<1,12>> 250 %2 = fir.extract_value %arg2, [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>) -> !fir.boxproc<() -> ()> 251 %3 = fir.box_addr %2 : (!fir.boxproc<() -> ()>) -> (() -> ()) 252 %4 = fir.extract_value %arg2, [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>) -> i64 253 %5 = fir.call @llvm.stacksave.p0() : () -> !fir.ref<i8> 254 %6 = fir.alloca !fir.char<1,?>(%4 : i64) {bindc_name = ".result"} 255 %7 = fir.convert %3 : (() -> ()) -> ((!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>) 256 %8 = fir.convert %4 : (i64) -> index 257 %9 = fir.call %7(%6, %8) : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 258 %10 = arith.addi %8, %c12 : index 259 %11 = fir.alloca !fir.char<1,?>(%10 : index) {bindc_name = ".chrtmp"} 260 %12 = fir.convert %c12 : (index) -> i64 261 %13 = fir.convert %11 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 262 %14 = fir.convert %1 : (!fir.ref<!fir.char<1,12>>) -> !fir.ref<i8> 263 fir.call @llvm.memmove.p0.p0.i64(%13, %14, %12, %false) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 264 cf.br ^bb1(%c12, %8 : index, index) 265^bb1(%15: index, %16: index): // 2 preds: ^bb0, ^bb2 266 %17 = arith.cmpi sgt, %16, %c0 : index 267 cf.cond_br %17, ^bb2, ^bb3 268^bb2: // pred: ^bb1 269 %18 = arith.subi %15, %c12 : index 270 %19 = fir.convert %6 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 271 %20 = fir.coordinate_of %19, %18 : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 272 %21 = fir.load %20 : !fir.ref<!fir.char<1>> 273 %22 = fir.convert %11 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 274 %23 = fir.coordinate_of %22, %15 : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 275 fir.store %21 to %23 : !fir.ref<!fir.char<1>> 276 %24 = arith.addi %15, %c1 : index 277 %25 = arith.subi %16, %c1 : index 278 cf.br ^bb1(%24, %25 : index, index) 279^bb3: // pred: ^bb1 280 %26 = arith.cmpi slt, %c40, %10 : index 281 %27 = arith.select %26, %c40, %10 : index 282 %28 = fir.convert %27 : (index) -> i64 283 %29 = fir.convert %0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 284 fir.call @llvm.memmove.p0.p0.i64(%29, %13, %28, %false) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 285 %30 = fir.undefined !fir.char<1> 286 %31 = fir.insert_value %30, %c32_i8, [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 287 %32 = arith.subi %c40, %27 : index 288 cf.br ^bb4(%27, %32 : index, index) 289^bb4(%33: index, %34: index): // 2 preds: ^bb3, ^bb5 290 %35 = arith.cmpi sgt, %34, %c0 : index 291 cf.cond_br %35, ^bb5, ^bb6 292^bb5: // pred: ^bb4 293 %36 = fir.convert %0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 294 %37 = fir.coordinate_of %36, %33 : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 295 fir.store %31 to %37 : !fir.ref<!fir.char<1>> 296 %38 = arith.addi %33, %c1 : index 297 %39 = arith.subi %34, %c1 : index 298 cf.br ^bb4(%38, %39 : index, index) 299^bb6: // pred: ^bb4 300 fir.call @llvm.stackrestore.p0(%5) : (!fir.ref<i8>) -> () 301 %40 = fir.emboxchar %0, %c40 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 302 return %40 : !fir.boxchar<1> 303} 304fir.global linkonce @_QQclX486920746865726521 constant : !fir.char<1,9> { 305 %0 = fir.string_lit "Hi there!"(9) : !fir.char<1,9> 306 fir.has_value %0 : !fir.char<1,9> 307} 308func.func private @llvm.memmove.p0.p0.i64(!fir.ref<i8>, !fir.ref<i8>, i64, i1) 309fir.global linkonce @_QQclX2E2F682E66393000 constant : !fir.char<1,8> { 310 %0 = fir.string_lit "./h.f90\00"(8) : !fir.char<1,8> 311 fir.has_value %0 : !fir.char<1,8> 312} 313func.func private @llvm.stacksave.p0() -> !fir.ref<i8> 314func.func private @llvm.stackrestore.p0(!fir.ref<i8>) 315fir.global linkonce @_QQclX6D6573736167652069733A20 constant : !fir.char<1,12> { 316 %0 = fir.string_lit "message is: "(12) : !fir.char<1,12> 317 fir.has_value %0 : !fir.char<1,12> 318} 319 320func.func private @_FortranAioOutputAscii(!fir.ref<i8>, !fir.ref<i8>, i64) -> i1 attributes {fir.io, fir.runtime} 321func.func private @_FortranAioBeginExternalListOutput(i32, !fir.ref<i8>, i32) -> !fir.ref<i8> attributes {fir.io, fir.runtime} 322func.func private @_FortranAioOutputInteger32(!fir.ref<i8>, i32) -> i1 attributes {fir.io, fir.runtime} 323func.func private @_FortranAioEndIoStatement(!fir.ref<i8>) -> i32 attributes {fir.io, fir.runtime} 324