brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.3 KiB · 97d9b38 Raw
324 lines · plain
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 [32 x i8], i64 1, align 17// CHECK-X86:     %[[VAL_3:.*]] = alloca [32 x i8], i64 1, align 18// CHECK-PPC:     %[[VAL_3:.*]] = alloca [4{{[0-8]+}} x i8], i64 1, align 19// CHECK:         %[[VAL_1:.*]] = alloca { ptr }, i64 1, align 810// CHECK:         %[[VAL_0:.*]] = alloca i32, i64 1, align 411// CHECK:         %[[VAL_2:.*]] = getelementptr { ptr }, ptr %[[VAL_1]], i32 0, i32 012// CHECK:         store ptr %[[VAL_0]], ptr %[[VAL_2]], align 813// CHECK:         store i32 1, ptr %[[VAL_0]], align 414// 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(ptr19// CHECK-SAME:              {{[^%]*}}%[[VAL_0:.*]], ptr nest {{[^%]*}}%[[VAL_1:.*]])20 21// CHECK-LABEL: define void @_QPtest_proc_dummy_other(ptr22// CHECK-SAME:              %[[VAL_0:.*]])23// CHECK:         call void %[[VAL_0]](ptr %{{.*}})24 25func.func @_QPtest_proc_dummy() {26  %c0_i32 = arith.constant 0 : i3227  %c1_i32 = arith.constant 1 : i3228  %c-1_i32 = arith.constant -1 : i3229  %c5_i32 = arith.constant 5 : i3230  %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) -> i143  %10 = fir.call @_FortranAioEndIoStatement(%7) : (!fir.ref<i8>) -> i3244  return45}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 : i3248  %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 : i3253  fir.store %4 to %1 : !fir.ref<i32>54  return55}56func.func @_QPtest_proc_dummy_other(%arg0: !fir.boxproc<() -> ()>) {57  %c4_i32 = arith.constant 4 : i3258  %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  return63}64 65// CHECK-LABEL: define void @_QPtest_proc_dummy_char()66// CHECK-AARCH64: %[[VAL_20:.*]] = alloca [32 x i8], i64 1, align 167// CHECK-X86:     %[[VAL_20:.*]] = alloca [32 x i8], i64 1, align 168// CHECK-PPC:     %[[VAL_20:.*]] = alloca [4{{[0-8]+}} x i8], i64 1, align 169// CHECK:         %[[VAL_2:.*]] = alloca { { ptr, i64 } }, i64 1, align 870// CHECK:         %[[VAL_1:.*]] = alloca [10 x i8], i64 1, align 171// CHECK:         %[[VAL_0:.*]] = alloca [40 x i8], i64 1, align 172// CHECK:         %[[VAL_3:.*]] = getelementptr { { ptr, i64 } }, ptr %[[VAL_2]], i32 0, i32 073// CHECK:         %[[VAL_5:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_1]], 074// CHECK:         %[[VAL_6:.*]] = insertvalue { ptr, i64 } %[[VAL_5]], i64 10, 175// CHECK:         store { ptr, i64 } %[[VAL_6]], ptr %[[VAL_3]], align 876// CHECK:         call void @llvm.memmove.p0.p0.i64(ptr %[[VAL_1]], ptr77// CHECK:         br label %[[VAL_8:.*]]78// CHECK:         %[[VAL_11:.*]] = phi79// CHECK:         %[[VAL_13:.*]] = phi80// CHECK:         %[[VAL_15:.*]] = icmp sgt i64 %[[VAL_13]], 081// 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 183// 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]], 086// CHECK:         %[[VAL_26:.*]] = insertvalue { ptr, i64 } %[[VAL_25]], i64 10, 187// CHECK:         %[[VAL_27:.*]] = call ptr @llvm.stacksave.p0()88// CHECK:         %[[VAL_28:.*]] = extractvalue { ptr, i64 } %[[VAL_26]], 089// CHECK:         %[[VAL_29:.*]] = extractvalue { ptr, i64 } %[[VAL_26]], 190// 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(ptr95// CHECK-SAME:                {{[^%]*}}%[[VAL_0:.*]], i64 %[[VAL_1:.*]], ptr nest {{[^%]*}}%[[VAL_2:.*]])96// CHECK:         %[[VAL_3:.*]] = getelementptr { { ptr, i64 } }, ptr %[[VAL_2]], i32 0, i32 097// CHECK:         %[[VAL_4:.*]] = load { ptr, i64 }, ptr %[[VAL_3]], align 898// CHECK:         %[[VAL_5:.*]] = extractvalue { ptr, i64 } %[[VAL_4]], 099// CHECK:         %[[VAL_6:.*]] = extractvalue { ptr, i64 } %[[VAL_4]], 1100// CHECK:         %[[VAL_8:.*]] = icmp sgt i64 %[[VAL_6]], 10101// 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 i64106// CHECK:         %[[VAL_16:.*]] = phi i64107// CHECK:         %[[VAL_18:.*]] = icmp sgt i64 %[[VAL_16]], 0108// CHECK:         %[[VAL_21:.*]] = getelementptr [1 x i8], ptr %[[VAL_0]], i64 %[[VAL_14]]109// CHECK:         store [1 x i8] c" ", ptr %[[VAL_21]], align 1110// CHECK:         %[[VAL_22:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_0]], 0111// CHECK:         %[[VAL_23:.*]] = insertvalue { ptr, i64 } %[[VAL_22]], i64 10, 1112// CHECK:         ret { ptr, i64 } %[[VAL_23]]113// CHECK:       }114 115// CHECK-LABEL: define { ptr, i64 } @_QPget_message(ptr116// CHECK-SAME:                  %[[VAL_0:.*]], i64 %[[VAL_1:.*]], ptr %[[VAL_2:.*]], i64117// CHECK-SAME:                                                 %[[VAL_3:.*]])118// CHECK:         %[[VAL_4:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_2]], 0119// CHECK:         %[[VAL_5:.*]] = insertvalue { ptr, i64 } %[[VAL_4]], i64 %[[VAL_3]], 1120// CHECK:         %[[VAL_7:.*]] = extractvalue { ptr, i64 } %[[VAL_5]], 0121// CHECK:         %[[VAL_8:.*]] = extractvalue { ptr, i64 } %[[VAL_5]], 1122// CHECK:         %[[VAL_9:.*]] = call ptr @llvm.stacksave.p0()123// CHECK:         %[[VAL_10:.*]] = alloca i8, i64 %[[VAL_8]], align 1124// CHECK:         %[[VAL_12:.*]] = call { ptr, i64 } %[[VAL_7]](ptr %[[VAL_10]], i64 %[[VAL_8]])125// CHECK:         %[[VAL_13:.*]] = add i64 %[[VAL_8]], 12126// CHECK:         %[[VAL_14:.*]] = alloca i8, i64 %[[VAL_13]], align 1127// CHECK:         call void @llvm.memmove.p0.p0.i64(ptr %[[VAL_14]], ptr {{.*}}, i64 12, i1 false)128// CHECK:         %[[VAL_18:.*]] = phi i64129// CHECK:         %[[VAL_20:.*]] = phi i64130// CHECK:         %[[VAL_22:.*]] = icmp sgt i64 %[[VAL_20]], 0131// CHECK:         %[[VAL_24:.*]] = sub i64 %[[VAL_18]], 12132// 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 1134// 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 1136// CHECK:         %[[VAL_30:.*]] = icmp sgt i64 %[[VAL_13]], 40137// 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 i64141// CHECK:         %[[VAL_37:.*]] = phi i64142// CHECK:         %[[VAL_39:.*]] = icmp sgt i64 %[[VAL_37]], 0143// CHECK:         %[[VAL_42:.*]] = getelementptr [1 x i8], ptr %[[VAL_0]], i64 %[[VAL_35]]144// CHECK:         store [1 x i8] c" ", ptr %[[VAL_42]], align 1145// CHECK:         call void @llvm.stackrestore.p0(ptr %[[VAL_9]])146// CHECK:         %[[VAL_43:.*]] = insertvalue { ptr, i64 } undef, ptr %[[VAL_0]], 0147// CHECK:         %[[VAL_44:.*]] = insertvalue { ptr, i64 } %[[VAL_43]], i64 40, 1148// CHECK:         ret { ptr, i64 } %[[VAL_44]]149// CHECK:       }150 151func.func @_QPtest_proc_dummy_char() {152  %c10 = arith.constant 10 : index153  %c0_i32 = arith.constant 0 : i32154  %c9 = arith.constant 9 : index155  %false = arith.constant false156  %c1 = arith.constant 1 : index157  %c32_i8 = arith.constant 32 : i8158  %c-1_i32 = arith.constant -1 : i32159  %c6_i32 = arith.constant 6 : i32160  %c10_i64 = arith.constant 10 : i64161  %c40 = arith.constant 40 : index162  %c0 = arith.constant 0 : index163  %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) -> i64172  %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, ^bb2179  %14 = arith.cmpi sgt, %13, %c0 : index180  cf.cond_br %14, ^bb2, ^bb3181^bb2:  // pred: ^bb1182  %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 : index186  %18 = arith.subi %13, %c1 : index187  cf.br ^bb1(%17, %18 : index, index)188^bb3:  // pred: ^bb1189  %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) -> i64201  %31 = fir.call @_FortranAioOutputAscii(%21, %29, %30) : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1202  fir.call @llvm.stackrestore.p0(%27) : (!fir.ref<i8>) -> ()203  %32 = fir.call @_FortranAioEndIoStatement(%21) : (!fir.ref<i8>) -> i32204  return205}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 : i32208  %c10 = arith.constant 10 : index209  %false = arith.constant false210  %c1 = arith.constant 1 : index211  %c32_i8 = arith.constant 32 : i8212  %c0 = arith.constant 0 : index213  %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 : index218  %5 = arith.select %4, %c10, %2#1 : index219  %6 = fir.convert %5 : (index) -> i64220  %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 : index226  cf.br ^bb1(%5, %11 : index, index)227^bb1(%12: index, %13: index):  // 2 preds: ^bb0, ^bb2228  %14 = arith.cmpi sgt, %13, %c0 : index229  cf.cond_br %14, ^bb2, ^bb3230^bb2:  // pred: ^bb1231  %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 : index235  %18 = arith.subi %13, %c1 : index236  cf.br ^bb1(%17, %18 : index, index)237^bb3:  // pred: ^bb1238  %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 : index243  %c12 = arith.constant 12 : index244  %false = arith.constant false245  %c1 = arith.constant 1 : index246  %c32_i8 = arith.constant 32 : i8247  %c0 = arith.constant 0 : index248  %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>) -> i64253  %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) -> index257  %9 = fir.call %7(%6, %8) : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>258  %10 = arith.addi %8, %c12 : index259  %11 = fir.alloca !fir.char<1,?>(%10 : index) {bindc_name = ".chrtmp"}260  %12 = fir.convert %c12 : (index) -> i64261  %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, ^bb2266  %17 = arith.cmpi sgt, %16, %c0 : index267  cf.cond_br %17, ^bb2, ^bb3268^bb2:  // pred: ^bb1269  %18 = arith.subi %15, %c12 : index270  %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 : index277  %25 = arith.subi %16, %c1 : index278  cf.br ^bb1(%24, %25 : index, index)279^bb3:  // pred: ^bb1280  %26 = arith.cmpi slt, %c40, %10 : index281  %27 = arith.select %26, %c40, %10 : index282  %28 = fir.convert %27 : (index) -> i64283  %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 : index288  cf.br ^bb4(%27, %32 : index, index)289^bb4(%33: index, %34: index):  // 2 preds: ^bb3, ^bb5290  %35 = arith.cmpi sgt, %34, %c0 : index291  cf.cond_br %35, ^bb5, ^bb6292^bb5:  // pred: ^bb4293  %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 : index297  %39 = arith.subi %34, %c1 : index298  cf.br ^bb4(%38, %39 : index, index)299^bb6:  // pred: ^bb4300  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