[fir] Add fir.gentypedesc conversion

Add conversion pattern for the GenTypeDescOp.
Convert to a global constant with an addressof.

This patch is part of the upstreaming effort from fir-dev branch.

Reviewed By: kiranchandramohan

Differential Revision: https://reviews.llvm.org/D113766

Co-authored-by: Eric Schweitz <eschweitz@nvidia.com>
Co-authored-by: Jean Perier <jperier@nvidia.com>
This commit is contained in:
Valentin Clement 2021-11-16 14:37:05 +01:00
parent 374cd0fb61
commit 3124618704
No known key found for this signature in database
GPG Key ID: 086D54783C928776
2 changed files with 29 additions and 8 deletions

View File

@ -694,6 +694,18 @@ struct GlobalLenOpConversion : public FIROpConversion<fir::GlobalLenOp> {
}
};
/// Lower `fir.gentypedesc` to a global constant.
struct GenTypeDescOpConversion : public FIROpConversion<fir::GenTypeDescOp> {
using FIROpConversion::FIROpConversion;
mlir::LogicalResult
matchAndRewrite(fir::GenTypeDescOp gentypedesc, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const override {
return rewriter.notifyMatchFailure(
gentypedesc, "fir.fir.gentypedesc codegen is not implemented yet");
}
};
/// Lower `fir.has_value` operation to `llvm.return` operation.
struct HasValueOpConversion : public FIROpConversion<fir::HasValueOp> {
using FIROpConversion::FIROpConversion;
@ -1563,14 +1575,13 @@ public:
CmpcOpConversion, ConvertOpConversion, DispatchOpConversion,
DispatchTableOpConversion, DTEntryOpConversion, DivcOpConversion,
EmboxCharOpConversion, ExtractValueOpConversion, HasValueOpConversion,
GlobalLenOpConversion, GlobalOpConversion, InsertOnRangeOpConversion,
InsertValueOpConversion, IsPresentOpConversion, LoadOpConversion,
NegcOpConversion, MulcOpConversion, SelectCaseOpConversion,
SelectOpConversion, SelectRankOpConversion, SelectTypeOpConversion,
StoreOpConversion, SubcOpConversion, UnboxCharOpConversion,
UndefOpConversion, UnreachableOpConversion, ZeroOpConversion>(
typeConverter);
GenTypeDescOpConversion, GlobalLenOpConversion, GlobalOpConversion,
InsertOnRangeOpConversion, InsertValueOpConversion,
IsPresentOpConversion, LoadOpConversion, NegcOpConversion,
MulcOpConversion, SelectCaseOpConversion, SelectOpConversion,
SelectRankOpConversion, SelectTypeOpConversion, StoreOpConversion,
SubcOpConversion, UnboxCharOpConversion, UndefOpConversion,
UnreachableOpConversion, ZeroOpConversion>(typeConverter);
mlir::populateStdToLLVMConversionPatterns(typeConverter, pattern);
mlir::arith::populateArithmeticToLLVMConversionPatterns(typeConverter,
pattern);

View File

@ -83,3 +83,13 @@ fir.global @global_derived : !fir.type<minez(f:i32)> {
%0 = fir.undefined !fir.type<minez>
fir.has_value %0 : !fir.type<minez>
}
// -----
// Test `fir.gentypedesc` conversion failure. Not implemented yet.
func @gentypedesc() {
// expected-error@+1{{failed to legalize operation 'fir.gentypedesc'}}
%0 = fir.gentypedesc !fir.type<derived3>
return
}