[Mlir-commits] [mlir] b49bb7b - [MLIR][PDL] Add support for representing and lowering negated constraints
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Aug 24 10:47:58 PDT 2023
Author: Mogball
Date: 2023-08-24T17:47:48Z
New Revision: b49bb7bdec067a1d48a4502399961667d2525444
URL: https://github.com/llvm/llvm-project/commit/b49bb7bdec067a1d48a4502399961667d2525444
DIFF: https://github.com/llvm/llvm-project/commit/b49bb7bdec067a1d48a4502399961667d2525444.diff
LOG: [MLIR][PDL] Add support for representing and lowering negated constraints
This commit enables modelling negation of native constraints.
This is accomplished through an attribute `isNegated` on the operations `pdl.apply_native_constraint` and `pdl_interp.apply_constraint` and according adjustments to the conversion in the ConvertPDLToPDLInterpPass.
Reviewed By: Mogball
Differential Revision: https://reviews.llvm.org/D153871
Added:
Modified:
mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
mlir/lib/Conversion/PDLToPDLInterp/PDLToPDLInterp.cpp
mlir/lib/Conversion/PDLToPDLInterp/Predicate.h
mlir/lib/Conversion/PDLToPDLInterp/PredicateTree.cpp
mlir/test/Conversion/PDLToPDLInterp/pdl-to-pdl-interp-matcher.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td b/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
index d5b5d2be1c6a31..4e9ebccba77d88 100644
--- a/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
+++ b/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
@@ -45,7 +45,9 @@ def PDL_ApplyNativeConstraintOp
```
}];
- let arguments = (ins StrAttr:$name, Variadic<PDL_AnyType>:$args);
+ let arguments = (ins StrAttr:$name,
+ Variadic<PDL_AnyType>:$args,
+ DefaultValuedAttr<BoolAttr, "false">:$isNegated);
let assemblyFormat = "$name `(` $args `:` type($args) `)` attr-dict";
let hasVerifier = 1;
}
diff --git a/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td b/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
index efb75f06970da7..92a86582879135 100644
--- a/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
+++ b/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
@@ -90,7 +90,8 @@ def PDLInterp_ApplyConstraintOp : PDLInterp_PredicateOp<"apply_constraint"> {
`pdl_interp.apply_constraint` operations apply a generic constraint, that
has been registered with the interpreter, with a given set of positional
values. On success, this operation branches to the true destination,
- otherwise the false destination is taken.
+ otherwise the false destination is taken. This behavior can be reversed
+ by setting the attribute `isNegated` to true.
Example:
@@ -101,7 +102,9 @@ def PDLInterp_ApplyConstraintOp : PDLInterp_PredicateOp<"apply_constraint"> {
```
}];
- let arguments = (ins StrAttr:$name, Variadic<PDL_AnyType>:$args);
+ let arguments = (ins StrAttr:$name,
+ Variadic<PDL_AnyType>:$args,
+ DefaultValuedAttr<BoolAttr, "false">:$isNegated);
let assemblyFormat = [{
$name `(` $args `:` type($args) `)` attr-dict `->` successors
}];
diff --git a/mlir/lib/Conversion/PDLToPDLInterp/PDLToPDLInterp.cpp b/mlir/lib/Conversion/PDLToPDLInterp/PDLToPDLInterp.cpp
index b9a1cc93ffd95b..2000f2336a6b7d 100644
--- a/mlir/lib/Conversion/PDLToPDLInterp/PDLToPDLInterp.cpp
+++ b/mlir/lib/Conversion/PDLToPDLInterp/PDLToPDLInterp.cpp
@@ -447,8 +447,9 @@ void PatternLowering::generate(BoolNode *boolNode, Block *¤tBlock,
}
case Predicates::ConstraintQuestion: {
auto *cstQuestion = cast<ConstraintQuestion>(question);
- builder.create<pdl_interp::ApplyConstraintOp>(loc, cstQuestion->getName(),
- args, success, failure);
+ builder.create<pdl_interp::ApplyConstraintOp>(
+ loc, cstQuestion->getName(), args, cstQuestion->getIsNegated(), success,
+ failure);
break;
}
default:
diff --git a/mlir/lib/Conversion/PDLToPDLInterp/Predicate.h b/mlir/lib/Conversion/PDLToPDLInterp/Predicate.h
index 1027ed00757ce3..2c9b63f86d6efa 100644
--- a/mlir/lib/Conversion/PDLToPDLInterp/Predicate.h
+++ b/mlir/lib/Conversion/PDLToPDLInterp/Predicate.h
@@ -450,7 +450,7 @@ struct AttributeQuestion
/// Apply a parameterized constraint to multiple position values.
struct ConstraintQuestion
: public PredicateBase<ConstraintQuestion, Qualifier,
- std::tuple<StringRef, ArrayRef<Position *>>,
+ std::tuple<StringRef, ArrayRef<Position *>, bool>,
Predicates::ConstraintQuestion> {
using Base::Base;
@@ -460,11 +460,20 @@ struct ConstraintQuestion
/// Return the arguments of the constraint.
ArrayRef<Position *> getArgs() const { return std::get<1>(key); }
+ /// Return the negation status of the constraint.
+ bool getIsNegated() const { return std::get<2>(key); }
+
/// Construct an instance with the given storage allocator.
static ConstraintQuestion *construct(StorageUniquer::StorageAllocator &alloc,
KeyTy key) {
return Base::construct(alloc, KeyTy{alloc.copyInto(std::get<0>(key)),
- alloc.copyInto(std::get<1>(key))});
+ alloc.copyInto(std::get<1>(key)),
+ std::get<2>(key)});
+ }
+
+ /// Returns a hash suitable for the given keytype.
+ static llvm::hash_code hashKey(const KeyTy &key) {
+ return llvm::hash_value(key);
}
};
@@ -664,9 +673,11 @@ class PredicateBuilder {
}
/// Create a predicate that applies a generic constraint.
- Predicate getConstraint(StringRef name, ArrayRef<Position *> pos) {
- return {ConstraintQuestion::get(uniquer, std::make_tuple(name, pos)),
- TrueAnswer::get(uniquer)};
+ Predicate getConstraint(StringRef name, ArrayRef<Position *> pos,
+ bool isNegated) {
+ return {
+ ConstraintQuestion::get(uniquer, std::make_tuple(name, pos, isNegated)),
+ TrueAnswer::get(uniquer)};
}
/// Create a predicate comparing a value with null.
diff --git a/mlir/lib/Conversion/PDLToPDLInterp/PredicateTree.cpp b/mlir/lib/Conversion/PDLToPDLInterp/PredicateTree.cpp
index 7078e238b86df0..baab40020ac2e9 100644
--- a/mlir/lib/Conversion/PDLToPDLInterp/PredicateTree.cpp
+++ b/mlir/lib/Conversion/PDLToPDLInterp/PredicateTree.cpp
@@ -273,7 +273,7 @@ static void getConstraintPredicates(pdl::ApplyNativeConstraintOp op,
Position *pos = *std::max_element(allPositions.begin(), allPositions.end(),
comparePosDepth);
PredicateBuilder::Predicate pred =
- builder.getConstraint(op.getName(), allPositions);
+ builder.getConstraint(op.getName(), allPositions, op.getIsNegated());
predList.emplace_back(pos, pred);
}
diff --git a/mlir/test/Conversion/PDLToPDLInterp/pdl-to-pdl-interp-matcher.mlir b/mlir/test/Conversion/PDLToPDLInterp/pdl-to-pdl-interp-matcher.mlir
index b94451c4a08689..02bb8316c02db0 100644
--- a/mlir/test/Conversion/PDLToPDLInterp/pdl-to-pdl-interp-matcher.mlir
+++ b/mlir/test/Conversion/PDLToPDLInterp/pdl-to-pdl-interp-matcher.mlir
@@ -79,6 +79,20 @@ module @constraints {
// -----
+// CHECK-LABEL: module @negated_constraint
+module @negated_constraint {
+ // CHECK: func @matcher(%[[ROOT:.*]]: !pdl.operation)
+ // CHECK: pdl_interp.apply_constraint "constraint"(%[[ROOT]] : !pdl.operation) {isNegated = true}
+ // CHECK: pdl_interp.record_match @rewriters::@pdl_generated_rewriter(%[[ROOT]] : !pdl.operation)
+ pdl.pattern : benefit(1) {
+ %root = operation
+ pdl.apply_native_constraint "constraint"(%root : !pdl.operation) {isNegated = true}
+ rewrite %root with "rewriter"
+ }
+}
+
+// -----
+
// CHECK-LABEL: module @inputs
module @inputs {
// CHECK: func @matcher(%[[ROOT:.*]]: !pdl.operation)
More information about the Mlir-commits
mailing list