Skip to content

Commit bdbf927

Browse files
authored
[flang] Lower selected_logical_kind to its runtime call (#93091)
Runtime support has been added in #89691. This patch adds lowering in a similar way than `selected_int_kind` and `selected_real_kind`.
1 parent c98a799 commit bdbf927

File tree

5 files changed

+112
-0
lines changed

5 files changed

+112
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ struct IntrinsicLibrary {
334334
mlir::Value genScale(mlir::Type, llvm::ArrayRef<mlir::Value>);
335335
fir::ExtendedValue genScan(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
336336
mlir::Value genSelectedIntKind(mlir::Type, llvm::ArrayRef<mlir::Value>);
337+
mlir::Value genSelectedLogicalKind(mlir::Type, llvm::ArrayRef<mlir::Value>);
337338
mlir::Value genSelectedRealKind(mlir::Type, llvm::ArrayRef<mlir::Value>);
338339
mlir::Value genSetExponent(mlir::Type resultType,
339340
llvm::ArrayRef<mlir::Value> args);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ mlir::Value genScale(fir::FirOpBuilder &builder, mlir::Location loc,
5050
mlir::Value genSelectedIntKind(fir::FirOpBuilder &builder, mlir::Location loc,
5151
mlir::Value x);
5252

53+
/// Generate call to Selected_logical_kind intrinsic runtime routine.
54+
mlir::Value genSelectedLogicalKind(fir::FirOpBuilder &builder,
55+
mlir::Location loc, mlir::Value x);
56+
5357
/// Generate call to Selected_real_kind intrinsic runtime routine.
5458
mlir::Value genSelectedRealKind(fir::FirOpBuilder &builder, mlir::Location loc,
5559
mlir::Value precision, mlir::Value range,

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,10 @@ static constexpr IntrinsicHandler handlers[]{
553553
&I::genSelectedIntKind,
554554
{{{"scalar", asAddr}}},
555555
/*isElemental=*/false},
556+
{"selected_logical_kind",
557+
&I::genSelectedLogicalKind,
558+
{{{"bits", asAddr}}},
559+
/*isElemental=*/false},
556560
{"selected_real_kind",
557561
&I::genSelectedRealKind,
558562
{{{"precision", asAddr, handleDynamicOptional},
@@ -5884,6 +5888,17 @@ IntrinsicLibrary::genSelectedIntKind(mlir::Type resultType,
58845888
fir::runtime::genSelectedIntKind(builder, loc, fir::getBase(args[0])));
58855889
}
58865890

5891+
// SELECTED_LOGICAL_KIND
5892+
mlir::Value
5893+
IntrinsicLibrary::genSelectedLogicalKind(mlir::Type resultType,
5894+
llvm::ArrayRef<mlir::Value> args) {
5895+
assert(args.size() == 1);
5896+
5897+
return builder.createConvert(loc, resultType,
5898+
fir::runtime::genSelectedLogicalKind(
5899+
builder, loc, fir::getBase(args[0])));
5900+
}
5901+
58875902
// SELECTED_REAL_KIND
58885903
mlir::Value
58895904
IntrinsicLibrary::genSelectedRealKind(mlir::Type resultType,

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,27 @@ mlir::Value fir::runtime::genSelectedIntKind(fir::FirOpBuilder &builder,
489489
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
490490
}
491491

492+
/// Generate call to Selected_logical_kind intrinsic runtime routine.
493+
mlir::Value fir::runtime::genSelectedLogicalKind(fir::FirOpBuilder &builder,
494+
mlir::Location loc,
495+
mlir::Value x) {
496+
mlir::func::FuncOp func =
497+
fir::runtime::getRuntimeFunc<mkRTKey(SelectedLogicalKind)>(loc, builder);
498+
auto fTy = func.getFunctionType();
499+
auto sourceFile = fir::factory::locationToFilename(builder, loc);
500+
auto sourceLine =
501+
fir::factory::locationToLineNo(builder, loc, fTy.getInput(1));
502+
if (!fir::isa_ref_type(x.getType()))
503+
fir::emitFatalError(loc, "argument address for runtime not found");
504+
mlir::Type eleTy = fir::unwrapRefType(x.getType());
505+
mlir::Value xKind = builder.createIntegerConstant(
506+
loc, fTy.getInput(3), eleTy.getIntOrFloatBitWidth() / 8);
507+
auto args = fir::runtime::createArguments(builder, loc, fTy, sourceFile,
508+
sourceLine, x, xKind);
509+
510+
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
511+
}
512+
492513
/// Generate call to Selected_real_kind intrinsic runtime routine.
493514
mlir::Value fir::runtime::genSelectedRealKind(fir::FirOpBuilder &builder,
494515
mlir::Location loc,
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
2+
3+
subroutine selected_logical_kind_test1(input)
4+
integer(1) :: input, res
5+
res = selected_logical_kind(input)
6+
end
7+
8+
! CHECK-LABEL: func.func @_QPselected_logical_kind_test1(
9+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i8> {fir.bindc_name = "input"})
10+
! CHECK: %[[INPUT:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{.*}} {uniq_name = "_QFselected_logical_kind_test1Einput"} : (!fir.ref<i8>, !fir.dscope) -> (!fir.ref<i8>, !fir.ref<i8>)
11+
! CHECK: %[[RES_ALLOCA:.*]] = fir.alloca i8 {bindc_name = "res", uniq_name = "_QFselected_logical_kind_test1Eres"}
12+
! CHECK: %[[RES:.*]]:2 = hlfir.declare %[[RES_ALLOCA]] {uniq_name = "_QFselected_logical_kind_test1Eres"} : (!fir.ref<i8>) -> (!fir.ref<i8>, !fir.ref<i8>)
13+
! CHECK: %[[KIND:.*]] = arith.constant 1 : i32
14+
! CHECK: %[[INPUT_ADDR:.*]] = fir.convert %1#1 : (!fir.ref<i8>) -> !fir.llvm_ptr<i8>
15+
! CHECK: %{{.*}} = fir.call @_FortranASelectedLogicalKind(%{{.*}}, %{{.*}}, %[[INPUT_ADDR]], %[[KIND]]) fastmath<contract> : (!fir.ref<i8>, i32, !fir.llvm_ptr<i8>, i32) -> i32
16+
17+
subroutine selected_logical_kind_test2(input)
18+
integer(2) :: input, res
19+
res = selected_logical_kind(input)
20+
end
21+
22+
! CHECK-LABEL: func.func @_QPselected_logical_kind_test2(
23+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i16> {fir.bindc_name = "input"})
24+
! CHECK: %[[INPUT:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{.*}} {uniq_name = "_QFselected_logical_kind_test2Einput"} : (!fir.ref<i16>, !fir.dscope) -> (!fir.ref<i16>, !fir.ref<i16>)
25+
! CHECK: %[[RES_ALLOCA:.*]] = fir.alloca i16 {bindc_name = "res", uniq_name = "_QFselected_logical_kind_test2Eres"}
26+
! CHECK: %[[RES:.*]]:2 = hlfir.declare %[[RES_ALLOCA]] {uniq_name = "_QFselected_logical_kind_test2Eres"} : (!fir.ref<i16>) -> (!fir.ref<i16>, !fir.ref<i16>)
27+
! CHECK: %[[KIND:.*]] = arith.constant 2 : i32
28+
! CHECK: %[[INPUT_ADDR:.*]] = fir.convert %[[INPUT]]#1 : (!fir.ref<i16>) -> !fir.llvm_ptr<i8>
29+
! CHECK: %{{.*}} = fir.call @_FortranASelectedLogicalKind(%{{.*}}, %{{.*}}, %[[INPUT_ADDR]], %[[KIND]]) fastmath<contract> : (!fir.ref<i8>, i32, !fir.llvm_ptr<i8>, i32) -> i32
30+
31+
subroutine selected_logical_kind_test4(input)
32+
integer(4) :: input, res
33+
res = selected_logical_kind(input)
34+
end
35+
36+
! CHECK-LABEL: func.func @_QPselected_logical_kind_test4(
37+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32> {fir.bindc_name = "input"})
38+
! CHECK: %[[INPUT:.*]]:2 = hlfir.declare %arg0 dummy_scope %0 {uniq_name = "_QFselected_logical_kind_test4Einput"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
39+
! CHECK: %[[RES_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "res", uniq_name = "_QFselected_logical_kind_test4Eres"}
40+
! CHECK: %[[RES:.*]]:2 = hlfir.declare %[[RES_ALLOCA]] {uniq_name = "_QFselected_logical_kind_test4Eres"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
41+
! CHECK: %[[KIND:.*]] = arith.constant 4 : i32
42+
! CHECK: %[[INPUT_ADDR:.*]] = fir.convert %[[INPUT]]#1 : (!fir.ref<i32>) -> !fir.llvm_ptr<i8>
43+
! CHECK: %{{.*}} = fir.call @_FortranASelectedLogicalKind(%{{.*}}, %{{.*}}, %[[INPUT_ADDR]], %[[KIND]]) fastmath<contract> : (!fir.ref<i8>, i32, !fir.llvm_ptr<i8>, i32) -> i32
44+
45+
subroutine selected_logical_kind_test8(input)
46+
integer(8) :: input, res
47+
res = selected_logical_kind(input)
48+
end
49+
50+
! CHECK-LABEL: func.func @_QPselected_logical_kind_test8(
51+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i64> {fir.bindc_name = "input"})
52+
! CHECK: %[[INPUT:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{.*}} {uniq_name = "_QFselected_logical_kind_test8Einput"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
53+
! CHECK: %[[RES_ALLOCA]] = fir.alloca i64 {bindc_name = "res", uniq_name = "_QFselected_logical_kind_test8Eres"}
54+
! CHECK: %[[RES:.*]]:2 = hlfir.declare %[[RES_ALLOCA]] {uniq_name = "_QFselected_logical_kind_test8Eres"} : (!fir.ref<i64>) -> (!fir.ref<i64>, !fir.ref<i64>)
55+
! CHECK: %[[KIND:.*]] = arith.constant 8 : i32
56+
! CHECK: %[[INPUT_ADDR:.*]] = fir.convert %[[INPUT]]#1 : (!fir.ref<i64>) -> !fir.llvm_ptr<i8>
57+
! CHECK: %{{.*}} = fir.call @_FortranASelectedLogicalKind(%{{.*}}, %{{.*}}, %[[INPUT_ADDR]], %[[KIND]]) fastmath<contract> : (!fir.ref<i8>, i32, !fir.llvm_ptr<i8>, i32) -> i32
58+
59+
subroutine selected_logical_kind_test16(input)
60+
integer(16) :: input, res
61+
res = selected_logical_kind(input)
62+
end
63+
64+
! CHECK-LABEL: func.func @_QPselected_logical_kind_test16(
65+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i128> {fir.bindc_name = "input"})
66+
! CHECK: %[[INPUT:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{.*}} {uniq_name = "_QFselected_logical_kind_test16Einput"} : (!fir.ref<i128>, !fir.dscope) -> (!fir.ref<i128>, !fir.ref<i128>)
67+
! CHECK: %[[RES_ALLOCA:.*]] = fir.alloca i128 {bindc_name = "res", uniq_name = "_QFselected_logical_kind_test16Eres"}
68+
! CHECK: %[[RES:.*]]:2 = hlfir.declare %[[RES_ALLOCA]] {uniq_name = "_QFselected_logical_kind_test16Eres"} : (!fir.ref<i128>) -> (!fir.ref<i128>, !fir.ref<i128>)
69+
! CHECK: %[[KIND:.*]] = arith.constant 16 : i32
70+
! CHECK: %[[INPUT_ADDR:.*]] = fir.convert %[[INPUT]]#1 : (!fir.ref<i128>) -> !fir.llvm_ptr<i8>
71+
! CHECK: %{{.*}} = fir.call @_FortranASelectedLogicalKind(%{{.*}}, %{{.*}}, %[[INPUT_ADDR]], %[[KIND]]) fastmath<contract> : (!fir.ref<i8>, i32, !fir.llvm_ptr<i8>, i32) -> i32

0 commit comments

Comments
 (0)