Skip to content

Commit 2a299e4

Browse files
committed
[fir] Add fir.select_type conversion placeholder
As for D113662, this patch just add a place holder for the `fir.select_type` operation conversion. This operation is part of F20xx and is not implemented yet. This patch is part of the upstreaming effort from fir-dev branch. Reviewed By: kiranchandramohan Differential Revision: https://reviews.llvm.org/D113878
1 parent 112c1c3 commit 2a299e4

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,19 @@ struct LoadOpConversion : public FIROpConversion<fir::LoadOp> {
930930
}
931931
};
932932

933+
/// Lower `fir.select_type` to LLVM IR dialect.
934+
struct SelectTypeOpConversion : public FIROpConversion<fir::SelectTypeOp> {
935+
using FIROpConversion::FIROpConversion;
936+
937+
mlir::LogicalResult
938+
matchAndRewrite(fir::SelectTypeOp select, OpAdaptor adaptor,
939+
mlir::ConversionPatternRewriter &rewriter) const override {
940+
return rewriter.notifyMatchFailure(
941+
select, "fir.select_type codegen is not implemented yet");
942+
return failure();
943+
}
944+
};
945+
933946
/// conversion of fir::SelectRankOp to an if-then-else ladder
934947
struct SelectRankOpConversion : public FIROpConversion<fir::SelectRankOp> {
935948
using FIROpConversion::FIROpConversion;
@@ -1456,9 +1469,9 @@ class FIRToLLVMLowering : public fir::FIRToLLVMLoweringBase<FIRToLLVMLowering> {
14561469
InsertOnRangeOpConversion, InsertValueOpConversion,
14571470
IsPresentOpConversion, LoadOpConversion, NegcOpConversion,
14581471
MulcOpConversion, SelectCaseOpConversion, SelectOpConversion,
1459-
SelectRankOpConversion, StoreOpConversion, SubcOpConversion,
1460-
UndefOpConversion, UnreachableOpConversion, ZeroOpConversion>(
1461-
typeConverter);
1472+
SelectRankOpConversion, SelectTypeOpConversion, StoreOpConversion,
1473+
SubcOpConversion, UndefOpConversion, UnreachableOpConversion,
1474+
ZeroOpConversion>(typeConverter);
14621475
mlir::populateStdToLLVMConversionPatterns(typeConverter, pattern);
14631476
mlir::arith::populateArithmeticToLLVMConversionPatterns(typeConverter,
14641477
pattern);

flang/test/Fir/convert-to-llvm-invalid.fir

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,25 @@ func @select_case_charachter(%arg0: !fir.char<2, 10>, %arg1: !fir.char<2, 10>, %
5050
^bb3:
5151
return
5252
}
53+
54+
// -----
55+
56+
// Test `fir.select_type` conversion failure. Not implemented yet.
57+
58+
func @bar_select_type(%arg : !fir.box<!fir.type<derived3{f:f32}>>) -> i32 {
59+
%0 = arith.constant 1 : i32
60+
%2 = arith.constant 3 : i32
61+
62+
// expected-error@+1{{failed to legalize operation 'fir.select_type'}}
63+
fir.select_type %arg : !fir.box<!fir.type<derived3{f:f32}>> [
64+
#fir.instance<!fir.int<4>>,^bb1(%0:i32),
65+
#fir.instance<!fir.int<8>>,^bb2(%2:i32),
66+
unit,^bb5 ]
67+
^bb1(%a : i32) :
68+
return %a : i32
69+
^bb2(%b : i32) :
70+
return %b : i32
71+
^bb5 :
72+
%zero = arith.constant 0 : i32
73+
return %zero : i32
74+
}

0 commit comments

Comments
 (0)