Skip to content

Commit 0441272

Browse files
committed
Revert "Revert "Refactor OperationName to use virtual tables for dispatch (NFC)""
This streamlines the implementation and makes it so that the virtual tables are in the binary instead of dynamically assembled during initialization. The dynamic allocation size of op registration is also smaller with this change. This reverts commit 7bf1e44 and re-introduce e055aad after fixing the windows crash by making ParseAssemblyFn a unique_function again Differential Revision: https://reviews.llvm.org/D141492
1 parent 52f6ed0 commit 0441272

File tree

12 files changed

+333
-280
lines changed

12 files changed

+333
-280
lines changed

mlir/include/mlir/IR/ExtensibleDialect.h

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -336,12 +336,15 @@ class DynamicType
336336

337337
/// The definition of a dynamic op. A dynamic op is an op that is defined at
338338
/// runtime, and that can be registered at runtime by an extensible dialect (a
339-
/// dialect inheriting ExtensibleDialect). This class stores the functions that
340-
/// are in the OperationName class, and in addition defines the TypeID of the op
341-
/// that will be defined.
342-
/// Each dynamic operation definition refers to one instance of this class.
343-
class DynamicOpDefinition {
339+
/// dialect inheriting ExtensibleDialect). This class implements the method
340+
/// exposed by the OperationName class, and in addition defines the TypeID of
341+
/// the op that will be defined. Each dynamic operation definition refers to one
342+
/// instance of this class.
343+
class DynamicOpDefinition : public OperationName::Impl {
344344
public:
345+
using GetCanonicalizationPatternsFn =
346+
llvm::unique_function<void(RewritePatternSet &, MLIRContext *) const>;
347+
345348
/// Create a new op at runtime. The op is registered only after passing it to
346349
/// the dialect using registerDynamicOp.
347350
static std::unique_ptr<DynamicOpDefinition>
@@ -361,8 +364,7 @@ class DynamicOpDefinition {
361364
OperationName::ParseAssemblyFn &&parseFn,
362365
OperationName::PrintAssemblyFn &&printFn,
363366
OperationName::FoldHookFn &&foldHookFn,
364-
OperationName::GetCanonicalizationPatternsFn
365-
&&getCanonicalizationPatternsFn,
367+
GetCanonicalizationPatternsFn &&getCanonicalizationPatternsFn,
366368
OperationName::PopulateDefaultAttrsFn &&populateDefaultAttrsFn);
367369

368370
/// Returns the op typeID.
@@ -400,9 +402,8 @@ class DynamicOpDefinition {
400402

401403
/// Set the hook returning any canonicalization pattern rewrites that the op
402404
/// supports, for use by the canonicalization pass.
403-
void
404-
setGetCanonicalizationPatternsFn(OperationName::GetCanonicalizationPatternsFn
405-
&&getCanonicalizationPatterns) {
405+
void setGetCanonicalizationPatternsFn(
406+
GetCanonicalizationPatternsFn &&getCanonicalizationPatterns) {
406407
getCanonicalizationPatternsFn = std::move(getCanonicalizationPatterns);
407408
}
408409

@@ -412,6 +413,33 @@ class DynamicOpDefinition {
412413
populateDefaultAttrsFn = std::move(populateDefaultAttrs);
413414
}
414415

416+
LogicalResult foldHook(Operation *op, ArrayRef<Attribute> attrs,
417+
SmallVectorImpl<OpFoldResult> &results) final {
418+
return foldHookFn(op, attrs, results);
419+
}
420+
void getCanonicalizationPatterns(RewritePatternSet &set,
421+
MLIRContext *context) final {
422+
getCanonicalizationPatternsFn(set, context);
423+
}
424+
bool hasTrait(TypeID id) final { return false; }
425+
OperationName::ParseAssemblyFn getParseAssemblyFn() final {
426+
return [&](OpAsmParser &parser, OperationState &state) {
427+
return parseFn(parser, state);
428+
};
429+
}
430+
void populateDefaultAttrs(const OperationName &name,
431+
NamedAttrList &attrs) final {
432+
populateDefaultAttrsFn(name, attrs);
433+
}
434+
void printAssembly(Operation *op, OpAsmPrinter &printer,
435+
StringRef name) final {
436+
printFn(op, printer, name);
437+
}
438+
LogicalResult verifyInvariants(Operation *op) final { return verifyFn(op); }
439+
LogicalResult verifyRegionInvariants(Operation *op) final {
440+
return verifyRegionFn(op);
441+
}
442+
415443
private:
416444
DynamicOpDefinition(
417445
StringRef name, ExtensibleDialect *dialect,
@@ -420,26 +448,18 @@ class DynamicOpDefinition {
420448
OperationName::ParseAssemblyFn &&parseFn,
421449
OperationName::PrintAssemblyFn &&printFn,
422450
OperationName::FoldHookFn &&foldHookFn,
423-
OperationName::GetCanonicalizationPatternsFn
424-
&&getCanonicalizationPatternsFn,
451+
GetCanonicalizationPatternsFn &&getCanonicalizationPatternsFn,
425452
OperationName::PopulateDefaultAttrsFn &&populateDefaultAttrsFn);
426453

427-
/// Unique identifier for this operation.
428-
TypeID typeID;
429-
430-
/// Name of the operation.
431-
/// The name is prefixed with the dialect name.
432-
std::string name;
433-
434454
/// Dialect defining this operation.
435-
ExtensibleDialect *dialect;
455+
ExtensibleDialect *getdialect();
436456

437457
OperationName::VerifyInvariantsFn verifyFn;
438458
OperationName::VerifyRegionInvariantsFn verifyRegionFn;
439459
OperationName::ParseAssemblyFn parseFn;
440460
OperationName::PrintAssemblyFn printFn;
441461
OperationName::FoldHookFn foldHookFn;
442-
OperationName::GetCanonicalizationPatternsFn getCanonicalizationPatternsFn;
462+
GetCanonicalizationPatternsFn getCanonicalizationPatternsFn;
443463
OperationName::PopulateDefaultAttrsFn populateDefaultAttrsFn;
444464

445465
friend ExtensibleDialect;

mlir/include/mlir/IR/OpDefinition.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,7 @@ class OpState {
184184
MLIRContext *context) {}
185185

186186
/// This hook populates any unset default attrs.
187-
static void populateDefaultAttrs(const RegisteredOperationName &,
188-
NamedAttrList &) {}
187+
static void populateDefaultAttrs(const OperationName &, NamedAttrList &) {}
189188

190189
protected:
191190
/// If the concrete type didn't implement a custom verifier hook, just fall
@@ -1833,20 +1832,11 @@ class Op : public OpState, public Traits<ConcreteType>... {
18331832
return result;
18341833
}
18351834

1836-
/// Implementation of `GetCanonicalizationPatternsFn` OperationName hook.
1837-
static OperationName::GetCanonicalizationPatternsFn
1838-
getGetCanonicalizationPatternsFn() {
1839-
return &ConcreteType::getCanonicalizationPatterns;
1840-
}
18411835
/// Implementation of `GetHasTraitFn`
18421836
static OperationName::HasTraitFn getHasTraitFn() {
18431837
return
18441838
[](TypeID id) { return op_definition_impl::hasTrait<Traits...>(id); };
18451839
}
1846-
/// Implementation of `ParseAssemblyFn` OperationName hook.
1847-
static OperationName::ParseAssemblyFn getParseAssemblyFn() {
1848-
return &ConcreteType::parse;
1849-
}
18501840
/// Implementation of `PrintAssemblyFn` OperationName hook.
18511841
static OperationName::PrintAssemblyFn getPrintAssemblyFn() {
18521842
if constexpr (detect_has_print<ConcreteType>::value)

mlir/include/mlir/IR/Operation.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -506,11 +506,9 @@ class alignas(8) Operation final
506506

507507
/// Sets default attributes on unset attributes.
508508
void populateDefaultAttrs() {
509-
if (auto registered = getRegisteredInfo()) {
510509
NamedAttrList attrs(getAttrDictionary());
511-
registered->populateDefaultAttrs(attrs);
510+
name.populateDefaultAttrs(attrs);
512511
setAttrs(attrs.getDictionary(getContext()));
513-
}
514512
}
515513

516514
//===--------------------------------------------------------------------===//

0 commit comments

Comments
 (0)