@@ -526,6 +526,47 @@ namespace vast::conv {
526
526
}
527
527
};
528
528
529
+ struct VarDeclConversion
530
+ : parser_conversion_pattern_base< hl::VarDeclOp >
531
+ {
532
+ using op_t = hl::VarDeclOp;
533
+ using base = parser_conversion_pattern_base< op_t >;
534
+ using base::base;
535
+
536
+ using adaptor_t = typename op_t ::Adaptor;
537
+
538
+ logical_result matchAndRewrite (
539
+ op_t op, adaptor_t adaptor, conversion_rewriter &rewriter
540
+ ) const override {
541
+ auto maybe = to_mlir_type (data_type::maybedata, rewriter.getContext ());
542
+ /* auto decl = */ rewriter.create < pr::Decl >(op.getLoc (), op.getSymName (), maybe);
543
+
544
+ if (auto &init_region = op.getInitializer (); !init_region.empty ()) {
545
+ VAST_PATTERN_CHECK (init_region.getBlocks ().size () == 1 , " Expected single block in: {0}" , op);
546
+ auto &init_block = init_region.back ();
547
+ auto yield = terminator< hl::ValueYieldOp >::get (init_block);
548
+ VAST_PATTERN_CHECK (yield, " Expected yield in: {0}" , op);
549
+
550
+ rewriter.inlineBlockBefore (&init_block, op);
551
+ rewriter.setInsertionPointAfter (op);
552
+ auto ref = rewriter.create < pr::Ref >(op.getLoc (), maybe, op.getSymName ());
553
+ auto value = rewriter.create < mlir::UnrealizedConversionCastOp >(
554
+ yield.op ().getLoc (), maybe, yield.op ().getResult ()
555
+ );
556
+ rewriter.create < pr::Assign >(yield.op ().getLoc (), value.getResult (0 ), ref);
557
+ rewriter.eraseOp (yield.op ());
558
+ }
559
+
560
+ rewriter.eraseOp (op);
561
+ return mlir::success ();
562
+ }
563
+
564
+ static void legalize (parser_conversion_config &cfg) {
565
+ cfg.target .addLegalOp < pr::Decl, pr::Ref, pr::Assign >();
566
+ cfg.target .addLegalOp < mlir::UnrealizedConversionCastOp >();
567
+ }
568
+ };
569
+
529
570
using operation_conversions = util::type_list<
530
571
ToNoParse< hl::ConstantOp >,
531
572
ToNoParse< hl::ImplicitCastOp >,
@@ -543,6 +584,7 @@ namespace vast::conv {
543
584
FuncConversion,
544
585
ParamConversion,
545
586
DeclRefConversion,
587
+ VarDeclConversion,
546
588
ReturnConversion,
547
589
CallConversion
548
590
>;
0 commit comments