blob: 36851d3086aaa6b5447be10af616117e8e455b8b [file] [log] [blame]
// Copyright 2019 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "iree/compiler/Dialect/VM/Conversion/ConversionTarget.h"
namespace mlir::iree_compiler {
// static
std::pair<mlir::ModuleOp, mlir::ModuleOp>
VMConversionTarget::nestModuleForConversion(mlir::ModuleOp outerModuleOp) {
if (isa<IREE::VM::ModuleOp>(outerModuleOp.getBody()->front())) {
// Already have a VM module; no need for the nesting.
return std::make_pair(outerModuleOp, outerModuleOp);
}
auto innerModuleOp = dyn_cast<ModuleOp>(outerModuleOp.getBody()->front());
if (!innerModuleOp) {
innerModuleOp =
ModuleOp::create(outerModuleOp.getLoc(), outerModuleOp.getName());
if (auto reflectionAttr =
outerModuleOp->getAttrOfType<DictionaryAttr>("iree.reflection")) {
innerModuleOp->setAttr("iree.reflection", reflectionAttr);
outerModuleOp->removeAttr("iree.reflection");
}
innerModuleOp.getBodyRegion().takeBody(outerModuleOp.getBodyRegion());
outerModuleOp.getBodyRegion().getBlocks().push_back(new Block());
outerModuleOp.push_back(innerModuleOp);
}
outerModuleOp->setAttr("vm.toplevel",
UnitAttr::get(outerModuleOp.getContext()));
return std::make_pair(outerModuleOp, innerModuleOp);
}
// static
bool VMConversionTarget::isTopLevelModule(mlir::ModuleOp moduleOp) {
return !moduleOp->getParentOp() || moduleOp->hasAttr("vm.toplevel");
}
VMConversionTarget::VMConversionTarget(MLIRContext *context)
: ConversionTarget(*context) {
addLegalDialect<IREE::VM::VMDialect>();
// NOTE: we need to allow the outermost std.module to be legal to support the
// double-nesting (module { vm.module { ... } }).
addDynamicallyLegalOp<mlir::ModuleOp>(
+[](mlir::ModuleOp op) { return isTopLevelModule(op); });
}
} // namespace mlir::iree_compiler