[mlir] Remove EDSC NestedBuilder
authorAlex Zinenko <zinenko@google.com>
Thu, 18 Jun 2020 20:55:53 +0000 (22:55 +0200)
committerAlex Zinenko <zinenko@google.com>
Fri, 19 Jun 2020 07:37:56 +0000 (09:37 +0200)
All class derived from `edsc::NestedBuilder` in core MLIR have been replaced
with alternatives based on OpBuilder+callbacks. The *Builder EDSC
infrastructure has been deprecated. Remove edsc::NestedBuilder.

This completes the "structured builders" refactoring.

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

mlir/include/mlir/EDSC/Builders.h

index 54299f0..a7c5506 100644 (file)
@@ -23,8 +23,6 @@ namespace mlir {
 class OperationFolder;
 
 namespace edsc {
-class NestedBuilder;
-
 /// Helper class to transparently handle builder insertion points by RAII.
 /// As its name indicates, a ScopedContext is means to be used locally in a
 /// scoped fashion. This abstracts away all the boilerplate related to
@@ -90,62 +88,6 @@ struct OperationBuilder {
   Op op;
 };
 
-/// A NestedBuilder is a scoping abstraction to create an idiomatic syntax
-/// embedded in C++ that serves the purpose of building nested MLIR.
-/// Nesting and compositionality is obtained by using the strict ordering that
-/// exists between object construction and method invocation on said object (in
-/// our case, the call to `operator()`).
-/// This ordering allows implementing an abstraction that decouples definition
-/// from declaration (in a PL sense) on placeholders.
-class NestedBuilder {
-protected:
-  NestedBuilder() = default;
-  NestedBuilder(const NestedBuilder &) = delete;
-  NestedBuilder(NestedBuilder &&other) : bodyScope(other.bodyScope) {
-    other.bodyScope = nullptr;
-  }
-
-  NestedBuilder &operator=(const NestedBuilder &) = delete;
-  NestedBuilder &operator=(NestedBuilder &&other) {
-    std::swap(bodyScope, other.bodyScope);
-    return *this;
-  }
-
-  /// Enter an mlir::Block and setup a ScopedContext to insert operations at
-  /// the end of it. Since we cannot use c++ language-level scoping to implement
-  /// scoping itself, we use enter/exit pairs of operations.
-  /// As a consequence we must allocate a new OpBuilder + ScopedContext and
-  /// let the escape.
-  void enter(mlir::Block *block) {
-    bodyScope = new ScopedContext(ScopedContext::getBuilderRef(),
-                                  OpBuilder::InsertPoint(block, block->end()),
-                                  ScopedContext::getLocation());
-    if (!block->empty()) {
-      auto &termOp = block->back();
-      if (termOp.isKnownTerminator())
-        ScopedContext::getBuilderRef().setInsertionPoint(&termOp);
-    }
-  }
-
-  /// Exit the current mlir::Block by explicitly deleting the dynamically
-  /// allocated OpBuilder and ScopedContext.
-  void exit() {
-    delete bodyScope;
-    bodyScope = nullptr;
-  }
-
-  /// Custom destructor does nothing because we already destroyed bodyScope
-  /// manually in `exit`. Insert an assertion to defensively guard against
-  /// improper usage of scoping.
-  ~NestedBuilder() {
-    assert(!bodyScope &&
-           "Illegal use of NestedBuilder; must have called exit()");
-  }
-
-private:
-  ScopedContext *bodyScope = nullptr;
-};
-
 /// Creates a block in the region that contains the insertion block of the
 /// OpBuilder currently at the top of ScopedContext stack (appends the block to
 /// the region). Be aware that this will NOT update the insertion point of the