@@ -565,9 +565,41 @@ namespace vast::conv {
565
565
op_t op, adaptor_t adaptor, conversion_rewriter &rewriter
566
566
) const override {
567
567
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
+
569
595
return mlir::success ();
570
596
}
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
+ }
571
603
};
572
604
573
605
struct ExprConversion
@@ -662,6 +694,7 @@ namespace vast::conv {
662
694
ToNoParse< hl::RemFOp >,
663
695
// Other operations
664
696
AssignConversion,
697
+ CondYieldConversion,
665
698
ExprConversion,
666
699
FuncConversion,
667
700
ParamConversion,
0 commit comments