Op<TEST_Dialect, mnemonic, traits>;
//===----------------------------------------------------------------------===//
-// Test 'verifyUnusedValue'
-//===----------------------------------------------------------------------===//
-
-def VUVTwoResultOp : TEST_Op<"vuv_two_result_op", []> {
- let arguments = (ins I32:$input);
- let results = (outs I32:$r1, I32:$r2);
-}
-
-def VUVFoldTwoResultOp : Pattern<(VUVTwoResultOp $input), [
- (verifyUnusedValue),
- (replaceWithValue $input)
- ]>;
-
-//===----------------------------------------------------------------------===//
// Test Types
//===----------------------------------------------------------------------===//
}
//===----------------------------------------------------------------------===//
+// Test Regions
+//===----------------------------------------------------------------------===//
+
+def TwoRegionOp : TEST_Op<"two_region_op", []> {
+ let regions = (region AnyRegion, AnyRegion);
+}
+
+def SizedRegionOp : TEST_Op<"sized_region_op", []> {
+ let regions = (region SizedRegion<2>:$my_region, SizedRegion<1>);
+}
+
+//===----------------------------------------------------------------------===//
// Test Traits
//===----------------------------------------------------------------------===//
// Test named pattern.
def TestNamedPatternRule : Pat<(OpA $input, $attr), (OpB $input, $attr)>;
-// Test with constant attr.
-def OpC : TEST_Op<"op_c">, Arguments<(ins I32:$arg)>, Results<(outs I32:$res)>;
-def : Pat<(OpC $input), (OpB $input, ConstantAttr<I32Attr, "17">:$attr)>;
-
// Test with fused location.
def : Pat<(OpA (OpA $input, $attr), $bttr), (OpB $input, $bttr)>;
def : Pat<(OpG $input), (OpB $input, ConstantAttr<I32Attr, "20">:$attr)>;
def : Pat<(OpG (OpG $input)), (OpB $input, ConstantAttr<I32Attr, "34">:$attr)>;
+//===----------------------------------------------------------------------===//
+// Test Patterns (Attributes)
+
+// Test matching against op attributes.
+def OpAttrMatch1 : TEST_Op<"match_op_attribute1"> {
+ let arguments = (ins
+ I32Attr:$required_attr,
+ OptionalAttr<I32Attr>:$optional_attr,
+ DefaultValuedAttr<I32Attr, "42">:$default_valued_attr,
+ I32Attr:$more_attr
+ );
+ let results = (outs I32:$output);
+}
+def OpAttrMatch2 : TEST_Op<"match_op_attribute2"> {
+ let arguments = OpAttrMatch1.arguments;
+ let results = (outs I32:$output);
+}
+def MoreConstraint : AttrConstraint<
+ CPred<"$_self.cast<IntegerAttr>().getInt() == 4">, "more constraint">;
+def : Pat<(OpAttrMatch1 $required, $optional, $default_valued,
+ MoreConstraint:$more),
+ (OpAttrMatch2 $required, $optional, $default_valued, $more)>;
+
+// Test with constant attr.
+def OpC : TEST_Op<"op_c">, Arguments<(ins I32:$arg)>, Results<(outs I32:$res)>;
+def : Pat<(OpC $input), (OpB $input, ConstantAttr<I32Attr, "17">:$attr)>;
+
// Test string enum attribute in rewrites.
def : Pat<(StrEnumAttrOp StrCaseA), (StrEnumAttrOp StrCaseB)>;
// Test integer enum attribute in rewrites.
//===----------------------------------------------------------------------===//
// Test Patterns (Multi-result Ops)
-//===----------------------------------------------------------------------===//
def MultiResultOpKind1: I64EnumAttrCase<"kind1", 1>;
def MultiResultOpKind2: I64EnumAttrCase<"kind2", 2>;
(TwoResultOp:$res2__1 MultiResultOpKind4)]>;
//===----------------------------------------------------------------------===//
-// Test op regions
+// Test Directives
//===----------------------------------------------------------------------===//
-def TwoRegionOp : TEST_Op<"two_region_op", []> {
- let regions = (region AnyRegion, AnyRegion);
-}
-
-def SizedRegionOp : TEST_Op<"sized_region_op", []> {
- let regions = (region SizedRegion<2>:$my_region, SizedRegion<1>);
+// Test 'verifyUnusedValue'
+def VUVTwoResultOp : TEST_Op<"vuv_two_result_op", []> {
+ let arguments = (ins I32:$input);
+ let results = (outs I32:$r1, I32:$r2);
}
+def VUVFoldTwoResultOp : Pattern<(VUVTwoResultOp $input), [
+ (verifyUnusedValue),
+ (replaceWithValue $input)
+ ]>;
//===----------------------------------------------------------------------===//
// Test Legalization
+++ /dev/null
-// RUN: mlir-tblgen -gen-rewriters -I %S/../../include %s | FileCheck %s
-
-include "mlir/IR/OpBase.td"
-
-def Test_Dialect : Dialect {
- let name = "test";
-}
-class NS_Op<string mnemonic, list<OpTrait> traits> :
- Op<Test_Dialect, mnemonic, traits>;
-
-def MoreConstraint : AttrConstraint<CPred<"MoreConstraint">, "more constraint">;
-
-def OpA : NS_Op<"op_a", []> {
- let arguments = (ins
- I32Attr:$required_attr,
- OptionalAttr<I32Attr>:$optional_attr,
- DefaultValuedAttr<I32Attr, "42">:$default_valued_attr,
- I32Attr:$more_attr
- );
-
- let results = (outs I32:$result);
-}
-
-def : Pat<(OpA $required, $optional, $default_valued, MoreConstraint:$more),
- (OpA $required, $optional, $default_valued, $more)>;
-
-// Test attribute capturing
-// ---
-
-// CHECK-LABEL: struct GeneratedConvert0
-
-// CHECK: auto attr = op0->getAttrOfType<IntegerAttr>("required_attr");
-// CHECK-NEXT: if (!attr) return matchFailure();
-// CHECK-NEXT: s.required = attr;
-
-// CHECK: auto attr = op0->getAttrOfType<IntegerAttr>("optional_attr");
-// CHECK-NEXT: s.optional = attr;
-
-// CHECK: auto attr = op0->getAttrOfType<IntegerAttr>("default_valued_attr");
-// CHECK-NEXT: if (!attr) attr = mlir::Builder(ctx).getIntegerAttr(mlir::Builder(ctx).getIntegerType(32), 42);
-// CHECK-NEXT: s.default_valued = attr;
-
-// CHECK: auto attr = op0->getAttrOfType<IntegerAttr>("more_attr");
-// CHECK-NEXT: if (!attr) return matchFailure();
-// CHECK-NEXT: if (!((MoreConstraint))) return matchFailure();
-// CHECK-NEXT: s.more = attr;
-
// RUN: mlir-opt -test-patterns -mlir-print-debuginfo %s | FileCheck %s
-// CHECK-LABEL: verifyConstantAttr
-func @verifyConstantAttr(%arg0 : i32) -> i32 {
- %0 = "test.op_c"(%arg0) : (i32) -> i32 loc("a")
-
- // CHECK: "test.op_b"(%arg0) {attr = 17 : i32} : (i32) -> i32 loc("a")
- return %0 : i32
-}
-
// CHECK-LABEL: verifyFusedLocs
func @verifyFusedLocs(%arg0 : i32) -> i32 {
%0 = "test.op_a"(%arg0) {attr = 10 : i32} : (i32) -> i32 loc("a")
return %0 : i32
}
+//===----------------------------------------------------------------------===//
+// Test Attributes
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: succeedMatchOpAttr
+func @succeedMatchOpAttr() -> i32 {
+ // CHECK: "test.match_op_attribute2"() {default_valued_attr = 3 : i32, more_attr = 4 : i32, optional_attr = 2 : i32, required_attr = 1 : i32}
+ %0 = "test.match_op_attribute1"() {required_attr = 1: i32, optional_attr = 2: i32, default_valued_attr = 3: i32, more_attr = 4: i32} : () -> (i32)
+ return %0: i32
+}
+
+// CHECK-LABEL: succeedMatchMissingOptionalAttr
+func @succeedMatchMissingOptionalAttr() -> i32 {
+ // CHECK: "test.match_op_attribute2"() {default_valued_attr = 3 : i32, more_attr = 4 : i32, required_attr = 1 : i32}
+ %0 = "test.match_op_attribute1"() {required_attr = 1: i32, default_valued_attr = 3: i32, more_attr = 4: i32} : () -> (i32)
+ return %0: i32
+}
+
+// CHECK-LABEL: succeedMatchMissingDefaultValuedAttr
+func @succeedMatchMissingDefaultValuedAttr() -> i32 {
+ // CHECK: "test.match_op_attribute2"() {default_valued_attr = 42 : i32, more_attr = 4 : i32, optional_attr = 2 : i32, required_attr = 1 : i32}
+ %0 = "test.match_op_attribute1"() {required_attr = 1: i32, optional_attr = 2: i32, more_attr = 4: i32} : () -> (i32)
+ return %0: i32
+}
+
+// CHECK-LABEL: failedMatchAdditionalConstraintNotSatisfied
+func @failedMatchAdditionalConstraintNotSatisfied() -> i32 {
+ // CHECK: "test.match_op_attribute1"()
+ %0 = "test.match_op_attribute1"() {required_attr = 1: i32, optional_attr = 2: i32, more_attr = 5: i32} : () -> (i32)
+ return %0: i32
+}
+
+// CHECK-LABEL: verifyConstantAttr
+func @verifyConstantAttr(%arg0 : i32) -> i32 {
+ // CHECK: "test.op_b"(%arg0) {attr = 17 : i32} : (i32) -> i32 loc("a")
+ %0 = "test.op_c"(%arg0) : (i32) -> i32 loc("a")
+ return %0 : i32
+}
+
+//===----------------------------------------------------------------------===//
+// Test Enum Attributes
+//===----------------------------------------------------------------------===//
+
// CHECK-LABEL: verifyStrEnumAttr
func @verifyStrEnumAttr() -> i32 {
// CHECK: "test.str_enum_attr"() {attr = "B"}