@@ -565,9 +565,41 @@ namespace vast::conv {
565565 op_t op, adaptor_t adaptor, conversion_rewriter &rewriter
566566 ) const override {
567567 auto args = realized_operand_values (adaptor.getOperands (), rewriter);
568- rewriter.replaceOpWithNewOp < pr::Assign >(op, std::vector< mlir_type >(), args);
568+ rewriter.create < pr::Assign >(op.getLoc (), std::vector< mlir_type >(), args);
569+ rewriter.replaceAllUsesWith (op, args[0 ]);
570+ rewriter.eraseOp (op);
571+ return mlir::success ();
572+ }
573+ };
574+
575+ struct CondYieldConversion
576+ : parser_conversion_pattern_base< hl::CondYieldOp >
577+ {
578+ using op_t = hl::CondYieldOp;
579+ using base = parser_conversion_pattern_base< op_t >;
580+ using base::base;
581+
582+ using adaptor_t = typename op_t ::Adaptor;
583+
584+ logical_result matchAndRewrite (
585+ op_t op, adaptor_t adaptor, conversion_rewriter &rewriter
586+ ) const override {
587+ auto operand = adaptor.getResult ().getDefiningOp ();
588+ if (auto cast = mlir::dyn_cast< mlir::UnrealizedConversionCastOp >(operand)) {
589+ if (pr::is_parser_type (cast.getOperand (0 ).getType ())) {
590+ rewriter.replaceOpWithNewOp < op_t >(op, cast.getOperand (0 ));
591+ return mlir::success ();
592+ }
593+ }
594+
569595 return mlir::success ();
570596 }
597+
598+ static void legalize (parser_conversion_config &cfg) {
599+ cfg.target .addDynamicallyLegalOp < op_t >([](op_t op) {
600+ return pr::is_parser_type (op.getResult ().getType ());
601+ });
602+ }
571603 };
572604
573605 struct ExprConversion
@@ -662,6 +694,7 @@ namespace vast::conv {
662694 ToNoParse< hl::RemFOp >,
663695 // Other operations
664696 AssignConversion,
697+ CondYieldConversion,
665698 ExprConversion,
666699 FuncConversion,
667700 ParamConversion,
0 commit comments