Skip to content

Commit 66db7c6

Browse files
authored
[flang] Lower selected_char_kind to runtime call (#93095)
Runtime support has been added in #89691. This patch adds lowering in a similar way than `selected_int_kind`, `selected_real_kind` and `selected_logical_kind` added in #93091. Some gfortran tests can be enabled after this patch is landed. - `Fortran/gfortran/regression/selected_char_kind_1.f90` - `Fortran/gfortran/regression/selected_char_kind_4.f90`
1 parent bdbf927 commit 66db7c6

File tree

5 files changed

+59
-0
lines changed

5 files changed

+59
-0
lines changed

flang/include/flang/Optimizer/Builder/IntrinsicCall.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,8 @@ struct IntrinsicLibrary {
333333
llvm::ArrayRef<fir::ExtendedValue>);
334334
mlir::Value genScale(mlir::Type, llvm::ArrayRef<mlir::Value>);
335335
fir::ExtendedValue genScan(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
336+
fir::ExtendedValue genSelectedCharKind(mlir::Type,
337+
llvm::ArrayRef<fir::ExtendedValue>);
336338
mlir::Value genSelectedIntKind(mlir::Type, llvm::ArrayRef<mlir::Value>);
337339
mlir::Value genSelectedLogicalKind(mlir::Type, llvm::ArrayRef<mlir::Value>);
338340
mlir::Value genSelectedRealKind(mlir::Type, llvm::ArrayRef<mlir::Value>);

flang/include/flang/Optimizer/Builder/Runtime/Numeric.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ mlir::Value genRRSpacing(fir::FirOpBuilder &builder, mlir::Location loc,
4646
mlir::Value genScale(fir::FirOpBuilder &builder, mlir::Location loc,
4747
mlir::Value x, mlir::Value i);
4848

49+
/// Generate call to Selected_char_kind intrinsic runtime routine.
50+
mlir::Value genSelectedCharKind(fir::FirOpBuilder &builder, mlir::Location loc,
51+
mlir::Value name, mlir::Value length);
52+
4953
/// Generate call to Selected_int_kind intrinsic runtime routine.
5054
mlir::Value genSelectedIntKind(fir::FirOpBuilder &builder, mlir::Location loc,
5155
mlir::Value x);

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,10 @@ static constexpr IntrinsicHandler handlers[]{
549549
{"back", asValue, handleDynamicOptional},
550550
{"kind", asValue}}},
551551
/*isElemental=*/true},
552+
{"selected_char_kind",
553+
&I::genSelectedCharKind,
554+
{{{"name", asAddr}}},
555+
/*isElemental=*/false},
552556
{"selected_int_kind",
553557
&I::genSelectedIntKind,
554558
{{{"scalar", asAddr}}},
@@ -5877,6 +5881,18 @@ IntrinsicLibrary::genScan(mlir::Type resultType,
58775881
return readAndAddCleanUp(resultMutableBox, resultType, "SCAN");
58785882
}
58795883

5884+
// SELECTED_CHAR_KIND
5885+
fir::ExtendedValue
5886+
IntrinsicLibrary::genSelectedCharKind(mlir::Type resultType,
5887+
llvm::ArrayRef<fir::ExtendedValue> args) {
5888+
assert(args.size() == 1);
5889+
5890+
return builder.createConvert(
5891+
loc, resultType,
5892+
fir::runtime::genSelectedCharKind(builder, loc, fir::getBase(args[0]),
5893+
fir::getLen(args[0])));
5894+
}
5895+
58805896
// SELECTED_INT_KIND
58815897
mlir::Value
58825898
IntrinsicLibrary::genSelectedIntKind(mlir::Type resultType,

flang/lib/Optimizer/Builder/Runtime/Numeric.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,26 @@ mlir::Value fir::runtime::genScale(fir::FirOpBuilder &builder,
468468
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
469469
}
470470

471+
/// Generate call to Selected_char_kind intrinsic runtime routine.
472+
mlir::Value fir::runtime::genSelectedCharKind(fir::FirOpBuilder &builder,
473+
mlir::Location loc,
474+
mlir::Value name,
475+
mlir::Value length) {
476+
mlir::func::FuncOp func =
477+
fir::runtime::getRuntimeFunc<mkRTKey(SelectedCharKind)>(loc, builder);
478+
auto fTy = func.getFunctionType();
479+
auto sourceFile = fir::factory::locationToFilename(builder, loc);
480+
auto sourceLine =
481+
fir::factory::locationToLineNo(builder, loc, fTy.getInput(1));
482+
if (!fir::isa_ref_type(name.getType()))
483+
fir::emitFatalError(loc, "argument address for runtime not found");
484+
485+
auto args = fir::runtime::createArguments(builder, loc, fTy, sourceFile,
486+
sourceLine, name, length);
487+
488+
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
489+
}
490+
471491
/// Generate call to Selected_int_kind intrinsic runtime routine.
472492
mlir::Value fir::runtime::genSelectedIntKind(fir::FirOpBuilder &builder,
473493
mlir::Location loc,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
2+
3+
subroutine selected_char_kind_test(c)
4+
character(*) :: c
5+
integer :: res
6+
res = selected_char_kind(c)
7+
end
8+
9+
! CHECK-LABEL: func.func @_QPselected_char_kind_test(
10+
! CHECK-SAME: %[[ARG0:.*]]: !fir.boxchar<1> {fir.bindc_name = "c"})
11+
! CHECK: %[[UNBOXCHAR:.*]]:2 = fir.unboxchar %[[ARG0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
12+
! CHECK: %[[C:.*]]:2 = hlfir.declare %[[UNBOXCHAR]]#0 typeparams %[[UNBOXCHAR]]#1 dummy_scope %0 {uniq_name = "_QFselected_char_kind_testEc"} : (!fir.ref<!fir.char<1,?>>, index, !fir.dscope) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
13+
! CHECK: %[[RES_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "res", uniq_name = "_QFselected_char_kind_testEres"}
14+
! CHECK: %[[RES:.*]]:2 = hlfir.declare %[[RES_ALLOCA]] {uniq_name = "_QFselected_char_kind_testEres"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
15+
! CHECK: %[[CHAR_PTR:.*]] = fir.convert %[[C]]#1 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
16+
! CHECK: %[[CHAR_LEN:.*]] = fir.convert %[[UNBOXCHAR]]#1 : (index) -> i64
17+
! CHECK: %{{.*}} = fir.call @_FortranASelectedCharKind(%{{.*}}, %{{.*}}, %[[CHAR_PTR]], %[[CHAR_LEN]]) fastmath<contract> : (!fir.ref<i8>, i32, !fir.ref<i8>, i64) -> i32

0 commit comments

Comments
 (0)