Skip to content

Commit

Permalink
[mlir] Remove EDSC NestedBuilder
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ftynse committed Jun 19, 2020
1 parent 0af2262 commit 63b7e1e
Showing 1 changed file with 0 additions and 58 deletions.
58 changes: 0 additions & 58 deletions mlir/include/mlir/EDSC/Builders.h
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 63b7e1e

Please sign in to comment.