--- /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 AOp : NS_Op<"a_op", []> {
+ let arguments = (ins
+ AnyInteger:$any_integer
+ );
+
+ let results = (outs AnyInteger);
+}
+
+def BOp : NS_Op<"b_op", []> {
+ let arguments = (ins
+ AnyAttr: $any_attr,
+ AnyInteger
+ );
+}
+
+// Tests dag operand indexing for ops with mixed attr and operand.
+// ---
+
+def COp : NS_Op<"c_op", []> {
+ let arguments = (ins
+ AnyAttr: $any_attr1,
+ AnyInteger,
+ AnyAttr: $any_attr2,
+ AnyInteger
+ );
+}
+
+// Only operand 0 should be addressed during matching.
+// CHECK: struct test1 : public ::mlir::RewritePattern {
+// CHECK: castedOp0.getODSOperands(0).begin()).getDefiningOp()
+def test1 : Pat<(BOp $attr, (AOp $input)),
+ (BOp $attr, $input)>;
+
+// Only operand 0 and 1 should be addressed during matching.
+// CHECK: struct test2 : public ::mlir::RewritePattern {
+// CHECK: castedOp0.getODSOperands(0);
+// CHECK: castedOp0.getODSOperands(1).begin()).getDefiningOp()
+def test2 : Pat<(COp $attr1, $op1, $attr2, (AOp $op2)),
+ (BOp $attr1, $op2)>;
if (!name.empty())
os << formatv("{0} = {1};\n", name, castedName);
- for (int i = 0, e = tree.getNumArgs(); i != e; ++i) {
+ for (int i = 0, e = tree.getNumArgs(), nextOperand = 0; i != e; ++i) {
auto opArg = op.getArg(i);
std::string argName = formatv("op{0}", depth + 1);
}
os << "{\n";
+ // Attributes don't count for getODSOperands.
os.indent() << formatv(
"auto *{0} = "
"(*{1}.getODSOperands({2}).begin()).getDefiningOp();\n",
- argName, castedName, i);
+ argName, castedName, nextOperand++);
emitMatch(argTree, argName, depth + 1);
os << formatv("tblgen_ops[{0}] = {1};\n", ++opCounter, argName);
os.unindent() << "}\n";
// Next handle DAG leaf: operand or attribute
if (opArg.is<NamedTypeConstraint *>()) {
+ // emitOperandMatch's argument indexing counts attributes.
emitOperandMatch(tree, castedName, i, depth);
+ ++nextOperand;
} else if (opArg.is<NamedAttribute *>()) {
emitAttributeMatch(tree, opName, i, depth);
} else {