[mlir:SymbolTable] Add "remove" method that drops a symbol without erasing it
authorRiver Riddle <riddleriver@gmail.com>
Fri, 9 Sep 2022 09:03:47 +0000 (02:03 -0700)
committerRiver Riddle <riddleriver@gmail.com>
Fri, 9 Sep 2022 22:09:57 +0000 (15:09 -0700)
There are various use cases where we don't want to immediately erase
an operation when removing it from the symbol table. This commit adds
a "remove" method to support that.

Differential Revision: https://reviews.llvm.org/D133564

mlir/include/mlir/IR/SymbolTable.h
mlir/lib/IR/SymbolTable.cpp

index 86ca3b1..3cc4800 100644 (file)
@@ -41,7 +41,10 @@ public:
     return dyn_cast_or_null<T>(lookup(name));
   }
 
-  /// Erase the given symbol from the table.
+  /// Remove the given symbol from the table, without deleting it.
+  void remove(Operation *op);
+
+  /// Erase the given symbol from the table and delete the operation.
   void erase(Operation *symbol);
 
   /// Insert a new symbol into the table, and rename it as necessary to avoid
index 792bf42..669f538 100644 (file)
@@ -146,19 +146,21 @@ Operation *SymbolTable::lookup(StringAttr name) const {
   return symbolTable.lookup(name);
 }
 
-/// Erase the given symbol from the table.
-void SymbolTable::erase(Operation *symbol) {
-  StringAttr name = getNameIfSymbol(symbol);
+void SymbolTable::remove(Operation *op) {
+  StringAttr name = getNameIfSymbol(op);
   assert(name && "expected valid 'name' attribute");
-  assert(symbol->getParentOp() == symbolTableOp &&
+  assert(op->getParentOp() == symbolTableOp &&
          "expected this operation to be inside of the operation with this "
          "SymbolTable");
 
   auto it = symbolTable.find(name);
-  if (it != symbolTable.end() && it->second == symbol) {
+  if (it != symbolTable.end() && it->second == op)
     symbolTable.erase(it);
-    symbol->erase();
-  }
+}
+
+void SymbolTable::erase(Operation *symbol) {
+  remove(symbol);
+  symbol->erase();
 }
 
 // TODO: Consider if this should be renamed to something like insertOrUpdate