| // RUN: mlir-pdll %s -I %S -I %S/../../../include -split-input-file | FileCheck %s |
| |
| //===----------------------------------------------------------------------===// |
| // AttrExpr |
| //===----------------------------------------------------------------------===// |
| |
| // CHECK: Module |
| // CHECK: `-AttributeExpr {{.*}} Value<"10: i32"> |
| Pattern { |
| let attr = attr<"10: i32">; |
| |
| erase _: Op; |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // CallExpr |
| //===----------------------------------------------------------------------===// |
| |
| // CHECK: Module |
| // CHECK: |-UserConstraintDecl {{.*}} Name<MakeRootOp> ResultType<Op<my_dialect.foo>> |
| // CHECK: `-CallExpr {{.*}} Type<Op<my_dialect.foo>> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Constraint> |
| // CHECK: `-UserConstraintDecl {{.*}} Name<MakeRootOp> ResultType<Op<my_dialect.foo>> |
| Constraint MakeRootOp() => op<my_dialect.foo>; |
| |
| Pattern { |
| erase MakeRootOp(); |
| } |
| |
| // ----- |
| |
| // CHECK: Module |
| // CHECK: |-UserRewriteDecl {{.*}} Name<CreateNewOp> ResultType<Op<my_dialect.foo>> |
| // CHECK: `-PatternDecl {{.*}} |
| // CHECK: `-CallExpr {{.*}} Type<Op<my_dialect.foo>> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Rewrite> |
| // CHECK: `-UserRewriteDecl {{.*}} Name<CreateNewOp> ResultType<Op<my_dialect.foo>> |
| // CHECK: `Arguments` |
| // CHECK: `-MemberAccessExpr {{.*}} Member<$results> Type<ValueRange> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Op<my_dialect.bar>> |
| // CHECK: `-VariableDecl {{.*}} Name<inputOp> Type<Op<my_dialect.bar>> |
| Rewrite CreateNewOp(inputs: ValueRange) => op<my_dialect.foo>(inputs); |
| |
| Pattern { |
| let inputOp = op<my_dialect.bar>; |
| replace op<my_dialect.bar>(inputOp) with CreateNewOp(inputOp); |
| } |
| |
| // ----- |
| |
| // CHECK: Module {{.*}} |
| // CHECK: -UserConstraintDecl {{.*}} Name<TestConstraint> ResultType<Tuple<>> |
| // CHECK: `-PatternDecl {{.*}} |
| // CHECK: -CallExpr {{.*}} Type<Tuple<>> Negated |
| // CHECK: `-DeclRefExpr {{.*}} Type<Constraint> |
| // CHECK: `-UserConstraintDecl {{.*}} Name<TestConstraint> ResultType<Tuple<>> |
| Constraint TestConstraint(op: Op); |
| |
| Pattern { |
| let inputOp = op<my_dialect.bar>; |
| not TestConstraint(inputOp); |
| erase inputOp; |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // MemberAccessExpr |
| //===----------------------------------------------------------------------===// |
| |
| // CHECK: Module |
| // CHECK: `-VariableDecl {{.*}} Name<firstEltIndex> Type<Op> |
| // CHECK: `-MemberAccessExpr {{.*}} Member<0> Type<Op> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Tuple<firstElt: Op>> |
| // CHECK: `-VariableDecl {{.*}} Name<firstEltName> Type<Op> |
| // CHECK: `-MemberAccessExpr {{.*}} Member<firstElt> Type<Op> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Tuple<firstElt: Op>> |
| Pattern { |
| let tuple = (firstElt = _: Op); |
| let firstEltIndex = tuple.0; |
| let firstEltName = tuple.firstElt; |
| |
| erase _: Op; |
| } |
| |
| // ----- |
| |
| #include "include/ops.td" |
| |
| // CHECK: Module |
| // CHECK: `-VariableDecl {{.*}} Name<firstEltIndex> Type<Value> |
| // CHECK: `-MemberAccessExpr {{.*}} Member<0> Type<Value> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Op<test.all_single>> |
| // CHECK: `-VariableDecl {{.*}} Name<firstEltName> Type<Value> |
| // CHECK: `-MemberAccessExpr {{.*}} Member<result> Type<Value> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Op<test.all_single>> |
| Pattern { |
| let op: Op<test.all_single>; |
| let firstEltIndex = op.0; |
| let firstEltName = op.result; |
| |
| erase op; |
| } |
| |
| // ----- |
| |
| // CHECK: Module |
| // CHECK: `-VariableDecl {{.*}} Name<op> Type<Op<my_dialect.unregistered_foo>> |
| // CHECK: `-OperationExpr {{.*}} Type<Op<my_dialect.unregistered_foo>> |
| // CHECK: `-OpNameDecl {{.*}} Name<my_dialect.unregistered_foo> |
| // CHECK: `Operands` |
| // CHECK: `-MemberAccessExpr {{.*}} Member<0> Type<Value> |
| // CHECK: `-OperationExpr {{.*}} Type<Op<my_dialect.unregistered_bar>> |
| // CHECK: `-OpNameDecl {{.*}} Name<my_dialect.unregistered_bar> |
| // CHECK: `Operands` |
| // CHECK: `-DeclRefExpr {{.*}} Type<ValueRange> |
| // CHECK: `-VariableDecl {{.*}} Name<_> Type<ValueRange> |
| // CHECK: `Constraints` |
| // CHECK: `-ValueRangeConstraintDecl |
| Pattern { |
| let op = op<my_dialect.unregistered_foo>(op<my_dialect.unregistered_bar>.0); |
| erase op; |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // OperationExpr |
| //===----------------------------------------------------------------------===// |
| |
| // Test a non-constrained operation expression, and ensure that we don't treat |
| // unconstrained as "not present"(e.g. zero operands). |
| |
| // CHECK: Module |
| // CHECK: `-OperationExpr {{.*}} Type<Op> |
| // CHECK: `-OpNameDecl |
| // CHECK: `Operands` |
| // CHECK: `-DeclRefExpr {{.*}} Type<ValueRange> |
| // CHECK: `-VariableDecl {{.*}} Name<_> Type<ValueRange> |
| // CHECK: `Constraints` |
| // CHECK: `-ValueRangeConstraintDecl |
| // CHECK: `Result Types` |
| // CHECK: `-DeclRefExpr {{.*}} Type<TypeRange> |
| // CHECK: `-VariableDecl {{.*}} Name<_> Type<TypeRange> |
| // CHECK: `Constraints` |
| // CHECK: `-TypeRangeConstraintDecl |
| Pattern { |
| erase op<>; |
| } |
| |
| // ----- |
| |
| // Test explicitly empty operand/result/etc. lists, which are different from the |
| // "unconstrained" examples above. |
| |
| // CHECK: Module |
| // CHECK: `-OperationExpr {{.*}} Type<Op> |
| // CHECK: `-OpNameDecl |
| // CHECK-NOT: `Operands` |
| // CHECK-NOT: `Result Types` |
| Pattern { |
| erase op<>() -> (); |
| } |
| |
| // ----- |
| |
| // CHECK: Module |
| // CHECK: `-OperationExpr {{.*}} Type<Op<my_dialect.foo>> |
| // CHECK: `-OpNameDecl {{.*}} Name<my_dialect.foo> |
| Pattern { |
| erase op<my_dialect.foo>; |
| } |
| |
| // ----- |
| |
| // CHECK: Module |
| // CHECK: `-OperationExpr {{.*}} Type<Op> |
| // CHECK: `-OpNameDecl |
| // CHECK: `Operands` |
| // CHECK: |-DeclRefExpr {{.*}} Type<Value> |
| // CHECK: |-DeclRefExpr {{.*}} Type<ValueRange> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Value> |
| Pattern { |
| erase op<>(_: Value, _: ValueRange, _: Value); |
| } |
| |
| // ----- |
| |
| // CHECK: Module |
| // CHECK: `-OperationExpr {{.*}} Type<Op> |
| // CHECK: `-OpNameDecl |
| // CHECK: `Operands` |
| // CHECK: `-MemberAccessExpr {{.*}} Member<$results> Type<ValueRange> |
| // CHECK: `-OperationExpr {{.*}} Type<Op<my_dialect.bar>> |
| // CHECK: `-OpNameDecl {{.*}} Name<my_dialect.bar> |
| Pattern { |
| erase op<>(op<my_dialect.bar>); |
| } |
| |
| // ----- |
| |
| // CHECK: Module |
| // CHECK: `-OperationExpr {{.*}} Type<Op> |
| // CHECK: `-OpNameDecl |
| // CHECK: `Attributes` |
| // CHECK: |-NamedAttributeDecl {{.*}} Name<unitAttr> |
| // CHECK: `-AttributeExpr {{.*}} Value<"unit"> |
| // CHECK: `-NamedAttributeDecl {{.*}} Name<normal$Attr> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Attr> |
| |
| Pattern { |
| erase op<> {unitAttr, "normal$Attr" = _: Attr}; |
| } |
| |
| // ----- |
| |
| // CHECK: Module |
| // CHECK: `-OperationExpr {{.*}} Type<Op> |
| // CHECK: `-OpNameDecl |
| // CHECK: `Result Types` |
| // CHECK: |-DeclRefExpr {{.*}} Type<Type> |
| // CHECK: |-DeclRefExpr {{.*}} Type<TypeRange> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Type> |
| Pattern { |
| erase op<> -> (_: Type, _: TypeRange, _: Type); |
| } |
| |
| // ----- |
| |
| // Test that we don't need to provide values if all elements |
| // are optional. |
| |
| #include "include/ops.td" |
| |
| // CHECK: Module |
| // CHECK: -OperationExpr {{.*}} Type<Op<test.multi_variadic>> |
| // CHECK-NOT: `Operands` |
| // CHECK-NOT: `Result Types` |
| // CHECK: -OperationExpr {{.*}} Type<Op<test.all_variadic>> |
| // CHECK-NOT: `Operands` |
| // CHECK-NOT: `Result Types` |
| // CHECK: -OperationExpr {{.*}} Type<Op<test.multi_variadic>> |
| // CHECK: `Operands` |
| // CHECK: -RangeExpr {{.*}} Type<ValueRange> |
| // CHECK: -RangeExpr {{.*}} Type<ValueRange> |
| // CHECK: `Result Types` |
| // CHECK: -RangeExpr {{.*}} Type<TypeRange> |
| // CHECK: -RangeExpr {{.*}} Type<TypeRange> |
| Pattern { |
| rewrite op<test.multi_variadic>() -> () with { |
| op<test.all_variadic> -> (); |
| op<test.multi_variadic> -> (); |
| }; |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // TupleExpr |
| //===----------------------------------------------------------------------===// |
| |
| // CHECK: Module |
| // CHECK: `-VariableDecl {{.*}} Name<emptyTuple> |
| // CHECK: `-TupleExpr {{.*}} Type<Tuple<>> |
| // CHECK: `-VariableDecl {{.*}} Name<mixedTuple> |
| // CHECK: `-TupleExpr {{.*}} Type<Tuple<arg1: Attr, Value>> |
| // CHECK: |-DeclRefExpr {{.*}} Type<Attr> |
| // CHECK: `-DeclRefExpr {{.*}} Type<Value> |
| Pattern { |
| let value: Value; |
| |
| let emptyTuple = (); |
| let mixedTuple = (arg1 = _: Attr, value); |
| |
| erase _: Op; |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // RangeExpr |
| //===----------------------------------------------------------------------===// |
| |
| // CHECK: Module |
| // CHECK: `Operands` |
| // CHECK: -RangeExpr {{.*}} Type<ValueRange> |
| // CHECK: -RangeExpr {{.*}} Type<ValueRange> |
| // CHECK: -MemberAccessExpr {{.*}} Member<0> Type<Value> |
| // CHECK: -MemberAccessExpr {{.*}} Member<1> Type<ValueRange> |
| // CHECK: `Result Types` |
| // CHECK: -RangeExpr {{.*}} Type<TypeRange> |
| // CHECK: -RangeExpr {{.*}} Type<TypeRange> |
| // CHECK: -MemberAccessExpr {{.*}} Member<0> Type<Type> |
| // CHECK: -MemberAccessExpr {{.*}} Member<1> Type<TypeRange> |
| Pattern { |
| rewrite op<>(arg: Value, args: ValueRange) -> (type: Type, types: TypeRange) with { |
| op<test.op>((), (arg, args)) -> ((), (type, types)); |
| }; |
| } |
| |
| // ----- |
| |
| //===----------------------------------------------------------------------===// |
| // TypeExpr |
| //===----------------------------------------------------------------------===// |
| |
| // CHECK: Module |
| // CHECK: `-TypeExpr {{.*}} Value<"i64"> |
| Pattern { |
| let type = type<"i64">; |
| |
| erase _: Op; |
| } |