@@ -501,12 +501,43 @@ class CIRBrOpLowering : public mlir::OpRewritePattern<mlir::cir::BrOp> {
501501 }
502502};
503503
504+ class CIRScopeOpLowering : public mlir ::OpRewritePattern<mlir::cir::ScopeOp> {
505+ using mlir::OpRewritePattern<mlir::cir::ScopeOp>::OpRewritePattern;
506+
507+ mlir::LogicalResult
508+ matchAndRewrite (mlir::cir::ScopeOp scopeOp,
509+ mlir::PatternRewriter &rewriter) const override {
510+ // Empty scope: just remove it.
511+ if (scopeOp.getRegion ().empty ()) {
512+ rewriter.eraseOp (scopeOp);
513+ return mlir::success ();
514+ }
515+
516+ for (auto &block : scopeOp.getRegion ()) {
517+ rewriter.setInsertionPointToEnd (&block);
518+ auto *terminator = block.getTerminator ();
519+ rewriter.replaceOpWithNewOp <mlir::memref::AllocaScopeReturnOp>(
520+ terminator, terminator->getOperands ());
521+ }
522+
523+ rewriter.setInsertionPoint (scopeOp);
524+ auto newScopeOp = rewriter.create <mlir::memref::AllocaScopeOp>(
525+ scopeOp.getLoc (), scopeOp.getResultTypes ());
526+ rewriter.inlineRegionBefore (scopeOp.getScopeRegion (),
527+ newScopeOp.getBodyRegion (),
528+ newScopeOp.getBodyRegion ().end ());
529+ rewriter.replaceOp (scopeOp, newScopeOp);
530+
531+ return mlir::LogicalResult::success ();
532+ }
533+ };
534+
504535void populateCIRToMLIRConversionPatterns (mlir::RewritePatternSet &patterns,
505536 mlir::TypeConverter &converter) {
506537 patterns.add <CIRAllocaLowering, CIRLoadLowering, CIRStoreLowering,
507538 CIRConstantLowering, CIRUnaryOpLowering, CIRBinOpLowering,
508539 CIRCmpOpLowering, CIRBrOpLowering, CIRCallLowering,
509- CIRReturnLowering>(patterns.getContext ());
540+ CIRReturnLowering, CIRScopeOpLowering >(patterns.getContext ());
510541 patterns.add <CIRFuncLowering>(converter, patterns.getContext ());
511542}
512543
0 commit comments