Skip to content

Commit bb66650

Browse files
committed
Use delayed conversion
1 parent 5ed59a8 commit bb66650

File tree

3 files changed

+37
-31
lines changed

3 files changed

+37
-31
lines changed

mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
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.
8382
static 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

118113
LogicalResult
@@ -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 &region, Region &loweredRegion) {
193+
&ifOp](Region &region, 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);

mlir/test/Conversion/SCFToEmitC/for.mlir

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ func.func @for_yield_index(%arg0 : index, %arg1 : index, %arg2 : index) -> index
117117
// CHECK: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.size_t
118118
// CHECK: emitc.assign %[[VAL_3]] : !emitc.size_t to %[[VAL_4]] : !emitc.size_t
119119
// CHECK: emitc.for %[[VAL_5:.*]] = %[[VAL_2]] to %[[VAL_1]] step %[[VAL_0]] {
120-
// CHECK: %[[VAL_6:.*]] = builtin.unrealized_conversion_cast %[[VAL_4]] : !emitc.size_t to index
121-
// CHECK: %[[VAL_7:.*]] = builtin.unrealized_conversion_cast %[[VAL_6]] : index to !emitc.size_t
122-
// CHECK: emitc.assign %[[VAL_7]] : !emitc.size_t to %[[VAL_4]] : !emitc.size_t
120+
// CHECK: emitc.assign %[[VAL_4]] : !emitc.size_t to %[[VAL_4]] : !emitc.size_t
123121
// CHECK: }
124122
// CHECK: %[[VAL_8:.*]] = builtin.unrealized_conversion_cast %[[VAL_4]] : !emitc.size_t to index
125123
// CHECK: return %[[VAL_8]] : index

mlir/test/Conversion/SCFToEmitC/if.mlir

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,14 @@ func.func @test_if_yield_index(%arg0: i1, %arg1: f32) {
8484
// CHECK: func.func @test_if_yield_index(
8585
// CHECK-SAME: %[[ARG_0:.*]]: i1, %[[ARG_1:.*]]: f32) {
8686
// CHECK: %[[C0:.*]] = arith.constant 0 : index
87+
// CHECK: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[C0]] : index to !emitc.size_t
8788
// CHECK: %[[C1:.*]] = arith.constant 1 : index
88-
// CHECK: %[[VAL_0:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.size_t
89+
// CHECK: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[C1]] : index to !emitc.size_t
90+
// CHECK: %[[VAL_2:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.size_t
8991
// CHECK: emitc.if %[[ARG_0]] {
90-
// CHECK: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[C0]] : index to !emitc.size_t
91-
// CHECK: emitc.assign %[[VAL_1]] : !emitc.size_t to %[[VAL_0]] : !emitc.size_t
92+
// CHECK: emitc.assign %[[VAL_0]] : !emitc.size_t to %[[VAL_2]] : !emitc.size_t
9293
// CHECK: } else {
93-
// CHECK: %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[C1]] : index to !emitc.size_t
94-
// CHECK: emitc.assign %[[VAL_2]] : !emitc.size_t to %[[VAL_0]] : !emitc.size_t
94+
// CHECK: emitc.assign %[[VAL_1]] : !emitc.size_t to %[[VAL_2]] : !emitc.size_t
9595
// CHECK: }
9696
// CHECK: return
9797
// CHECK: }

0 commit comments

Comments
 (0)