[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:
parent
f04e387055
commit
9534e361ea
|
|
@ -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.
|
/// Lower `fir.has_value` operation to `llvm.return` operation.
|
||||||
struct HasValueOpConversion : public FIROpConversion<fir::HasValueOp> {
|
struct HasValueOpConversion : public FIROpConversion<fir::HasValueOp> {
|
||||||
using FIROpConversion::FIROpConversion;
|
using FIROpConversion::FIROpConversion;
|
||||||
|
|
@ -1189,6 +1229,7 @@ public:
|
||||||
BoxAddrOpConversion, BoxDimsOpConversion, BoxEleSizeOpConversion,
|
BoxAddrOpConversion, BoxDimsOpConversion, BoxEleSizeOpConversion,
|
||||||
BoxIsAllocOpConversion, BoxIsArrayOpConversion, BoxIsPtrOpConversion,
|
BoxIsAllocOpConversion, BoxIsArrayOpConversion, BoxIsPtrOpConversion,
|
||||||
BoxRankOpConversion, CallOpConversion, ConvertOpConversion,
|
BoxRankOpConversion, CallOpConversion, ConvertOpConversion,
|
||||||
|
DispatchOpConversion, DispatchTableOpConversion, DTEntryOpConversion,
|
||||||
DivcOpConversion, ExtractValueOpConversion, HasValueOpConversion,
|
DivcOpConversion, ExtractValueOpConversion, HasValueOpConversion,
|
||||||
GlobalOpConversion, InsertOnRangeOpConversion, InsertValueOpConversion,
|
GlobalOpConversion, InsertOnRangeOpConversion, InsertValueOpConversion,
|
||||||
LoadOpConversion, NegcOpConversion, MulcOpConversion,
|
LoadOpConversion, NegcOpConversion, MulcOpConversion,
|
||||||
|
|
|
||||||
|
|
@ -8,3 +8,22 @@ func @zero_aggregate() {
|
||||||
return
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue