Build SymbolTable upfront in ModuleOp verification.
authorMahesh Ravishankar <ravishankarm@google.com>
Thu, 8 Aug 2019 21:40:03 +0000 (14:40 -0700)
committerA. Unique TensorFlower <gardener@tensorflow.org>
Thu, 8 Aug 2019 21:40:46 +0000 (14:40 -0700)
Building the symbol table upfront from module op allows for O(1)
lookup of the function while verifying duplicate EntryPointOp within
the module.

PiperOrigin-RevId: 262435697

mlir/lib/Dialect/SPIRV/SPIRVOps.cpp

index a7574a5..cdd1013 100644 (file)
@@ -768,13 +768,14 @@ static LogicalResult verify(spirv::ModuleOp moduleOp) {
   auto &body = op.getRegion(0).front();
   llvm::DenseMap<std::pair<FuncOp, spirv::ExecutionModel>, spirv::EntryPointOp>
       entryPoints;
+  SymbolTable table(moduleOp);
 
   for (auto &op : body) {
     if (op.getDialect() == dialect) {
       // For EntryPoint op, check that the function and execution model is not
       // duplicated in EntryPointOps
       if (auto entryPointOp = llvm::dyn_cast<spirv::EntryPointOp>(op)) {
-        auto funcOp = moduleOp.lookupSymbol(entryPointOp.fn());
+        auto funcOp = table.lookup<FuncOp>(entryPointOp.fn());
         if (!funcOp) {
           return entryPointOp.emitError("function '")
                  << entryPointOp.fn() << "' not found in 'spv.module'";