blob: 0ed40e5dcd39a7a9ebbf6f902e9716c5844b79e9 [file] [edit]
// 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 {
#define GEN_PASS_DEF_DROPEMPTYMODULEINITIALIZERSPASS
#include "iree/compiler/Dialect/VM/Transforms/Passes.h.inc"
// 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());
}
class DropEmptyModuleInitializersPass
: public IREE::VM::impl::DropEmptyModuleInitializersPassBase<
DropEmptyModuleInitializersPass> {
void runOnOperation() override {
IREE::VM::ModuleOp 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();
}
}
};
} // namespace mlir::iree_compiler::IREE::VM