From c102ea88324e693bac20704c2d4a9ba032397b67 Mon Sep 17 00:00:00 2001 From: Martin Erhart Date: Tue, 3 Sep 2024 19:12:29 +0200 Subject: [PATCH] [MooreToCore] Separate conversion pattern for moore.output (#7573) Don't convert the output op in the module pattern because the operands will be of the wrong type since the body has not been converted yet, so it need to apply the hw output pattern afterwards anyway. Instead of relying on that pattern we should have a separate one for moore.output to hw.output that is applied once the rest of the body was converted. The HW output pattern is unnecessary because in the IR before conversion, no hw.output operation should be present (at least none that has a moore typed operand), thus its presence is only the consequence of a bad conversion process (if a target operation is inserted of which the operands are still of the source type, conversion casts should be inserted). --- lib/Conversion/MooreToCore/MooreToCore.cpp | 31 +++++++++------------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/lib/Conversion/MooreToCore/MooreToCore.cpp b/lib/Conversion/MooreToCore/MooreToCore.cpp index ca56ed58d4..ccf3e1d98e 100644 --- a/lib/Conversion/MooreToCore/MooreToCore.cpp +++ b/lib/Conversion/MooreToCore/MooreToCore.cpp @@ -115,7 +115,6 @@ struct SVModuleOpConversion : public OpConversionPattern { LogicalResult matchAndRewrite(SVModuleOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override { - auto outputOp = op.getOutputOp(); rewriter.setInsertionPoint(op); // Create the hw.module to replace moore.module @@ -133,16 +132,23 @@ struct SVModuleOpConversion : public OpConversionPattern { rewriter.inlineRegionBefore(op.getBodyRegion(), hwModuleOp.getBodyRegion(), hwModuleOp.getBodyRegion().end()); - // Rewrite the hw.output op - rewriter.setInsertionPointToEnd(hwModuleOp.getBodyBlock()); - rewriter.replaceOpWithNewOp(outputOp, outputOp.getOperands()); - // Erase the original op rewriter.eraseOp(op); return success(); } }; +struct OutputOpConversion : public OpConversionPattern { + using OpConversionPattern::OpConversionPattern; + + LogicalResult + matchAndRewrite(OutputOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + rewriter.replaceOpWithNewOp(op, adaptor.getOperands()); + return success(); + } +}; + struct InstanceOpConversion : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; @@ -946,17 +952,6 @@ struct ConversionOpConversion : public OpConversionPattern { // Statement Conversion //===----------------------------------------------------------------------===// -struct HWOutputOpConversion : public OpConversionPattern { - using OpConversionPattern::OpConversionPattern; - - LogicalResult - matchAndRewrite(hw::OutputOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const override { - rewriter.replaceOpWithNewOp(op, adaptor.getOperands()); - return success(); - } -}; - struct HWInstanceOpConversion : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; @@ -1308,7 +1303,7 @@ static void populateOpConversion(RewritePatternSet &patterns, ConversionOpConversion, ReadOpConversion, NamedConstantOpConv, StructExtractOpConversion, StructExtractRefOpConversion, ExtractRefOpConversion, StructCreateOpConversion, ConditionalOpConversion, - YieldOpConversion, + YieldOpConversion, OutputOpConversion, // Patterns of unary operations. ReduceAndOpConversion, ReduceOrOpConversion, ReduceXorOpConversion, @@ -1360,7 +1355,7 @@ static void populateOpConversion(RewritePatternSet &patterns, CondBranchOpConversion, BranchOpConversion, // Patterns of other operations outside Moore dialect. - HWOutputOpConversion, HWInstanceOpConversion, ReturnOpConversion, + HWInstanceOpConversion, ReturnOpConversion, CallOpConversion, UnrealizedConversionCastConversion >(typeConverter, context); // clang-format on