@@ -79,25 +79,31 @@ createVariablesForResults(T op, const TypeConverter *typeConverter,
7979
8080// Create a series of assign ops assigning given values to given variables at
8181// the current insertion point of given rewriter.
82- static void assignValues (ValueRange values, SmallVector<Value> & variables,
82+ static void assignValues (ValueRange values, ValueRange variables,
8383 ConversionPatternRewriter &rewriter, Location loc) {
8484 for (auto [value, var] : llvm::zip (values, variables))
8585 rewriter.create <emitc::AssignOp>(loc, var, value);
8686}
8787
88- static void lowerYield (SmallVector<Value> & resultVariables,
89- ConversionPatternRewriter &rewriter,
90- scf::YieldOp yield) {
88+ static LogicalResult lowerYield (Operation *op, ValueRange resultVariables,
89+ ConversionPatternRewriter &rewriter,
90+ scf::YieldOp yield) {
9191 Location loc = yield.getLoc ();
92- ValueRange operands = yield.getOperands ();
9392
9493 OpBuilder::InsertionGuard guard (rewriter);
9594 rewriter.setInsertionPoint (yield);
9695
97- assignValues (operands, resultVariables, rewriter, loc);
96+ SmallVector<Value> yieldOperands;
97+ if (failed (rewriter.getRemappedValues (yield.getOperands (), yieldOperands))) {
98+ return rewriter.notifyMatchFailure (op, " failed to lower yield operands" );
99+ }
100+
101+ assignValues (yieldOperands, resultVariables, rewriter, loc);
98102
99103 rewriter.create <emitc::YieldOp>(loc);
100104 rewriter.eraseOp (yield);
105+
106+ return success ();
101107}
102108
103109LogicalResult
@@ -118,22 +124,32 @@ ForLowering::matchAndRewrite(ForOp forOp, OpAdaptor adaptor,
118124 emitc::ForOp loweredFor = rewriter.create <emitc::ForOp>(
119125 loc, adaptor.getLowerBound (), adaptor.getUpperBound (), adaptor.getStep ());
120126
121- // Propagate any attributes from the ODS forOp to the lowered emitc::for op.
122- loweredFor->setAttrs (forOp->getAttrs ());
123-
124127 Block *loweredBody = loweredFor.getBody ();
125128
126129 // Erase the auto-generated terminator for the lowered for op.
127130 rewriter.eraseOp (loweredBody->getTerminator ());
128131
132+ // Convert the original region types into the new types by adding unrealized
133+ // casts in the beginning of the loop. This performs the conversion in place.
134+ if (failed (rewriter.convertRegionTypes (&forOp.getRegion (),
135+ *getTypeConverter (), nullptr ))) {
136+ return rewriter.notifyMatchFailure (forOp, " region types conversion failed" );
137+ }
138+
139+ // Register the replacements for the block arguments and inline the body of
140+ // the scf.for loop into the body of the emitc::for loop.
141+ Block *scfBody = &(forOp.getRegion ().front ());
129142 SmallVector<Value> replacingValues;
130143 replacingValues.push_back (loweredFor.getInductionVar ());
131144 replacingValues.append (resultVariables.begin (), resultVariables.end ());
145+ rewriter.mergeBlocks (scfBody, loweredBody, replacingValues);
146+
147+ auto result = lowerYield (forOp, resultVariables, rewriter,
148+ cast<scf::YieldOp>(loweredBody->getTerminator ()));
132149
133- Block *adaptorBody = &(adaptor.getRegion ().front ());
134- rewriter.mergeBlocks (adaptorBody, loweredBody, replacingValues);
135- lowerYield (resultVariables, rewriter,
136- cast<scf::YieldOp>(loweredBody->getTerminator ()));
150+ if (failed (result)) {
151+ return result;
152+ }
137153
138154 rewriter.replaceOp (forOp, resultVariables);
139155 return success ();
@@ -169,11 +185,16 @@ IfLowering::matchAndRewrite(IfOp ifOp, OpAdaptor adaptor,
169185 // emitc::if regions, but the scf::yield is replaced not only with an
170186 // emitc::yield, but also with a sequence of emitc::assign ops that set the
171187 // yielded values into the result variables.
172- auto lowerRegion = [&resultVariables, &rewriter](Region ®ion ,
173- Region &loweredRegion) {
188+ auto lowerRegion = [&resultVariables, &rewriter,
189+ &ifOp](Region ®ion, Region &loweredRegion) {
174190 rewriter.inlineRegionBefore (region, loweredRegion, loweredRegion.end ());
175191 Operation *terminator = loweredRegion.back ().getTerminator ();
176- lowerYield (resultVariables, rewriter, cast<scf::YieldOp>(terminator));
192+ auto result = lowerYield (ifOp, resultVariables, rewriter,
193+ cast<scf::YieldOp>(terminator));
194+ if (failed (result)) {
195+ return result;
196+ }
197+ return success ();
177198 };
178199
179200 Region &thenRegion = adaptor.getThenRegion ();
@@ -185,11 +206,17 @@ IfLowering::matchAndRewrite(IfOp ifOp, OpAdaptor adaptor,
185206 rewriter.create <emitc::IfOp>(loc, adaptor.getCondition (), false , false );
186207
187208 Region &loweredThenRegion = loweredIf.getThenRegion ();
188- lowerRegion (thenRegion, loweredThenRegion);
209+ auto result = lowerRegion (thenRegion, loweredThenRegion);
210+ if (failed (result)) {
211+ return result;
212+ }
189213
190214 if (hasElseBlock) {
191215 Region &loweredElseRegion = loweredIf.getElseRegion ();
192- lowerRegion (elseRegion, loweredElseRegion);
216+ auto result = lowerRegion (elseRegion, loweredElseRegion);
217+ if (failed (result)) {
218+ return result;
219+ }
193220 }
194221
195222 rewriter.replaceOp (ifOp, resultVariables);
0 commit comments