89 if (inputModules.empty())
92 spirv::ModuleOp firstModule = inputModules.front();
93 auto addressingModel = firstModule.getAddressingModel();
94 auto memoryModel = firstModule.getMemoryModel();
95 auto vceTriple = firstModule.getVceTriple();
99 for (
auto module : inputModules) {
100 if (module.getAddressingModel() != addressingModel ||
101 module.getMemoryModel() != memoryModel ||
102 module.getVceTriple() != vceTriple) {
103 module.emitError("input modules differ in addressing model, memory "
104 "model, and/or VCE triple");
109 auto combinedModule =
110 spirv::ModuleOp::create(combinedModuleBuilder, firstModule.getLoc(),
111 addressingModel, memoryModel, vceTriple);
121 llvm::StringMap<spirv::ModuleOp> symNameToModuleMap;
123 unsigned lastUsedID = 0;
125 for (
auto inputModule : inputModules) {
133 for (
auto &op : *combinedModule.getBody()) {
134 auto symbolOp = dyn_cast<SymbolOpInterface>(op);
138 StringRef oldSymName = symbolOp.getName();
140 if (!isa<FuncOp>(op) &&
145 StringRef newSymName = symbolOp.getName();
147 if (symRenameListener && oldSymName != newSymName) {
148 spirv::ModuleOp originalModule = symNameToModuleMap.lookup(oldSymName);
150 if (!originalModule) {
151 inputModule.emitError(
152 "unable to find original spirv::ModuleOp for symbol ")
157 symRenameListener(originalModule, oldSymName, newSymName);
161 symNameToModuleMap.erase(oldSymName);
164 symNameToModuleMap[newSymName] = originalModule;
170 for (
auto &op : *moduleClone->getBody()) {
171 auto symbolOp = dyn_cast<SymbolOpInterface>(op);
175 StringRef oldSymName = symbolOp.getName();
181 StringRef newSymName = symbolOp.getName();
183 if (symRenameListener) {
184 if (oldSymName != newSymName)
185 symRenameListener(inputModule, oldSymName, newSymName);
189 symNameToModuleMap.try_emplace(newSymName, inputModule);
194 if (!emplaceResult.second) {
195 inputModule.emitError(
"did not expect to find an entry for symbol ")
196 << symbolOp.getName();
203 for (
auto &op : *moduleClone->getBody())
204 combinedModuleBuilder.
insert(op.clone());
211 for (
auto &op : *combinedModule.getBody()) {
212 SymbolOpInterface symbolOp = dyn_cast<SymbolOpInterface>(op);
219 if (op.getNumOperands() != 0 || op.getNumResults() != 0)
230 SymbolOpInterface replacementSymOp =
result.first->second;
233 symbolOp, replacementSymOp.getNameAttr(), combinedModule))) {
234 symbolOp.emitError(
"unable to update all symbol uses for ")
235 << symbolOp.getName() <<
" to " << replacementSymOp.getName();
239 eraseList.push_back(symbolOp);
242 for (
auto symbolOp : eraseList)
245 return combinedModule;
MLIRContext is the top-level object for a collection of MLIR operations.