// 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)>;


// Check rewriting with a DAG subtree in the result and remapping a location.
// CHECK: struct test3 : public ::mlir::RewritePattern {
// We expect ODSOperand 0 here, the attribute before the operand in BOp
// definition shouldn't shift the counter.
// CHECK: op1 = (*castedOp0.getODSOperands(0).begin()).getDefiningOp();
// CHECK: rewriter.create<test::BOp>((*a.getODSResults(0).begin()).getLoc()
def test3 : Pat<(BOp $attr, (AOp:$a $input)),
                (BOp $attr, (AOp $input), (location $a))>;

def DOp : NS_Op<"d_op", []> {
  let arguments = (ins
    AnyInteger:$v1,
    AnyInteger:$v2,
    AnyInteger:$v3,
    AnyInteger:$v4,
    AnyInteger:$v5,
    AnyInteger:$v6,
    AnyInteger:$v7,
    AnyInteger:$v8,
    AnyInteger:$v9,
    AnyInteger:$v10
  );

  let results = (outs AnyInteger);
}

def NativeBuilder :
  NativeCodeCall<[{
    nativeCall($_builder, $_loc, $0, $1, $2, $3, $4, $5, $6, $7, $8, $9)
  }]>;

// Check Pattern with large number of DAG arguments passed to NativeCodeCall
// CHECK: struct test4 : public ::mlir::RewritePattern {
// CHECK: nativeCall(rewriter, odsLoc, (*v1.begin()), (*v2.begin()), (*v3.begin()), (*v4.begin()), (*v5.begin()), (*v6.begin()), (*v7.begin()), (*v8.begin()), (*v9.begin()), (*v10.begin()))
def test4 : Pat<(DOp $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10),
                (NativeBuilder $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10)>;

// CHECK: struct test5 : public ::mlir::RewritePattern {
// CHECK: foo(rewriter, (*v4.begin()), (*v5.begin()), (*v6.begin()), (*v7.begin()), (*v8.begin()), (*v9.begin()), (*v10.begin()))
def test5 : Pat<(DOp $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10),
                (NativeCodeCall<[{ foo($_builder, $3...) }]> $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10)>;

// Check Pattern with return type builder.
def SameTypeAs : NativeCodeCall<"$0.getType()">;
// CHECK: struct test6 : public ::mlir::RewritePattern {
// CHECK: tblgen_types.push_back((*v2.begin()).getType())
// CHECK: tblgen_types.push_back(rewriter.getI32Type())
// CHECK: nativeVar_1 = doSomething((*v3.begin()))
// CHECK: tblgen_types.push_back(nativeVar_1)
def test6 : Pat<(DOp $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10),
                (AOp (AOp $v1, (returnType $v2, "$_builder.getI32Type()", (NativeCodeCall<"doSomething($0)"> $v3))))>;
