@@ -99,41 +99,33 @@ struct IfConversion : public OpRewritePattern<fir::IfOp> {
99
99
mlir::scf::IfOp scfIfOp = rewriter.create <scf::IfOp>(
100
100
loc, resultTypes, condition, !ifOp.getElseRegion ().empty ());
101
101
// 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);
114
107
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 ());
118
112
}
113
+ scfthenTerminator->erase ();
119
114
120
115
// else region
121
116
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 ();
131
120
121
+ rewriter.setInsertionPointToEnd (&elseBlock);
132
122
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 ());
136
127
}
128
+ elseTerminator->erase ();
137
129
}
138
130
139
131
scfIfOp->setAttrs (ifOp->getAttrs ());
0 commit comments