Skip to content

Commit e055aad

Browse files
committed
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. Differential Revision: https://reviews.llvm.org/D141492
1 parent f72601a commit e055aad

File tree

12 files changed

+328
-279
lines changed

12 files changed

+328
-279
lines changed

mlir/include/mlir/IR/ExtensibleDialect.h

Lines changed: 37 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,29 @@ 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 { return parseFn; }
426+
void populateDefaultAttrs(const OperationName &name,
427+
NamedAttrList &attrs) final {
428+
populateDefaultAttrsFn(name, attrs);
429+
}
430+
void printAssembly(Operation *op, OpAsmPrinter &printer,
431+
StringRef name) final {
432+
printFn(op, printer, name);
433+
}
434+
LogicalResult verifyInvariants(Operation *op) final { return verifyFn(op); }
435+
LogicalResult verifyRegionInvariants(Operation *op) final {
436+
return verifyRegionFn(op);
437+
}
438+
415439
private:
416440
DynamicOpDefinition(
417441
StringRef name, ExtensibleDialect *dialect,
@@ -420,26 +444,18 @@ class DynamicOpDefinition {
420444
OperationName::ParseAssemblyFn &&parseFn,
421445
OperationName::PrintAssemblyFn &&printFn,
422446
OperationName::FoldHookFn &&foldHookFn,
423-
OperationName::GetCanonicalizationPatternsFn
424-
&&getCanonicalizationPatternsFn,
447+
GetCanonicalizationPatternsFn &&getCanonicalizationPatternsFn,
425448
OperationName::PopulateDefaultAttrsFn &&populateDefaultAttrsFn);
426449

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-
434450
/// Dialect defining this operation.
435-
ExtensibleDialect *dialect;
451+
ExtensibleDialect *getdialect();
436452

437453
OperationName::VerifyInvariantsFn verifyFn;
438454
OperationName::VerifyRegionInvariantsFn verifyRegionFn;
439455
OperationName::ParseAssemblyFn parseFn;
440456
OperationName::PrintAssemblyFn printFn;
441457
OperationName::FoldHookFn foldHookFn;
442-
OperationName::GetCanonicalizationPatternsFn getCanonicalizationPatternsFn;
458+
GetCanonicalizationPatternsFn getCanonicalizationPatternsFn;
443459
OperationName::PopulateDefaultAttrsFn populateDefaultAttrsFn;
444460

445461
friend ExtensibleDialect;

mlir/include/mlir/IR/OpDefinition.h

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

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

189188
protected:
190189
/// If the concrete type didn't implement a custom verifier hook, just fall
@@ -1831,20 +1830,11 @@ class Op : public OpState, public Traits<ConcreteType>... {
18311830
return result;
18321831
}
18331832

1834-
/// Implementation of `GetCanonicalizationPatternsFn` OperationName hook.
1835-
static OperationName::GetCanonicalizationPatternsFn
1836-
getGetCanonicalizationPatternsFn() {
1837-
return &ConcreteType::getCanonicalizationPatterns;
1838-
}
18391833
/// Implementation of `GetHasTraitFn`
18401834
static OperationName::HasTraitFn getHasTraitFn() {
18411835
return
18421836
[](TypeID id) { return op_definition_impl::hasTrait<Traits...>(id); };
18431837
}
1844-
/// Implementation of `ParseAssemblyFn` OperationName hook.
1845-
static OperationName::ParseAssemblyFn getParseAssemblyFn() {
1846-
return &ConcreteType::parse;
1847-
}
18481838
/// Implementation of `PrintAssemblyFn` OperationName hook.
18491839
static OperationName::PrintAssemblyFn getPrintAssemblyFn() {
18501840
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
@@ -505,11 +505,9 @@ class alignas(8) Operation final
505505

506506
/// Sets default attributes on unset attributes.
507507
void populateDefaultAttrs() {
508-
if (auto registered = getRegisteredInfo()) {
509508
NamedAttrList attrs(getAttrDictionary());
510-
registered->populateDefaultAttrs(attrs);
509+
name.populateDefaultAttrs(attrs);
511510
setAttrs(attrs.getDictionary(getContext()));
512-
}
513511
}
514512

515513
//===--------------------------------------------------------------------===//

0 commit comments

Comments
 (0)