1*f35f863aSjeanPerier! RUN: bbc --use-desc-for-alloc=false %s -o - -emit-fir -hlfir=false | FileCheck %s 2c1e72963SValentin Clement 3c1e72963SValentin Clement! Simple character assignment tests 4c1e72963SValentin Clement! CHECK-LABEL: _QPassign1 5c1e72963SValentin Clementsubroutine assign1(lhs, rhs) 6c1e72963SValentin Clement character(*, 1) :: lhs, rhs 7c1e72963SValentin Clement ! CHECK: %[[lhs:.*]]:2 = fir.unboxchar %arg0 8c1e72963SValentin Clement ! CHECK: %[[rhs:.*]]:2 = fir.unboxchar %arg1 9c1e72963SValentin Clement lhs = rhs 10c1e72963SValentin Clement ! Compute minimum length 11c1e72963SValentin Clement ! CHECK: %[[cmp_len:[0-9]+]] = arith.cmpi slt, %[[lhs:.*]]#1, %[[rhs:.*]]#1 12c1e72963SValentin Clement ! CHECK-NEXT: %[[min_len:[0-9]+]] = arith.select %[[cmp_len]], %[[lhs]]#1, %[[rhs]]#1 13c1e72963SValentin Clement 14c1e72963SValentin Clement ! Copy of rhs into lhs 15c1e72963SValentin Clement ! CHECK: %[[count:.*]] = arith.muli %{{.*}}, %{{.*}} : i64 16c1e72963SValentin Clement ! CHECK-DAG: %[[bug:.*]] = fir.convert %[[lhs]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 17c1e72963SValentin Clement ! CHECK-DAG: %[[src:.*]] = fir.convert %[[rhs]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 184cc9437aSTom Eccles ! CHECK: fir.call @llvm.memmove.p0.p0.i64(%{{.*}}, %[[src]], %[[count]], %false) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 19c1e72963SValentin Clement 20c1e72963SValentin Clement ! Padding 21c1e72963SValentin Clement ! CHECK-DAG: %[[blank:.*]] = fir.insert_value %{{.*}}, %c32{{.*}}, [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 22c1e72963SValentin Clement ! CHECK: fir.do_loop %[[ij:.*]] = 23c1e72963SValentin Clement ! CHECK-DAG: %[[lhs_cast:.*]] = fir.convert %[[lhs]]#0 24c1e72963SValentin Clement ! CHECK: %[[lhs_addr:.*]] = fir.coordinate_of %[[lhs_cast]], %[[ij]] 25c1e72963SValentin Clement ! CHECK: fir.store %[[blank]] to %[[lhs_addr]] 26c1e72963SValentin Clement ! CHECK-NEXT: } 27c1e72963SValentin Clementend subroutine 28c1e72963SValentin Clement 29c1e72963SValentin Clement! Test substring assignment 30c1e72963SValentin Clement! CHECK-LABEL: _QPassign_substring1 31c1e72963SValentin Clementsubroutine assign_substring1(str, rhs, lb, ub) 32c1e72963SValentin Clement character(*, 1) :: rhs, str 33c1e72963SValentin Clement integer(8) :: lb, ub 34c1e72963SValentin Clement str(lb:ub) = rhs 35c1e72963SValentin Clement ! CHECK-DAG: %[[lb:.*]] = fir.load %arg2 36c1e72963SValentin Clement ! CHECK-DAG: %[[ub:.*]] = fir.load %arg3 37c1e72963SValentin Clement ! CHECK-DAG: %[[str:.*]]:2 = fir.unboxchar %arg0 38c1e72963SValentin Clement 39c1e72963SValentin Clement ! Compute substring offset 40c1e72963SValentin Clement ! CHECK-DAG: %[[lbi:.*]] = fir.convert %[[lb]] : (i64) -> index 41c1e72963SValentin Clement ! CHECK-DAG: %[[c1:.*]] = arith.constant 1 42c1e72963SValentin Clement ! CHECK-DAG: %[[offset:.*]] = arith.subi %[[lbi]], %[[c1]] 43c1e72963SValentin Clement ! CHECK-DAG: %[[str_cast:.*]] = fir.convert %[[str]]#0 44c1e72963SValentin Clement ! CHECK-DAG: %[[str_addr:.*]] = fir.coordinate_of %[[str_cast]], %[[offset]] 45c1e72963SValentin Clement ! CHECK-DAG: %[[lhs_addr:.*]] = fir.convert %[[str_addr]] 46c1e72963SValentin Clement 47c1e72963SValentin Clement ! Compute substring length 48c1e72963SValentin Clement ! CHECK-DAG: %[[ubi:.*]] = fir.convert %[[ub]] : (i64) -> index 49c1e72963SValentin Clement ! CHECK-DAG: %[[diff:.*]] = arith.subi %[[ubi]], %[[lbi]] 50c1e72963SValentin Clement ! CHECK-DAG: %[[pre_lhs_len:.*]] = arith.addi %[[diff]], %[[c1]] 51c1e72963SValentin Clement ! CHECK-DAG: %[[c0:.*]] = arith.constant 0 52c1e72963SValentin Clement ! CHECK-DAG: %[[cmp_len:.*]] = arith.cmpi slt, %[[pre_lhs_len]], %[[c0]] 53c1e72963SValentin Clement 54c1e72963SValentin Clement ! CHECK-DAG: %[[lhs_len:.*]] = arith.select %[[cmp_len]], %[[c0]], %[[pre_lhs_len]] 55c1e72963SValentin Clement 56c1e72963SValentin Clement ! The rest of the assignment is just as the one above, only test that the 57c1e72963SValentin Clement ! substring is the one used as lhs. 58c1e72963SValentin Clement ! ... 59c1e72963SValentin Clement ! CHECK: fir.do_loop %arg4 = 60c1e72963SValentin Clement ! CHECK: %[[lhs_addr3:.*]] = fir.convert %[[lhs_addr]] 61c1e72963SValentin Clement ! CHECK: fir.coordinate_of %[[lhs_addr3]], %arg4 62c1e72963SValentin Clement ! ... 63c1e72963SValentin Clementend subroutine 64c1e72963SValentin Clement 65c1e72963SValentin Clement! CHECK-LABEL: _QPassign_constant 66c1e72963SValentin Clement! CHECK-SAME: (%[[ARG:.*]]: 67c1e72963SValentin Clementsubroutine assign_constant(lhs) 68c1e72963SValentin Clement character(*, 1) :: lhs 69c1e72963SValentin Clement ! CHECK: %[[lhs:.*]]:2 = fir.unboxchar %arg0 70c1e72963SValentin Clement ! CHECK: %[[cst:.*]] = fir.address_of(@{{.*}}) : 71c1e72963SValentin Clement lhs = "Hello World" 72c1e72963SValentin Clement ! CHECK-DAG: %[[dst:.*]] = fir.convert %[[lhs]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 73c1e72963SValentin Clement ! CHECK-DAG: %[[src:.*]] = fir.convert %[[cst]] : (!fir.ref<!fir.char<1,11>>) -> !fir.ref<i8> 74c1e72963SValentin Clement ! CHECK-DAG: %[[count:.*]] = arith.muli %{{.*}}, %{{.*}} : i64 754cc9437aSTom Eccles ! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[dst]], %[[src]], %[[count]], %false) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 76c1e72963SValentin Clement 77c1e72963SValentin Clement ! Padding 78c1e72963SValentin Clement ! CHECK-DAG: %[[blank:.*]] = fir.insert_value %{{.*}}, %c32{{.*}}, [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 79c1e72963SValentin Clement ! CHECK: fir.do_loop %[[j:.*]] = %{{.*}} to %{{.*}} { 80c1e72963SValentin Clement ! CHECK-DAG: %[[jhs_cast:.*]] = fir.convert %[[lhs]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 81c1e72963SValentin Clement ! CHECK: %[[jhs_addr:.*]] = fir.coordinate_of %[[jhs_cast]], %[[j]] 82c1e72963SValentin Clement ! CHECK: fir.store %[[blank]] to %[[jhs_addr]] 83c1e72963SValentin Clement ! CHECK: } 84c1e72963SValentin Clementend subroutine 85c1e72963SValentin Clement 86c1e72963SValentin Clement ! CHECK: func @_QPassign_zero_size_array 87c1e72963SValentin Clement subroutine assign_zero_size_array(n) 88c1e72963SValentin Clement ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.heap<!fir.array<?x!fir.char<1,?>>> {uniq_name = "_QFassign_zero_size_arrayEa.addr"} 89c1e72963SValentin Clement character(n), allocatable :: a(:) 90c1e72963SValentin Clement ! CHECK: fir.store %{{.*}} to %[[VAL_0]] : !fir.ref<!fir.heap<!fir.array<?x!fir.char<1,?>>>> 91c1e72963SValentin Clement ! CHECK: %{{.*}} = fir.load %[[VAL_0]] : !fir.ref<!fir.heap<!fir.array<?x!fir.char<1,?>>>> 92c1e72963SValentin Clement ! CHECK: %[[VAL_1:.*]] = arith.cmpi ne, %{{.*}}, %c0{{.*}} : i64 93c1e72963SValentin Clement ! CHECK: %[[VAL_2:.*]]:2 = fir.if %[[VAL_1]] -> (i1, !fir.heap<!fir.array<?x!fir.char<1,?>>>) { 94c1e72963SValentin Clement ! CHECK: %{{.*}} = fir.if %{{.*}} -> (!fir.heap<!fir.array<?x!fir.char<1,?>>>) { 95c1e72963SValentin Clement ! CHECK: %{{.*}} = fir.do_loop %{{.*}} = %c0{{.*}} to %{{.*}} step %c1{{.*}} unordered iter_args(%{{.*}} = %{{.*}}) -> (!fir.array<?x!fir.char<1,?>>) { 96c1e72963SValentin Clement ! CHECK: fir.do_loop %[[ARG_0:.*]] = %{{.*}} to {{.*}} step %c1{{.*}} { 97c1e72963SValentin Clement ! CHECK: %{{.*}} = fir.coordinate_of %{{.*}}, %[[ARG_0]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 98c1e72963SValentin Clement ! CHECK: fir.if %[[VAL_2]]#0 { 99c1e72963SValentin Clement ! CHECK: fir.if %[[VAL_1]] { 100c1e72963SValentin Clement ! CHECK: fir.store %[[VAL_2]]#1 to %[[VAL_0]] : !fir.ref<!fir.heap<!fir.array<?x!fir.char<1,?>>>> 101c1e72963SValentin Clement a = [character(n)::] 102c1e72963SValentin Clement ! CHECK: return 103c1e72963SValentin Clement end subroutine 104c1e72963SValentin Clement 105fd389f46SFabian Mora! CHECK-LABEL: fir.global linkonce @_QQclX48656C6C6F20576F726C64 106c1e72963SValentin Clement! CHECK: %[[lit:.*]] = fir.string_lit "Hello World"(11) : !fir.char<1,11> 107c1e72963SValentin Clement! CHECK: fir.has_value %[[lit]] : !fir.char<1,11> 108c1e72963SValentin Clement! CHECK: } 109