xref: /llvm-project/mlir/test/mlir-pdll/Parser/expr.pdll (revision 930916c7f3622870b40138dafcc5f94740404e8c)
181f2f4dfSRiver Riddle// RUN: mlir-pdll %s -I %S -I %S/../../../include -split-input-file | FileCheck %s
2d7e7fdf3SRiver Riddle
3d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
4d7e7fdf3SRiver Riddle// AttrExpr
5d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
6d7e7fdf3SRiver Riddle
7d7e7fdf3SRiver Riddle// CHECK: Module
8d7e7fdf3SRiver Riddle// CHECK: `-AttributeExpr {{.*}} Value<"10: i32">
9d7e7fdf3SRiver RiddlePattern {
10d7e7fdf3SRiver Riddle  let attr = attr<"10: i32">;
11d7e7fdf3SRiver Riddle
12d7e7fdf3SRiver Riddle  erase _: Op;
13d7e7fdf3SRiver Riddle}
14d7e7fdf3SRiver Riddle
15d7e7fdf3SRiver Riddle// -----
16d7e7fdf3SRiver Riddle
17d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
18faf42264SRiver Riddle// CallExpr
19faf42264SRiver Riddle//===----------------------------------------------------------------------===//
20faf42264SRiver Riddle
21faf42264SRiver Riddle// CHECK: Module
22faf42264SRiver Riddle// CHECK: |-UserConstraintDecl {{.*}} Name<MakeRootOp> ResultType<Op<my_dialect.foo>>
23faf42264SRiver Riddle// CHECK:   `-CallExpr {{.*}} Type<Op<my_dialect.foo>>
24faf42264SRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Constraint>
25faf42264SRiver Riddle// CHECK:       `-UserConstraintDecl {{.*}} Name<MakeRootOp> ResultType<Op<my_dialect.foo>>
26faf42264SRiver RiddleConstraint MakeRootOp() => op<my_dialect.foo>;
27faf42264SRiver Riddle
28faf42264SRiver RiddlePattern {
29faf42264SRiver Riddle  erase MakeRootOp();
30faf42264SRiver Riddle}
31faf42264SRiver Riddle
32faf42264SRiver Riddle// -----
33faf42264SRiver Riddle
34faf42264SRiver Riddle// CHECK: Module
35faf42264SRiver Riddle// CHECK: |-UserRewriteDecl {{.*}} Name<CreateNewOp> ResultType<Op<my_dialect.foo>>
36faf42264SRiver Riddle// CHECK: `-PatternDecl {{.*}}
37faf42264SRiver Riddle// CHECK:   `-CallExpr {{.*}} Type<Op<my_dialect.foo>>
38faf42264SRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Rewrite>
39faf42264SRiver Riddle// CHECK:       `-UserRewriteDecl {{.*}} Name<CreateNewOp> ResultType<Op<my_dialect.foo>>
40faf42264SRiver Riddle// CHECK:     `Arguments`
41faf42264SRiver Riddle// CHECK:       `-MemberAccessExpr {{.*}} Member<$results> Type<ValueRange>
42faf42264SRiver Riddle// CHECK:         `-DeclRefExpr {{.*}} Type<Op<my_dialect.bar>>
43faf42264SRiver Riddle// CHECK:           `-VariableDecl {{.*}} Name<inputOp> Type<Op<my_dialect.bar>>
44faf42264SRiver RiddleRewrite CreateNewOp(inputs: ValueRange) => op<my_dialect.foo>(inputs);
45faf42264SRiver Riddle
46faf42264SRiver RiddlePattern {
47faf42264SRiver Riddle  let inputOp = op<my_dialect.bar>;
48faf42264SRiver Riddle  replace op<my_dialect.bar>(inputOp) with CreateNewOp(inputOp);
49faf42264SRiver Riddle}
50faf42264SRiver Riddle
51faf42264SRiver Riddle// -----
52faf42264SRiver Riddle
53*930916c7SMogball// CHECK: Module {{.*}}
54*930916c7SMogball// CHECK:  -UserConstraintDecl {{.*}} Name<TestConstraint> ResultType<Tuple<>>
55*930916c7SMogball// CHECK: `-PatternDecl {{.*}}
56*930916c7SMogball// CHECK:   -CallExpr {{.*}} Type<Tuple<>> Negated
57*930916c7SMogball// CHECK:     `-DeclRefExpr {{.*}} Type<Constraint>
58*930916c7SMogball// CHECK:       `-UserConstraintDecl {{.*}} Name<TestConstraint> ResultType<Tuple<>>
59*930916c7SMogballConstraint TestConstraint(op: Op);
60*930916c7SMogball
61*930916c7SMogballPattern {
62*930916c7SMogball  let inputOp = op<my_dialect.bar>;
63*930916c7SMogball  not TestConstraint(inputOp);
64*930916c7SMogball  erase inputOp;
65*930916c7SMogball}
66*930916c7SMogball
67*930916c7SMogball// -----
68*930916c7SMogball
69faf42264SRiver Riddle//===----------------------------------------------------------------------===//
70f62a57a3SRiver Riddle// MemberAccessExpr
71f62a57a3SRiver Riddle//===----------------------------------------------------------------------===//
72f62a57a3SRiver Riddle
73f62a57a3SRiver Riddle// CHECK: Module
74f62a57a3SRiver Riddle// CHECK: `-VariableDecl {{.*}} Name<firstEltIndex> Type<Op>
75f62a57a3SRiver Riddle// CHECK:   `-MemberAccessExpr {{.*}} Member<0> Type<Op>
76f62a57a3SRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Tuple<firstElt: Op>>
77f62a57a3SRiver Riddle// CHECK: `-VariableDecl {{.*}} Name<firstEltName> Type<Op>
78f62a57a3SRiver Riddle// CHECK:   `-MemberAccessExpr {{.*}} Member<firstElt> Type<Op>
79f62a57a3SRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Tuple<firstElt: Op>>
80f62a57a3SRiver RiddlePattern {
81f62a57a3SRiver Riddle  let tuple = (firstElt = _: Op);
82f62a57a3SRiver Riddle  let firstEltIndex = tuple.0;
83f62a57a3SRiver Riddle  let firstEltName = tuple.firstElt;
84f62a57a3SRiver Riddle
85f62a57a3SRiver Riddle  erase _: Op;
86f62a57a3SRiver Riddle}
87f62a57a3SRiver Riddle
88f62a57a3SRiver Riddle// -----
89f62a57a3SRiver Riddle
9081f2f4dfSRiver Riddle#include "include/ops.td"
9181f2f4dfSRiver Riddle
9281f2f4dfSRiver Riddle// CHECK: Module
9381f2f4dfSRiver Riddle// CHECK: `-VariableDecl {{.*}} Name<firstEltIndex> Type<Value>
9481f2f4dfSRiver Riddle// CHECK:   `-MemberAccessExpr {{.*}} Member<0> Type<Value>
9581f2f4dfSRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Op<test.all_single>>
9681f2f4dfSRiver Riddle// CHECK: `-VariableDecl {{.*}} Name<firstEltName> Type<Value>
9781f2f4dfSRiver Riddle// CHECK:   `-MemberAccessExpr {{.*}} Member<result> Type<Value>
9881f2f4dfSRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Op<test.all_single>>
9981f2f4dfSRiver RiddlePattern {
10081f2f4dfSRiver Riddle  let op: Op<test.all_single>;
10181f2f4dfSRiver Riddle  let firstEltIndex = op.0;
10281f2f4dfSRiver Riddle  let firstEltName = op.result;
10381f2f4dfSRiver Riddle
10481f2f4dfSRiver Riddle  erase op;
10581f2f4dfSRiver Riddle}
10681f2f4dfSRiver Riddle
10781f2f4dfSRiver Riddle// -----
10881f2f4dfSRiver Riddle
109c088fbe7SChia-hung Duan// CHECK: Module
110c088fbe7SChia-hung Duan// CHECK: `-VariableDecl {{.*}} Name<op> Type<Op<my_dialect.unregistered_foo>>
111c088fbe7SChia-hung Duan// CHECK:   `-OperationExpr {{.*}} Type<Op<my_dialect.unregistered_foo>>
112c088fbe7SChia-hung Duan// CHECK:     `-OpNameDecl {{.*}} Name<my_dialect.unregistered_foo>
113c088fbe7SChia-hung Duan// CHECK:     `Operands`
114c088fbe7SChia-hung Duan// CHECK:       `-MemberAccessExpr {{.*}} Member<0> Type<Value>
115c088fbe7SChia-hung Duan// CHECK:         `-OperationExpr {{.*}} Type<Op<my_dialect.unregistered_bar>>
116c088fbe7SChia-hung Duan// CHECK:           `-OpNameDecl {{.*}} Name<my_dialect.unregistered_bar>
117c088fbe7SChia-hung Duan// CHECK:           `Operands`
118c088fbe7SChia-hung Duan// CHECK:             `-DeclRefExpr {{.*}} Type<ValueRange>
119c088fbe7SChia-hung Duan// CHECK:               `-VariableDecl {{.*}} Name<_> Type<ValueRange>
120c088fbe7SChia-hung Duan// CHECK:                 `Constraints`
121c088fbe7SChia-hung Duan// CHECK:                   `-ValueRangeConstraintDecl
122c088fbe7SChia-hung DuanPattern {
123c088fbe7SChia-hung Duan  let op = op<my_dialect.unregistered_foo>(op<my_dialect.unregistered_bar>.0);
124c088fbe7SChia-hung Duan  erase op;
125c088fbe7SChia-hung Duan}
126c088fbe7SChia-hung Duan
127c088fbe7SChia-hung Duan// -----
128c088fbe7SChia-hung Duan
129f62a57a3SRiver Riddle//===----------------------------------------------------------------------===//
13002670c3fSRiver Riddle// OperationExpr
13102670c3fSRiver Riddle//===----------------------------------------------------------------------===//
13202670c3fSRiver Riddle
133a486cf5eSRiver Riddle// Test a non-constrained operation expression, and ensure that we don't treat
134a486cf5eSRiver Riddle// unconstrained as "not present"(e.g. zero operands).
135a486cf5eSRiver Riddle
13602670c3fSRiver Riddle// CHECK: Module
13702670c3fSRiver Riddle// CHECK: `-OperationExpr {{.*}} Type<Op>
13802670c3fSRiver Riddle// CHECK:   `-OpNameDecl
139a486cf5eSRiver Riddle// CHECK:   `Operands`
140a486cf5eSRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<ValueRange>
141a486cf5eSRiver Riddle// CHECK:       `-VariableDecl {{.*}} Name<_> Type<ValueRange>
142a486cf5eSRiver Riddle// CHECK:         `Constraints`
143a486cf5eSRiver Riddle// CHECK:           `-ValueRangeConstraintDecl
144a486cf5eSRiver Riddle// CHECK:   `Result Types`
145a486cf5eSRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<TypeRange>
146a486cf5eSRiver Riddle// CHECK:       `-VariableDecl {{.*}} Name<_> Type<TypeRange>
147a486cf5eSRiver Riddle// CHECK:         `Constraints`
148a486cf5eSRiver Riddle// CHECK:           `-TypeRangeConstraintDecl
14902670c3fSRiver RiddlePattern {
15002670c3fSRiver Riddle  erase op<>;
15102670c3fSRiver Riddle}
15202670c3fSRiver Riddle
15302670c3fSRiver Riddle// -----
15402670c3fSRiver Riddle
155a486cf5eSRiver Riddle// Test explicitly empty operand/result/etc. lists, which are different from the
156a486cf5eSRiver Riddle// "unconstrained" examples above.
157a486cf5eSRiver Riddle
158a486cf5eSRiver Riddle// CHECK: Module
159a486cf5eSRiver Riddle// CHECK: `-OperationExpr {{.*}} Type<Op>
160a486cf5eSRiver Riddle// CHECK:   `-OpNameDecl
161a486cf5eSRiver Riddle// CHECK-NOT: `Operands`
162a486cf5eSRiver Riddle// CHECK-NOT: `Result Types`
163a486cf5eSRiver RiddlePattern {
164a486cf5eSRiver Riddle  erase op<>() -> ();
165a486cf5eSRiver Riddle}
166a486cf5eSRiver Riddle
167a486cf5eSRiver Riddle// -----
168a486cf5eSRiver Riddle
16902670c3fSRiver Riddle// CHECK: Module
17002670c3fSRiver Riddle// CHECK: `-OperationExpr {{.*}} Type<Op<my_dialect.foo>>
17102670c3fSRiver Riddle// CHECK:   `-OpNameDecl {{.*}} Name<my_dialect.foo>
17202670c3fSRiver RiddlePattern {
17302670c3fSRiver Riddle  erase op<my_dialect.foo>;
17402670c3fSRiver Riddle}
17502670c3fSRiver Riddle
17602670c3fSRiver Riddle// -----
17702670c3fSRiver Riddle
17802670c3fSRiver Riddle// CHECK: Module
17902670c3fSRiver Riddle// CHECK: `-OperationExpr {{.*}} Type<Op>
18002670c3fSRiver Riddle// CHECK:   `-OpNameDecl
18102670c3fSRiver Riddle// CHECK:   `Operands`
18202670c3fSRiver Riddle// CHECK:     |-DeclRefExpr {{.*}} Type<Value>
18302670c3fSRiver Riddle// CHECK:     |-DeclRefExpr {{.*}} Type<ValueRange>
18402670c3fSRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Value>
18502670c3fSRiver RiddlePattern {
18602670c3fSRiver Riddle  erase op<>(_: Value, _: ValueRange, _: Value);
18702670c3fSRiver Riddle}
18802670c3fSRiver Riddle
18902670c3fSRiver Riddle// -----
19002670c3fSRiver Riddle
19102670c3fSRiver Riddle// CHECK: Module
19202670c3fSRiver Riddle// CHECK: `-OperationExpr {{.*}} Type<Op>
19302670c3fSRiver Riddle// CHECK:   `-OpNameDecl
19402670c3fSRiver Riddle// CHECK:   `Operands`
19502670c3fSRiver Riddle// CHECK:     `-MemberAccessExpr {{.*}} Member<$results> Type<ValueRange>
19602670c3fSRiver Riddle// CHECK:       `-OperationExpr {{.*}} Type<Op<my_dialect.bar>>
19702670c3fSRiver Riddle// CHECK:         `-OpNameDecl {{.*}} Name<my_dialect.bar>
19802670c3fSRiver RiddlePattern {
19902670c3fSRiver Riddle  erase op<>(op<my_dialect.bar>);
20002670c3fSRiver Riddle}
20102670c3fSRiver Riddle
20202670c3fSRiver Riddle// -----
20302670c3fSRiver Riddle
20402670c3fSRiver Riddle// CHECK: Module
20502670c3fSRiver Riddle// CHECK: `-OperationExpr {{.*}} Type<Op>
20602670c3fSRiver Riddle// CHECK:   `-OpNameDecl
20702670c3fSRiver Riddle// CHECK:   `Attributes`
20802670c3fSRiver Riddle// CHECK:     |-NamedAttributeDecl {{.*}} Name<unitAttr>
20902670c3fSRiver Riddle// CHECK:       `-AttributeExpr {{.*}} Value<"unit">
21002670c3fSRiver Riddle// CHECK:     `-NamedAttributeDecl {{.*}} Name<normal$Attr>
21102670c3fSRiver Riddle// CHECK:       `-DeclRefExpr {{.*}} Type<Attr>
21202670c3fSRiver Riddle
21302670c3fSRiver RiddlePattern {
21402670c3fSRiver Riddle  erase op<> {unitAttr, "normal$Attr" = _: Attr};
21502670c3fSRiver Riddle}
21602670c3fSRiver Riddle
21702670c3fSRiver Riddle// -----
21802670c3fSRiver Riddle
21902670c3fSRiver Riddle// CHECK: Module
22002670c3fSRiver Riddle// CHECK: `-OperationExpr {{.*}} Type<Op>
22102670c3fSRiver Riddle// CHECK:   `-OpNameDecl
22202670c3fSRiver Riddle// CHECK:   `Result Types`
22302670c3fSRiver Riddle// CHECK:     |-DeclRefExpr {{.*}} Type<Type>
22402670c3fSRiver Riddle// CHECK:     |-DeclRefExpr {{.*}} Type<TypeRange>
22502670c3fSRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Type>
22602670c3fSRiver RiddlePattern {
22702670c3fSRiver Riddle  erase op<> -> (_: Type, _: TypeRange, _: Type);
22802670c3fSRiver Riddle}
22902670c3fSRiver Riddle
23002670c3fSRiver Riddle// -----
23102670c3fSRiver Riddle
232ec92a125SRiver Riddle// Test that we don't need to provide values if all elements
233ec92a125SRiver Riddle// are optional.
234ec92a125SRiver Riddle
235ec92a125SRiver Riddle#include "include/ops.td"
236ec92a125SRiver Riddle
237ec92a125SRiver Riddle// CHECK: Module
238ec92a125SRiver Riddle// CHECK:  -OperationExpr {{.*}} Type<Op<test.multi_variadic>>
239ec92a125SRiver Riddle// CHECK-NOT:   `Operands`
240ec92a125SRiver Riddle// CHECK-NOT:   `Result Types`
241ec92a125SRiver Riddle// CHECK:  -OperationExpr {{.*}} Type<Op<test.all_variadic>>
242ec92a125SRiver Riddle// CHECK-NOT:   `Operands`
243ec92a125SRiver Riddle// CHECK-NOT:   `Result Types`
244ec92a125SRiver Riddle// CHECK:  -OperationExpr {{.*}} Type<Op<test.multi_variadic>>
245ec92a125SRiver Riddle// CHECK:    `Operands`
246ec92a125SRiver Riddle// CHECK:      -RangeExpr {{.*}} Type<ValueRange>
247ec92a125SRiver Riddle// CHECK:      -RangeExpr {{.*}} Type<ValueRange>
248ec92a125SRiver Riddle// CHECK:    `Result Types`
249ec92a125SRiver Riddle// CHECK:      -RangeExpr {{.*}} Type<TypeRange>
250ec92a125SRiver Riddle// CHECK:      -RangeExpr {{.*}} Type<TypeRange>
251ec92a125SRiver RiddlePattern {
252ec92a125SRiver Riddle  rewrite op<test.multi_variadic>() -> () with {
253ec92a125SRiver Riddle    op<test.all_variadic> -> ();
254ec92a125SRiver Riddle    op<test.multi_variadic> -> ();
255ec92a125SRiver Riddle  };
256ec92a125SRiver Riddle}
257ec92a125SRiver Riddle
258ec92a125SRiver Riddle// -----
259ec92a125SRiver Riddle
26002670c3fSRiver Riddle//===----------------------------------------------------------------------===//
261f62a57a3SRiver Riddle// TupleExpr
262f62a57a3SRiver Riddle//===----------------------------------------------------------------------===//
263f62a57a3SRiver Riddle
264f62a57a3SRiver Riddle// CHECK: Module
265f62a57a3SRiver Riddle// CHECK: `-VariableDecl {{.*}} Name<emptyTuple>
266f62a57a3SRiver Riddle// CHECK:   `-TupleExpr {{.*}} Type<Tuple<>>
267f62a57a3SRiver Riddle// CHECK: `-VariableDecl {{.*}} Name<mixedTuple>
268f62a57a3SRiver Riddle// CHECK:   `-TupleExpr {{.*}} Type<Tuple<arg1: Attr, Value>>
269f62a57a3SRiver Riddle// CHECK:     |-DeclRefExpr {{.*}} Type<Attr>
270f62a57a3SRiver Riddle// CHECK:     `-DeclRefExpr {{.*}} Type<Value>
271f62a57a3SRiver RiddlePattern {
272f62a57a3SRiver Riddle  let value: Value;
273f62a57a3SRiver Riddle
274f62a57a3SRiver Riddle  let emptyTuple = ();
275f62a57a3SRiver Riddle  let mixedTuple = (arg1 = _: Attr, value);
276f62a57a3SRiver Riddle
277f62a57a3SRiver Riddle  erase _: Op;
278f62a57a3SRiver Riddle}
279f62a57a3SRiver Riddle
280f62a57a3SRiver Riddle// -----
281f62a57a3SRiver Riddle
282f62a57a3SRiver Riddle//===----------------------------------------------------------------------===//
2839e57210aSRiver Riddle// RangeExpr
2849e57210aSRiver Riddle//===----------------------------------------------------------------------===//
2859e57210aSRiver Riddle
2869e57210aSRiver Riddle// CHECK: Module
2879e57210aSRiver Riddle// CHECK: `Operands`
2889e57210aSRiver Riddle// CHECK:   -RangeExpr {{.*}} Type<ValueRange>
2899e57210aSRiver Riddle// CHECK:   -RangeExpr {{.*}} Type<ValueRange>
2909e57210aSRiver Riddle// CHECK:     -MemberAccessExpr {{.*}} Member<0> Type<Value>
2919e57210aSRiver Riddle// CHECK:     -MemberAccessExpr {{.*}} Member<1> Type<ValueRange>
2929e57210aSRiver Riddle// CHECK: `Result Types`
2939e57210aSRiver Riddle// CHECK:   -RangeExpr {{.*}} Type<TypeRange>
2949e57210aSRiver Riddle// CHECK:   -RangeExpr {{.*}} Type<TypeRange>
2959e57210aSRiver Riddle// CHECK:     -MemberAccessExpr {{.*}} Member<0> Type<Type>
2969e57210aSRiver Riddle// CHECK:     -MemberAccessExpr {{.*}} Member<1> Type<TypeRange>
2979e57210aSRiver RiddlePattern {
2989e57210aSRiver Riddle  rewrite op<>(arg: Value, args: ValueRange) -> (type: Type, types: TypeRange) with {
2999e57210aSRiver Riddle    op<test.op>((), (arg, args)) -> ((), (type, types));
3009e57210aSRiver Riddle  };
3019e57210aSRiver Riddle}
3029e57210aSRiver Riddle
3039e57210aSRiver Riddle// -----
3049e57210aSRiver Riddle
3059e57210aSRiver Riddle//===----------------------------------------------------------------------===//
306d7e7fdf3SRiver Riddle// TypeExpr
307d7e7fdf3SRiver Riddle//===----------------------------------------------------------------------===//
308d7e7fdf3SRiver Riddle
309d7e7fdf3SRiver Riddle// CHECK: Module
310d7e7fdf3SRiver Riddle// CHECK: `-TypeExpr {{.*}} Value<"i64">
311d7e7fdf3SRiver RiddlePattern {
312d7e7fdf3SRiver Riddle  let type = type<"i64">;
313d7e7fdf3SRiver Riddle
314d7e7fdf3SRiver Riddle  erase _: Op;
315d7e7fdf3SRiver Riddle}
316