[fir] Add placeholder conversion pattern for disptach operations

`fir.dispatch`, `fir.dispatch_table` and `fir.dt_entry` are operations
for type-bound procedures. This patch just adds placeholder conversion
pattern that currently fails since F2003 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/D113662
This commit is contained in:
Valentin Clement 2021-11-11 13:58:39 +01:00
parent f04e387055
commit 9534e361ea
No known key found for this signature in database
GPG Key ID: 086D54783C928776
2 changed files with 60 additions and 0 deletions

View File

@ -560,6 +560,46 @@ struct ConvertOpConversion : public FIROpConversion<fir::ConvertOp> {
}
};
/// Lower `fir.dispatch` operation. A virtual call to a method in a dispatch
/// table.
struct DispatchOpConversion : public FIROpConversion<fir::DispatchOp> {
using FIROpConversion::FIROpConversion;
mlir::LogicalResult
matchAndRewrite(fir::DispatchOp dispatch, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const override {
return rewriter.notifyMatchFailure(
dispatch, "fir.dispatch codegen is not implemented yet");
}
};
/// Lower `fir.dispatch_table` operation. The dispatch table for a Fortran
/// derived type.
struct DispatchTableOpConversion
: public FIROpConversion<fir::DispatchTableOp> {
using FIROpConversion::FIROpConversion;
mlir::LogicalResult
matchAndRewrite(fir::DispatchTableOp dispTab, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const override {
return rewriter.notifyMatchFailure(
dispTab, "fir.dispatch_table codegen is not implemented yet");
}
};
/// Lower `fir.dt_entry` operation. An entry in a dispatch table; binds a
/// method-name to a function.
struct DTEntryOpConversion : public FIROpConversion<fir::DTEntryOp> {
using FIROpConversion::FIROpConversion;
mlir::LogicalResult
matchAndRewrite(fir::DTEntryOp dtEnt, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const override {
return rewriter.notifyMatchFailure(
dtEnt, "fir.dt_entry codegen is not implemented yet");
}
};
/// Lower `fir.has_value` operation to `llvm.return` operation.
struct HasValueOpConversion : public FIROpConversion<fir::HasValueOp> {
using FIROpConversion::FIROpConversion;
@ -1189,6 +1229,7 @@ public:
BoxAddrOpConversion, BoxDimsOpConversion, BoxEleSizeOpConversion,
BoxIsAllocOpConversion, BoxIsArrayOpConversion, BoxIsPtrOpConversion,
BoxRankOpConversion, CallOpConversion, ConvertOpConversion,
DispatchOpConversion, DispatchTableOpConversion, DTEntryOpConversion,
DivcOpConversion, ExtractValueOpConversion, HasValueOpConversion,
GlobalOpConversion, InsertOnRangeOpConversion, InsertValueOpConversion,
LoadOpConversion, NegcOpConversion, MulcOpConversion,

View File

@ -8,3 +8,22 @@ func @zero_aggregate() {
return
}
// -----
// Test that `fir.dispatch` fails to be legalized. Not implemented yet.
func @dispatch(%arg0: !fir.box<!fir.type<derived3{f:f32}>>) {
// expected-error@+1{{failed to legalize operation 'fir.dispatch'}}
%0 = fir.dispatch "method"(%arg0) : (!fir.box<!fir.type<derived3{f:f32}>>) -> i32
return
}
// -----
// Test that `fir.dispatch_table`/`fir.dt_entry` fails to be legalized.
// Not implemented yet.
// expected-error@+1{{failed to legalize operation 'fir.dispatch_table'}}
fir.dispatch_table @dispatch_tbl {
fir.dt_entry "method", @method_impl
}