blob: b9d435fe387a8d8c6d15d53c3485ab2de4f09f3e [file]
// Copyright 2022 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/IR/VMOps.h"
#include "iree/compiler/Dialect/VM/Transforms/Passes.h"
#include "mlir/IR/Attributes.h"
#include "mlir/IR/MLIRContext.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassRegistry.h"
#include "mlir/Support/LLVM.h"
#include "mlir/Support/LogicalResult.h"
namespace mlir::iree_compiler::IREE::VM {
namespace {
// Returns true if |funcOp| is empty.
static bool isFuncEmpty(IREE::VM::FuncOp funcOp) {
return funcOp.empty() ||
(&funcOp.front() == &funcOp.back() &&
&funcOp.front().front() == funcOp.front().getTerminator());
}
} // namespace
class DropEmptyModuleInitializersPass
: public PassWrapper<DropEmptyModuleInitializersPass,
OperationPass<IREE::VM::ModuleOp>> {
public:
StringRef getArgument() const override {
return "iree-vm-drop-empty-module-initializers";
}
StringRef getDescription() const override {
return "Drops __init/__deinit functions that have no ops.";
}
void runOnOperation() override {
auto moduleOp = getOperation();
SymbolTable symbolTable(moduleOp);
// Find all export ops so they are easier to remove.
DenseMap<StringRef, IREE::VM::ExportOp> exportOps;
for (auto exportOp : moduleOp.getOps<IREE::VM::ExportOp>()) {
exportOps[exportOp.getExportName()] = exportOp;
}
// Check @__init:
auto initFuncOp = symbolTable.lookup<IREE::VM::FuncOp>("__init");
if (initFuncOp && isFuncEmpty(initFuncOp)) {
auto exportOp = exportOps[initFuncOp.getName()];
if (exportOp)
exportOp.erase();
initFuncOp.erase();
}
// Check @__deinit:
auto deinitFuncOp = symbolTable.lookup<IREE::VM::FuncOp>("__deinit");
if (deinitFuncOp && isFuncEmpty(deinitFuncOp)) {
auto exportOp = exportOps[deinitFuncOp.getName()];
if (exportOp)
exportOp.erase();
deinitFuncOp.erase();
}
}
};
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createDropEmptyModuleInitializersPass() {
return std::make_unique<DropEmptyModuleInitializersPass>();
}
static PassRegistration<DropEmptyModuleInitializersPass> pass;
} // namespace mlir::iree_compiler::IREE::VM