88 if (inputModules.empty())
91 spirv::ModuleOp firstModule = inputModules.front();
92 auto addressingModel = firstModule.getAddressingModel();
93 auto memoryModel = firstModule.getMemoryModel();
94 auto vceTriple = firstModule.getVceTriple();
98 for (
auto module : inputModules) {
99 if (module.getAddressingModel() != addressingModel ||
100 module.getMemoryModel() != memoryModel ||
101 module.getVceTriple() != vceTriple) {
102 module.emitError("input modules differ in addressing model, memory "
103 "model, and/or VCE triple");
108 auto combinedModule =
109 spirv::ModuleOp::create(combinedModuleBuilder, firstModule.getLoc(),
110 addressingModel, memoryModel, vceTriple);
120 llvm::StringMap<spirv::ModuleOp> symNameToModuleMap;
122 unsigned lastUsedID = 0;
124 for (
auto inputModule : inputModules) {
132 for (
auto &op : *combinedModule.getBody()) {
133 auto symbolOp = dyn_cast<SymbolOpInterface>(op);
137 StringRef oldSymName = symbolOp.getName();
139 if (!isa<FuncOp>(op) &&
144 StringRef newSymName = symbolOp.getName();
146 if (symRenameListener && oldSymName != newSymName) {
147 spirv::ModuleOp originalModule = symNameToModuleMap.lookup(oldSymName);
149 if (!originalModule) {
150 inputModule.emitError(
151 "unable to find original spirv::ModuleOp for symbol ")
156 symRenameListener(originalModule, oldSymName, newSymName);
160 symNameToModuleMap.erase(oldSymName);
163 symNameToModuleMap[newSymName] = originalModule;
169 for (
auto &op : *moduleClone->getBody()) {
170 auto symbolOp = dyn_cast<SymbolOpInterface>(op);
174 StringRef oldSymName = symbolOp.getName();
180 StringRef newSymName = symbolOp.getName();
182 if (symRenameListener) {
183 if (oldSymName != newSymName)
184 symRenameListener(inputModule, oldSymName, newSymName);
188 symNameToModuleMap.try_emplace(newSymName, inputModule);
193 if (!emplaceResult.second) {
194 inputModule.emitError(
"did not expect to find an entry for symbol ")
195 << symbolOp.getName();
202 for (
auto &op : *moduleClone->getBody())
203 combinedModuleBuilder.
insert(op.clone());
210 for (
auto &op : *combinedModule.getBody()) {
211 SymbolOpInterface symbolOp = dyn_cast<SymbolOpInterface>(op);
218 if (op.getNumOperands() != 0 || op.getNumResults() != 0)
229 SymbolOpInterface replacementSymOp =
result.first->second;
232 symbolOp, replacementSymOp.getNameAttr(), combinedModule))) {
233 symbolOp.emitError(
"unable to update all symbol uses for ")
234 << symbolOp.getName() <<
" to " << replacementSymOp.getName();
238 eraseList.push_back(symbolOp);
241 for (
auto symbolOp : eraseList)
244 return combinedModule;
MLIRContext is the top-level object for a collection of MLIR operations.