@@ -488,12 +488,43 @@ class CIRBrOpLowering : public mlir::OpRewritePattern<mlir::cir::BrOp> {
488488 }
489489};
490490
491+ class CIRScopeOpLowering : public mlir ::OpRewritePattern<mlir::cir::ScopeOp> {
492+ using mlir::OpRewritePattern<mlir::cir::ScopeOp>::OpRewritePattern;
493+
494+ mlir::LogicalResult
495+ matchAndRewrite (mlir::cir::ScopeOp scopeOp,
496+ mlir::PatternRewriter &rewriter) const override {
497+ // Empty scope: just remove it.
498+ if (scopeOp.getRegion ().empty ()) {
499+ rewriter.eraseOp (scopeOp);
500+ return mlir::success ();
501+ }
502+
503+ for (auto &block : scopeOp.getRegion ()) {
504+ rewriter.setInsertionPointToEnd (&block);
505+ auto *terminator = block.getTerminator ();
506+ rewriter.replaceOpWithNewOp <mlir::memref::AllocaScopeReturnOp>(
507+ terminator, terminator->getOperands ());
508+ }
509+
510+ rewriter.setInsertionPoint (scopeOp);
511+ auto newScopeOp = rewriter.create <mlir::memref::AllocaScopeOp>(
512+ scopeOp.getLoc (), scopeOp.getResultTypes ());
513+ rewriter.inlineRegionBefore (scopeOp.getScopeRegion (),
514+ newScopeOp.getBodyRegion (),
515+ newScopeOp.getBodyRegion ().end ());
516+ rewriter.replaceOp (scopeOp, newScopeOp);
517+
518+ return mlir::LogicalResult::success ();
519+ }
520+ };
521+
491522void populateCIRToMLIRConversionPatterns (mlir::RewritePatternSet &patterns,
492523 mlir::TypeConverter &converter) {
493524 patterns.add <CIRAllocaLowering, CIRLoadLowering, CIRStoreLowering,
494525 CIRConstantLowering, CIRUnaryOpLowering, CIRBinOpLowering,
495526 CIRCmpOpLowering, CIRBrOpLowering, CIRCallLowering,
496- CIRReturnLowering>(patterns.getContext ());
527+ CIRReturnLowering, CIRScopeOpLowering >(patterns.getContext ());
497528 patterns.add <CIRFuncLowering>(converter, patterns.getContext ());
498529}
499530
0 commit comments