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