// 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 ResultType> // CHECK: `-CallExpr {{.*}} Type> // CHECK: `-DeclRefExpr {{.*}} Type // CHECK: `-UserConstraintDecl {{.*}} Name ResultType> Constraint MakeRootOp() => op; Pattern { erase MakeRootOp(); } // ----- // CHECK: Module // CHECK: |-UserRewriteDecl {{.*}} Name ResultType> // CHECK: `-PatternDecl {{.*}} // CHECK: `-CallExpr {{.*}} Type> // CHECK: `-DeclRefExpr {{.*}} Type // CHECK: `-UserRewriteDecl {{.*}} Name ResultType> // CHECK: `Arguments` // CHECK: `-MemberAccessExpr {{.*}} Member<$results> Type // CHECK: `-DeclRefExpr {{.*}} Type> // CHECK: `-VariableDecl {{.*}} Name Type> Rewrite CreateNewOp(inputs: ValueRange) => op(inputs); Pattern { let inputOp = op; replace op(inputOp) with CreateNewOp(inputOp); } // ----- // CHECK: Module {{.*}} // CHECK: -UserConstraintDecl {{.*}} Name ResultType> // CHECK: `-PatternDecl {{.*}} // CHECK: -CallExpr {{.*}} Type> Negated // CHECK: `-DeclRefExpr {{.*}} Type // CHECK: `-UserConstraintDecl {{.*}} Name ResultType> Constraint TestConstraint(op: Op); Pattern { let inputOp = op; not TestConstraint(inputOp); erase inputOp; } // ----- //===----------------------------------------------------------------------===// // MemberAccessExpr //===----------------------------------------------------------------------===// // CHECK: Module // CHECK: `-VariableDecl {{.*}} Name Type // CHECK: `-MemberAccessExpr {{.*}} Member<0> Type // CHECK: `-DeclRefExpr {{.*}} Type> // CHECK: `-VariableDecl {{.*}} Name Type // CHECK: `-MemberAccessExpr {{.*}} Member Type // CHECK: `-DeclRefExpr {{.*}} Type> Pattern { let tuple = (firstElt = _: Op); let firstEltIndex = tuple.0; let firstEltName = tuple.firstElt; erase _: Op; } // ----- #include "include/ops.td" // CHECK: Module // CHECK: `-VariableDecl {{.*}} Name Type // CHECK: `-MemberAccessExpr {{.*}} Member<0> Type // CHECK: `-DeclRefExpr {{.*}} Type> // CHECK: `-VariableDecl {{.*}} Name Type // CHECK: `-MemberAccessExpr {{.*}} Member Type // CHECK: `-DeclRefExpr {{.*}} Type> Pattern { let op: Op; let firstEltIndex = op.0; let firstEltName = op.result; erase op; } // ----- // CHECK: Module // CHECK: `-VariableDecl {{.*}} Name Type> // CHECK: `-OperationExpr {{.*}} Type> // CHECK: `-OpNameDecl {{.*}} Name // CHECK: `Operands` // CHECK: `-MemberAccessExpr {{.*}} Member<0> Type // CHECK: `-OperationExpr {{.*}} Type> // CHECK: `-OpNameDecl {{.*}} Name // CHECK: `Operands` // CHECK: `-DeclRefExpr {{.*}} Type // CHECK: `-VariableDecl {{.*}} Name<_> Type // CHECK: `Constraints` // CHECK: `-ValueRangeConstraintDecl Pattern { let op = op(op.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 // CHECK: `-OpNameDecl // CHECK: `Operands` // CHECK: `-DeclRefExpr {{.*}} Type // CHECK: `-VariableDecl {{.*}} Name<_> Type // CHECK: `Constraints` // CHECK: `-ValueRangeConstraintDecl // CHECK: `Result Types` // CHECK: `-DeclRefExpr {{.*}} Type // CHECK: `-VariableDecl {{.*}} Name<_> Type // 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 // CHECK: `-OpNameDecl // CHECK-NOT: `Operands` // CHECK-NOT: `Result Types` Pattern { erase op<>() -> (); } // ----- // CHECK: Module // CHECK: `-OperationExpr {{.*}} Type> // CHECK: `-OpNameDecl {{.*}} Name Pattern { erase op; } // ----- // CHECK: Module // CHECK: `-OperationExpr {{.*}} Type // CHECK: `-OpNameDecl // CHECK: `Operands` // CHECK: |-DeclRefExpr {{.*}} Type // CHECK: |-DeclRefExpr {{.*}} Type // CHECK: `-DeclRefExpr {{.*}} Type Pattern { erase op<>(_: Value, _: ValueRange, _: Value); } // ----- // CHECK: Module // CHECK: `-OperationExpr {{.*}} Type // CHECK: `-OpNameDecl // CHECK: `Operands` // CHECK: `-MemberAccessExpr {{.*}} Member<$results> Type // CHECK: `-OperationExpr {{.*}} Type> // CHECK: `-OpNameDecl {{.*}} Name Pattern { erase op<>(op); } // ----- // CHECK: Module // CHECK: `-OperationExpr {{.*}} Type // CHECK: `-OpNameDecl // CHECK: `Attributes` // CHECK: |-NamedAttributeDecl {{.*}} Name // CHECK: `-AttributeExpr {{.*}} Value<"unit"> // CHECK: `-NamedAttributeDecl {{.*}} Name // CHECK: `-DeclRefExpr {{.*}} Type Pattern { erase op<> {unitAttr, "normal$Attr" = _: Attr}; } // ----- // CHECK: Module // CHECK: `-OperationExpr {{.*}} Type // CHECK: `-OpNameDecl // CHECK: `Result Types` // CHECK: |-DeclRefExpr {{.*}} Type // CHECK: |-DeclRefExpr {{.*}} Type // CHECK: `-DeclRefExpr {{.*}} 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> // CHECK-NOT: `Operands` // CHECK-NOT: `Result Types` // CHECK: -OperationExpr {{.*}} Type> // CHECK-NOT: `Operands` // CHECK-NOT: `Result Types` // CHECK: -OperationExpr {{.*}} Type> // CHECK: `Operands` // CHECK: -RangeExpr {{.*}} Type // CHECK: -RangeExpr {{.*}} Type // CHECK: `Result Types` // CHECK: -RangeExpr {{.*}} Type // CHECK: -RangeExpr {{.*}} Type Pattern { rewrite op() -> () with { op -> (); op -> (); }; } // ----- //===----------------------------------------------------------------------===// // TupleExpr //===----------------------------------------------------------------------===// // CHECK: Module // CHECK: `-VariableDecl {{.*}} Name // CHECK: `-TupleExpr {{.*}} Type> // CHECK: `-VariableDecl {{.*}} Name // CHECK: `-TupleExpr {{.*}} Type> // CHECK: |-DeclRefExpr {{.*}} Type // CHECK: `-DeclRefExpr {{.*}} Type Pattern { let value: Value; let emptyTuple = (); let mixedTuple = (arg1 = _: Attr, value); erase _: Op; } // ----- //===----------------------------------------------------------------------===// // RangeExpr //===----------------------------------------------------------------------===// // CHECK: Module // CHECK: `Operands` // CHECK: -RangeExpr {{.*}} Type // CHECK: -RangeExpr {{.*}} Type // CHECK: -MemberAccessExpr {{.*}} Member<0> Type // CHECK: -MemberAccessExpr {{.*}} Member<1> Type // CHECK: `Result Types` // CHECK: -RangeExpr {{.*}} Type // CHECK: -RangeExpr {{.*}} Type // CHECK: -MemberAccessExpr {{.*}} Member<0> Type // CHECK: -MemberAccessExpr {{.*}} Member<1> Type Pattern { rewrite op<>(arg: Value, args: ValueRange) -> (type: Type, types: TypeRange) with { op((), (arg, args)) -> ((), (type, types)); }; } // ----- //===----------------------------------------------------------------------===// // TypeExpr //===----------------------------------------------------------------------===// // CHECK: Module // CHECK: `-TypeExpr {{.*}} Value<"i64"> Pattern { let type = type<"i64">; erase _: Op; }