Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Op conversion from mhlo::ScatterOp to lmhlo::ScatterOp #36

Merged
merged 1 commit into from
Nov 28, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,57 @@ struct HloToLhloReturnOpConverter : public BaseOpConversion<mhlo::ReturnOp> {
}
};

// Legalize mhlo.scatter to a lmhlo.scatter
struct HloToLhloScatterOpConverter : public BaseOpConversion<mhlo::ScatterOp> {
using BaseOpConversion<mhlo::ScatterOp>::BaseOpConversion;

LogicalResult matchAndRewrite(
mhlo::ScatterOp op, OpAdaptor adaptor,
ConversionPatternRewriter& rewriter) const final {

auto loc = op->getLoc();
if (!llvm::hasSingleElement(op.getUpdateComputation())) {
return op->emitOpError()
<< "tensor to buffer conversion expects a single block "
"in the region containing the operation";
}

SmallVector<Value, 4> bufferArgs(adaptor.getOperands());
if (failed(convertResults(op, bufferArgs, rewriter))) return failure();
auto newOp = rewriter.create<mhlo::HloToLhloOp<ScatterOp>>(
loc, std::nullopt, bufferArgs, op->getAttrs());

// Copy over the operations inside the region.
rewriter.inlineRegionBefore(op.getUpdateComputation(), newOp.getUpdateComputation(),
newOp.getUpdateComputation().end());

// Convert the region signature to memref and add extra result.
auto& entryBlock = newOp.getUpdateComputation().front();
TypeConverter::SignatureConversion sigConversion(
adaptor.getOperands().size());
for (auto arg : entryBlock.getArguments()) {
auto oldType = arg.getType().template cast<TensorType>();
auto newType =
MemRefType::get(oldType.getShape(), oldType.getElementType());
sigConversion.addInputs(arg.getArgNumber(), newType);
}

auto returnOp = cast<mhlo::ReturnOp>(entryBlock.getTerminator());
eedalong marked this conversation as resolved.
Show resolved Hide resolved
for (auto result : returnOp.getResults()) {
auto resultType = result.getType().template cast<TensorType>();
sigConversion.addInputs({MemRefType::get(resultType.getShape(),
resultType.getElementType())});

}
rewriter.applySignatureConversion(&newOp.getUpdateComputation(), sigConversion);

rewriter.replaceOp(
op, bufferArgs[adaptor.getOperands().size()]);

return success();
}
};

// Lowers from HLO dialect to LHLO dialect allocating/deallocating temporary
// buffers if necessary.
//
Expand Down Expand Up @@ -577,7 +628,8 @@ void populateHloToLhloConversionPattern(
HloToLhloOpConverter<mhlo::DynamicUpdateSliceOp>,
HloToLhloReduceLikeOpConverter<mhlo::ReduceOp>,
HloToLhloReduceLikeOpConverter<mhlo::ReduceWindowOp>,
HloToLhloReturnOpConverter
HloToLhloReturnOpConverter,
HloToLhloScatterOpConverter
>(*converter, context);
// clang-format on
}
Expand Down