[Mlir-commits] [mlir] 0ac21e6 - [mlir][IR] SingleBlockImplicitTerminator: Declare "inherited" trait in ODS instead of C++
Matthias Springer
llvmlistbot at llvm.org
Wed Aug 30 06:27:01 PDT 2023
Author: Matthias Springer
Date: 2023-08-30T15:26:47+02:00
New Revision: 0ac21e654f194a0f7c9f5afe42e11924c546f89e
URL: https://github.com/llvm/llvm-project/commit/0ac21e654f194a0f7c9f5afe42e11924c546f89e
DIFF: https://github.com/llvm/llvm-project/commit/0ac21e654f194a0f7c9f5afe42e11924c546f89e.diff
LOG: [mlir][IR] SingleBlockImplicitTerminator: Declare "inherited" trait in ODS instead of C++
`SingleBlockImplicitTerminator` is now a combination of two traits: `SingleBlock` and `SingleBlockImplicitTerminatorImpl` (the original `SingleBlockImplicitTerminator`).
This change makes it possible to check if the `SingleBlock` op trait is implemented. Until now, `Operation::hasTrait<OpTrait::SingleBlock>()` returned `false` for ops that implement `SingleBlockImplicitTerminator`.
Differential Revision: https://reviews.llvm.org/D159078
Added:
Modified:
mlir/include/mlir/IR/OpBase.td
mlir/include/mlir/IR/OpDefinition.h
mlir/test/mlir-tblgen/gen-dialect-doc.td
mlir/tools/mlir-tblgen/OpFormatGen.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td
index b45b387d857e22..47678a498f7952 100644
--- a/mlir/include/mlir/IR/OpBase.td
+++ b/mlir/include/mlir/IR/OpBase.td
@@ -122,10 +122,13 @@ def ElementwiseMappable : TraitList<[
// Op's regions have a single block.
def SingleBlock : NativeOpTrait<"SingleBlock">, StructuralOpTrait;
+class SingleBlockImplicitTerminatorImpl<string op>
+ : ParamNativeOpTrait<"SingleBlockImplicitTerminator", op, [SingleBlock]>,
+ StructuralOpTrait;
+
// Op's regions have a single block with the specified terminator.
class SingleBlockImplicitTerminator<string op>
- : ParamNativeOpTrait<"SingleBlockImplicitTerminator", op>,
- StructuralOpTrait;
+ : TraitList<[SingleBlock, SingleBlockImplicitTerminatorImpl<op>]>;
// Op's regions don't have terminator.
def NoTerminator : NativeOpTrait<"NoTerminator">, StructuralOpTrait;
diff --git a/mlir/include/mlir/IR/OpDefinition.h b/mlir/include/mlir/IR/OpDefinition.h
index cba9bb30006184..f241c194a0d39d 100644
--- a/mlir/include/mlir/IR/OpDefinition.h
+++ b/mlir/include/mlir/IR/OpDefinition.h
@@ -943,9 +943,8 @@ struct SingleBlock : public TraitBase<ConcreteType, SingleBlock> {
template <typename TerminatorOpType>
struct SingleBlockImplicitTerminator {
template <typename ConcreteType>
- class Impl : public SingleBlock<ConcreteType> {
+ class Impl {
private:
- using Base = SingleBlock<ConcreteType>;
/// Builds a terminator operation without relying on OpBuilder APIs to avoid
/// cyclic header inclusion.
static Operation *buildTerminator(OpBuilder &builder, Location loc) {
@@ -959,8 +958,6 @@ struct SingleBlockImplicitTerminator {
using ImplicitTerminatorOpT = TerminatorOpType;
static LogicalResult verifyRegionTrait(Operation *op) {
- if (failed(Base::verifyTrait(op)))
- return failure();
for (unsigned i = 0, e = op->getNumRegions(); i < e; ++i) {
Region ®ion = op->getRegion(i);
// Empty regions are fine.
@@ -1002,7 +999,6 @@ struct SingleBlockImplicitTerminator {
//===------------------------------------------------------------------===//
// Single Region Utilities
//===------------------------------------------------------------------===//
- using Base::getBody;
template <typename OpT, typename T = void>
using enable_if_single_region =
@@ -1011,7 +1007,8 @@ struct SingleBlockImplicitTerminator {
/// Insert the operation into the back of the body, before the terminator.
template <typename OpT = ConcreteType>
enable_if_single_region<OpT> push_back(Operation *op) {
- insert(Block::iterator(getBody()->getTerminator()), op);
+ Block *body = static_cast<SingleBlock<ConcreteType> *>(this)->getBody();
+ insert(Block::iterator(body->getTerminator()), op);
}
/// Insert the operation at the given insertion point. Note: The operation
@@ -1024,7 +1021,7 @@ struct SingleBlockImplicitTerminator {
template <typename OpT = ConcreteType>
enable_if_single_region<OpT> insert(Block::iterator insertPt,
Operation *op) {
- auto *body = getBody();
+ Block *body = static_cast<SingleBlock<ConcreteType> *>(this)->getBody();
if (insertPt == body->end())
insertPt = Block::iterator(body->getTerminator());
body->getOperations().insert(insertPt, op);
diff --git a/mlir/test/mlir-tblgen/gen-dialect-doc.td b/mlir/test/mlir-tblgen/gen-dialect-doc.td
index ca961edd34a64e..120164345fb2ce 100644
--- a/mlir/test/mlir-tblgen/gen-dialect-doc.td
+++ b/mlir/test/mlir-tblgen/gen-dialect-doc.td
@@ -81,7 +81,7 @@ def TestTypeDefParams : TypeDef<Test_Dialect, "TestTypeDefParams"> {
// CHECK: Other group
// CHECK: test.b
// CHECK: test.c
-// CHECK: Traits: SingleBlockImplicitTerminator<YieldOp>
+// CHECK: Traits: SingleBlock, SingleBlockImplicitTerminator<YieldOp>
// CHECK: Interfaces: NoMemoryEffect (MemoryEffectOpInterface)
// CHECK: Effects: MemoryEffects::Effect{}
diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp
index 74c4c7eece74e7..c0ba58dd2b15f4 100644
--- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp
@@ -313,11 +313,10 @@ struct OperationFormat {
resultTypes.resize(op.getNumResults(), TypeResolution());
hasImplicitTermTrait = llvm::any_of(op.getTraits(), [](const Trait &trait) {
- return trait.getDef().isSubClassOf("SingleBlockImplicitTerminator");
+ return trait.getDef().isSubClassOf("SingleBlockImplicitTerminatorImpl");
});
- hasSingleBlockTrait =
- hasImplicitTermTrait || op.getTrait("::mlir::OpTrait::SingleBlock");
+ hasSingleBlockTrait = op.getTrait("::mlir::OpTrait::SingleBlock");
}
/// Generate the operation parser from this format.
More information about the Mlir-commits
mailing list