2121#include " mlir/IR/IRMapping.h"
2222#include " mlir/IR/MLIRContext.h"
2323#include " mlir/IR/PatternMatch.h"
24- #include " mlir/IR/Value.h"
2524#include " mlir/Transforms/DialectConversion.h"
2625#include " mlir/Transforms/OneToNTypeConversion.h"
2726#include " mlir/Transforms/Passes.h"
@@ -81,38 +80,34 @@ createVariablesForResults(T op, const TypeConverter *typeConverter,
8180// Create a series of assign ops assigning given values to given variables at
8281// the current insertion point of given rewriter.
8382static void assignValues (ValueRange values, ValueRange variables,
84- ConversionPatternRewriter &rewriter, Location loc,
85- const TypeConverter *typeConverter = nullptr ) {
83+ ConversionPatternRewriter &rewriter, Location loc) {
8684 for (auto [value, var] : llvm::zip (values, variables))
8785 rewriter.create <emitc::AssignOp>(loc, var, value);
8886}
8987
90- static void lowerYield (ValueRange resultVariables,
91- ConversionPatternRewriter &rewriter, scf::YieldOp yield ,
92- const TypeConverter *typeConverter ) {
88+ static LogicalResult lowerYield (Operation *op, ValueRange resultVariables,
89+ ConversionPatternRewriter &rewriter,
90+ scf::YieldOp yield ) {
9391 Location loc = yield.getLoc ();
9492
9593 OpBuilder::InsertionGuard guard (rewriter);
9694 rewriter.setInsertionPoint (yield);
9795
9896 SmallVector<Value> yieldOperands;
9997 for (auto originalOperand : yield.getOperands ()) {
100- Value operand = originalOperand;
101-
102- if (typeConverter && !typeConverter->isLegal (operand.getType ())) {
103- Type resultType = typeConverter->convertType (operand.getType ());
104- auto castToTarget =
105- rewriter.create <UnrealizedConversionCastOp>(loc, resultType, operand);
106- operand = castToTarget.getResult (0 );
98+ Value remappedValue = rewriter.getRemappedValue (originalOperand);
99+ if (!remappedValue) {
100+ return rewriter.notifyMatchFailure (op, " failed to lower yield operands" );
107101 }
108-
109- yieldOperands.push_back (operand);
102+ yieldOperands.push_back (remappedValue);
110103 }
111104
112105 assignValues (yieldOperands, resultVariables, rewriter, loc);
113106
114107 rewriter.create <emitc::YieldOp>(loc);
115108 rewriter.eraseOp (yield);
109+
110+ return success ();
116111}
117112
118113LogicalResult
@@ -153,9 +148,12 @@ ForLowering::matchAndRewrite(ForOp forOp, OpAdaptor adaptor,
153148 replacingValues.append (resultVariables.begin (), resultVariables.end ());
154149 rewriter.mergeBlocks (scfBody, loweredBody, replacingValues);
155150
156- lowerYield (resultVariables, rewriter,
157- cast<scf::YieldOp>(loweredBody->getTerminator ()),
158- getTypeConverter ());
151+ auto result = lowerYield (forOp, resultVariables, rewriter,
152+ cast<scf::YieldOp>(loweredBody->getTerminator ()));
153+
154+ if (failed (result)) {
155+ return result;
156+ }
159157
160158 rewriter.replaceOp (forOp, resultVariables);
161159 return success ();
@@ -192,11 +190,15 @@ IfLowering::matchAndRewrite(IfOp ifOp, OpAdaptor adaptor,
192190 // emitc::yield, but also with a sequence of emitc::assign ops that set the
193191 // yielded values into the result variables.
194192 auto lowerRegion = [&resultVariables, &rewriter,
195- this ](Region ®ion, Region &loweredRegion) {
193+ &ifOp ](Region ®ion, Region &loweredRegion) {
196194 rewriter.inlineRegionBefore (region, loweredRegion, loweredRegion.end ());
197195 Operation *terminator = loweredRegion.back ().getTerminator ();
198- lowerYield (resultVariables, rewriter, cast<scf::YieldOp>(terminator),
199- getTypeConverter ());
196+ auto result = lowerYield (ifOp, resultVariables, rewriter,
197+ cast<scf::YieldOp>(terminator));
198+ if (failed (result)) {
199+ return result;
200+ }
201+ return success ();
200202 };
201203
202204 Region &thenRegion = adaptor.getThenRegion ();
@@ -208,11 +210,17 @@ IfLowering::matchAndRewrite(IfOp ifOp, OpAdaptor adaptor,
208210 rewriter.create <emitc::IfOp>(loc, adaptor.getCondition (), false , false );
209211
210212 Region &loweredThenRegion = loweredIf.getThenRegion ();
211- lowerRegion (thenRegion, loweredThenRegion);
213+ auto result = lowerRegion (thenRegion, loweredThenRegion);
214+ if (failed (result)) {
215+ return result;
216+ }
212217
213218 if (hasElseBlock) {
214219 Region &loweredElseRegion = loweredIf.getElseRegion ();
215- lowerRegion (elseRegion, loweredElseRegion);
220+ auto result = lowerRegion (elseRegion, loweredElseRegion);
221+ if (failed (result)) {
222+ return result;
223+ }
216224 }
217225
218226 rewriter.replaceOp (ifOp, resultVariables);
0 commit comments