@@ -16,29 +16,27 @@ namespace fir {
1616#include " flang/Optimizer/Transforms/Passes.h.inc"
1717} // namespace fir
1818
19- using namespace fir ;
20- using namespace mlir ;
21-
2219namespace {
2320class FIRToSCFPass : public fir ::impl::FIRToSCFPassBase<FIRToSCFPass> {
2421public:
2522 void runOnOperation () override ;
2623};
2724
28- struct DoLoopConversion : public OpRewritePattern <fir::DoLoopOp> {
25+ struct DoLoopConversion : public mlir :: OpRewritePattern<fir::DoLoopOp> {
2926 using OpRewritePattern<fir::DoLoopOp>::OpRewritePattern;
3027
31- LogicalResult matchAndRewrite (fir::DoLoopOp doLoopOp,
32- PatternRewriter &rewriter) const override {
33- auto loc = doLoopOp.getLoc ();
28+ mlir::LogicalResult
29+ matchAndRewrite (fir::DoLoopOp doLoopOp,
30+ mlir::PatternRewriter &rewriter) const override {
31+ mlir::Location loc = doLoopOp.getLoc ();
3432 bool hasFinalValue = doLoopOp.getFinalValue ().has_value ();
3533
3634 // Get loop values from the DoLoopOp
37- auto low = doLoopOp.getLowerBound ();
38- auto high = doLoopOp.getUpperBound ();
35+ mlir::Value low = doLoopOp.getLowerBound ();
36+ mlir::Value high = doLoopOp.getUpperBound ();
3937 assert (low && high && " must be a Value" );
40- auto step = doLoopOp.getStep ();
41- llvm::SmallVector<Value> iterArgs;
38+ mlir::Value step = doLoopOp.getStep ();
39+ llvm::SmallVector<mlir:: Value> iterArgs;
4240 if (hasFinalValue)
4341 iterArgs.push_back (low);
4442 iterArgs.append (doLoopOp.getIterOperands ().begin (),
@@ -49,31 +47,33 @@ struct DoLoopConversion : public OpRewritePattern<fir::DoLoopOp> {
4947 // must be a positive value.
5048 // For easier conversion, we calculate the trip count and use a canonical
5149 // induction variable.
52- auto diff = arith::SubIOp::create (rewriter, loc, high, low);
53- auto distance = arith::AddIOp::create (rewriter, loc, diff, step);
54- auto tripCount = arith::DivSIOp::create (rewriter, loc, distance, step);
55- auto zero = arith::ConstantIndexOp::create (rewriter, loc, 0 );
56- auto one = arith::ConstantIndexOp::create (rewriter, loc, 1 );
50+ auto diff = mlir::arith::SubIOp::create (rewriter, loc, high, low);
51+ auto distance = mlir::arith::AddIOp::create (rewriter, loc, diff, step);
52+ auto tripCount =
53+ mlir::arith::DivSIOp::create (rewriter, loc, distance, step);
54+ auto zero = mlir::arith::ConstantIndexOp::create (rewriter, loc, 0 );
55+ auto one = mlir::arith::ConstantIndexOp::create (rewriter, loc, 1 );
5756 auto scfForOp =
58- scf::ForOp::create (rewriter, loc, zero, tripCount, one, iterArgs);
57+ mlir:: scf::ForOp::create (rewriter, loc, zero, tripCount, one, iterArgs);
5958
6059 auto &loopOps = doLoopOp.getBody ()->getOperations ();
61- auto resultOp = cast<fir::ResultOp>(doLoopOp.getBody ()->getTerminator ());
60+ auto resultOp =
61+ mlir::cast<fir::ResultOp>(doLoopOp.getBody ()->getTerminator ());
6262 auto results = resultOp.getOperands ();
63- Block *loweredBody = scfForOp.getBody ();
63+ mlir:: Block *loweredBody = scfForOp.getBody ();
6464
6565 loweredBody->getOperations ().splice (loweredBody->begin (), loopOps,
6666 loopOps.begin (),
6767 std::prev (loopOps.end ()));
6868
6969 rewriter.setInsertionPointToStart (loweredBody);
70- Value iv =
71- arith::MulIOp::create ( rewriter, loc, scfForOp.getInductionVar (), step);
72- iv = arith::AddIOp::create (rewriter, loc, low, iv);
70+ mlir:: Value iv = mlir::arith::MulIOp::create (
71+ rewriter, loc, scfForOp.getInductionVar (), step);
72+ iv = mlir:: arith::AddIOp::create (rewriter, loc, low, iv);
7373
7474 if (!results.empty ()) {
7575 rewriter.setInsertionPointToEnd (loweredBody);
76- scf::YieldOp::create (rewriter, resultOp->getLoc (), results);
76+ mlir:: scf::YieldOp::create (rewriter, resultOp->getLoc (), results);
7777 }
7878 doLoopOp.getInductionVar ().replaceAllUsesWith (iv);
7979 rewriter.replaceAllUsesWith (doLoopOp.getRegionIterArgs (),
@@ -84,34 +84,36 @@ struct DoLoopConversion : public OpRewritePattern<fir::DoLoopOp> {
8484 // Copy all the attributes from the old to new op.
8585 scfForOp->setAttrs (doLoopOp->getAttrs ());
8686 rewriter.replaceOp (doLoopOp, scfForOp);
87- return success ();
87+ return mlir:: success ();
8888 }
8989};
9090
91- void copyBlockAndTransformResult (PatternRewriter &rewriter, Block &srcBlock ,
92- Block &dstBlock) {
93- Operation *srcTerminator = srcBlock.getTerminator ();
94- auto resultOp = cast<fir::ResultOp>(srcTerminator);
91+ void copyBlockAndTransformResult (mlir:: PatternRewriter &rewriter,
92+ mlir::Block &srcBlock, mlir:: Block &dstBlock) {
93+ mlir:: Operation *srcTerminator = srcBlock.getTerminator ();
94+ auto resultOp = mlir:: cast<fir::ResultOp>(srcTerminator);
9595
9696 dstBlock.getOperations ().splice (dstBlock.begin (), srcBlock.getOperations (),
9797 srcBlock.begin (), std::prev (srcBlock.end ()));
9898
9999 if (!resultOp->getOperands ().empty ()) {
100100 rewriter.setInsertionPointToEnd (&dstBlock);
101- scf::YieldOp::create (rewriter, resultOp->getLoc (), resultOp->getOperands ());
101+ mlir::scf::YieldOp::create (rewriter, resultOp->getLoc (),
102+ resultOp->getOperands ());
102103 }
103104
104105 rewriter.eraseOp (srcTerminator);
105106}
106107
107- struct IfConversion : public OpRewritePattern <fir::IfOp> {
108+ struct IfConversion : public mlir :: OpRewritePattern<fir::IfOp> {
108109 using OpRewritePattern<fir::IfOp>::OpRewritePattern;
109- LogicalResult matchAndRewrite (fir::IfOp ifOp,
110- PatternRewriter &rewriter) const override {
110+ mlir::LogicalResult
111+ matchAndRewrite (fir::IfOp ifOp,
112+ mlir::PatternRewriter &rewriter) const override {
111113 bool hasElse = !ifOp.getElseRegion ().empty ();
112114 auto scfIfOp =
113- scf::IfOp::create (rewriter, ifOp.getLoc (), ifOp.getResultTypes (),
114- ifOp.getCondition (), hasElse);
115+ mlir:: scf::IfOp::create (rewriter, ifOp.getLoc (), ifOp.getResultTypes (),
116+ ifOp.getCondition (), hasElse);
115117
116118 copyBlockAndTransformResult (rewriter, ifOp.getThenRegion ().front (),
117119 scfIfOp.getThenRegion ().front ());
@@ -123,22 +125,22 @@ struct IfConversion : public OpRewritePattern<fir::IfOp> {
123125
124126 scfIfOp->setAttrs (ifOp->getAttrs ());
125127 rewriter.replaceOp (ifOp, scfIfOp);
126- return success ();
128+ return mlir:: success ();
127129 }
128130};
129131} // namespace
130132
131133void FIRToSCFPass::runOnOperation () {
132- RewritePatternSet patterns (&getContext ());
134+ mlir:: RewritePatternSet patterns (&getContext ());
133135 patterns.add <DoLoopConversion, IfConversion>(patterns.getContext ());
134- ConversionTarget target (getContext ());
136+ mlir:: ConversionTarget target (getContext ());
135137 target.addIllegalOp <fir::DoLoopOp, fir::IfOp>();
136- target.markUnknownOpDynamicallyLegal ([](Operation *) { return true ; });
138+ target.markUnknownOpDynamicallyLegal ([](mlir:: Operation *) { return true ; });
137139 if (failed (
138140 applyPartialConversion (getOperation (), target, std::move (patterns))))
139141 signalPassFailure ();
140142}
141143
142- std::unique_ptr<Pass> fir::createFIRToSCFPass () {
144+ std::unique_ptr<mlir:: Pass> fir::createFIRToSCFPass () {
143145 return std::make_unique<FIRToSCFPass>();
144146}
0 commit comments