From dfedda3b96805e4669d5763fd77785f31d33d40d Mon Sep 17 00:00:00 2001 From: xlauko Date: Wed, 15 Jan 2025 14:03:38 +0100 Subject: [PATCH] pr: Implement reconcile parser casts conversion. --- lib/vast/Conversion/Parser/ReconcileCasts.cpp | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/lib/vast/Conversion/Parser/ReconcileCasts.cpp b/lib/vast/Conversion/Parser/ReconcileCasts.cpp index 61d01691a7..b2526a78ca 100644 --- a/lib/vast/Conversion/Parser/ReconcileCasts.cpp +++ b/lib/vast/Conversion/Parser/ReconcileCasts.cpp @@ -9,6 +9,7 @@ VAST_RELAX_WARNINGS VAST_UNRELAX_WARNINGS #include "PassesDetails.hpp" +#include "Utils.hpp" #include "vast/Conversion/Common/Mixins.hpp" #include "vast/Conversion/Common/Patterns.hpp" @@ -20,9 +21,42 @@ namespace vast::conv { namespace pattern { - using cast_conversions = util::type_list< - // Casts - >; + struct UnrealizedCastConversion + : one_to_one_conversion_pattern< mlir::UnrealizedConversionCastOp, pr::Cast > + { + using op_t = mlir::UnrealizedConversionCastOp; + using base = one_to_one_conversion_pattern< mlir::UnrealizedConversionCastOp, pr::Cast >; + using base::base; + + using adaptor_t = typename op_t::Adaptor; + + logical_result matchAndRewrite( + op_t op, adaptor_t adaptor, conversion_rewriter &rewriter + ) const override { + if (op.getNumOperands() != 1) { + return mlir::failure(); + } + + auto src = mlir::dyn_cast< mlir::UnrealizedConversionCastOp >(op.getOperand(0).getDefiningOp()); + + if (!src || src.getNumOperands() != 1) { + return mlir::failure(); + } + + if (pr::is_parser_type(src.getOperand(0).getType())) { + rewriter.replaceOpWithNewOp< pr::Cast >(op, op.getType(0), src.getOperand(0)); + return mlir::success(); + } + + return mlir::success(); + } + + static void legalize(base_conversion_config &cfg) { + cfg.target.addLegalOp< pr::Cast >(); + } + }; + + using cast_conversions = util::type_list< UnrealizedCastConversion >; } // namespace pattern