Skip to content

Commit 7d000e8

Browse files
author
ZhiQiang Fan
committed
Replace splice with takeBody method
1 parent 4154cb1 commit 7d000e8

File tree

1 file changed

+19
-27
lines changed

1 file changed

+19
-27
lines changed

flang/lib/Optimizer/Transforms/FIRToSCF.cpp

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -99,41 +99,33 @@ struct IfConversion : public OpRewritePattern<fir::IfOp> {
9999
mlir::scf::IfOp scfIfOp = rewriter.create<scf::IfOp>(
100100
loc, resultTypes, condition, !ifOp.getElseRegion().empty());
101101
// then region
102-
assert(!ifOp.getThenRegion().empty() && "must have then region");
103-
Block &firThenBlock = ifOp.getThenRegion().front();
104-
Block &scfThenBlock = scfIfOp.getThenRegion().front();
105-
llvm::iplist<Operation> &firThenOps = firThenBlock.getOperations();
106-
Operation *firThenTerminator = firThenBlock.getTerminator();
107-
108-
rewriter.setInsertionPointToStart(&scfThenBlock);
109-
// not splice terminator
110-
scfThenBlock.getOperations().splice(scfThenBlock.begin(), firThenOps,
111-
firThenOps.begin(),
112-
std::prev(firThenOps.end()));
113-
// create terminator scf.yield
102+
scfIfOp.getThenRegion().takeBody(ifOp.getThenRegion());
103+
Block &scfthenBlock = scfIfOp.getThenRegion().front();
104+
Operation *scfthenTerminator = scfthenBlock.getTerminator();
105+
// fir.result->scf.yield
106+
rewriter.setInsertionPointToEnd(&scfthenBlock);
114107
if (hasResult) {
115-
rewriter.setInsertionPointToEnd(&scfThenBlock);
116-
mlir::OperandRange thenResults = firThenTerminator->getOperands();
117-
rewriter.create<scf::YieldOp>(firThenTerminator->getLoc(), thenResults);
108+
rewriter.create<scf::YieldOp>(scfthenTerminator->getLoc(),
109+
scfthenTerminator->getOperands());
110+
} else {
111+
rewriter.create<scf::YieldOp>(scfthenBlock.getTerminator()->getLoc());
118112
}
113+
scfthenTerminator->erase();
119114

120115
// else region
121116
if (!ifOp.getElseRegion().empty()) {
122-
Block &firElseBlock = ifOp.getElseRegion().front();
123-
Block &scfElseBlock = scfIfOp.getElseRegion().front();
124-
llvm::iplist<Operation> &firElseOps = firElseBlock.getOperations();
125-
mlir::Operation *firElseTerminator = firElseBlock.getTerminator();
126-
127-
rewriter.setInsertionPointToStart(&scfElseBlock);
128-
scfElseBlock.getOperations().splice(scfElseBlock.begin(), firElseOps,
129-
firElseOps.begin(),
130-
std::prev(firElseOps.end()));
117+
scfIfOp.getElseRegion().takeBody(ifOp.getElseRegion());
118+
mlir::Block &elseBlock = scfIfOp.getElseRegion().front();
119+
mlir::Operation *elseTerminator = elseBlock.getTerminator();
131120

121+
rewriter.setInsertionPointToEnd(&elseBlock);
132122
if (hasResult) {
133-
rewriter.setInsertionPointToEnd(&scfElseBlock);
134-
mlir::OperandRange elseResults = firElseTerminator->getOperands();
135-
rewriter.create<scf::YieldOp>(firElseTerminator->getLoc(), elseResults);
123+
rewriter.create<scf::YieldOp>(elseTerminator->getLoc(),
124+
elseTerminator->getOperands());
125+
} else {
126+
rewriter.create<scf::YieldOp>(elseBlock.getTerminator()->getLoc());
136127
}
128+
elseTerminator->erase();
137129
}
138130

139131
scfIfOp->setAttrs(ifOp->getAttrs());

0 commit comments

Comments
 (0)