1// RUN: mlir-pdll %s -I %S -I %S/../../../../include -split-input-file -x cpp | FileCheck %s 2 3// Check that we generate a wrapper pattern for each PDL pattern. Also 4// add in a pattern awkwardly named the same as our generated patterns to 5// check that we handle overlap. 6 7// CHECK: struct GeneratedPDLLPattern0 : ::mlir::PDLPatternModule { 8// CHECK: template <typename... ConfigsT> 9// CHECK: : ::mlir::PDLPatternModule(::mlir::parseSourceString<::mlir::ModuleOp>( 10// CHECK: R"mlir( 11// CHECK: pdl.pattern 12// CHECK: operation "test.op" 13// CHECK: )mlir", context), std::forward<ConfigsT>(configs)...) 14 15// CHECK: struct NamedPattern : ::mlir::PDLPatternModule { 16// CHECK: : ::mlir::PDLPatternModule(::mlir::parseSourceString<::mlir::ModuleOp>( 17// CHECK: R"mlir( 18// CHECK: pdl.pattern 19// CHECK: operation "test.op2" 20// CHECK: )mlir", context), std::forward<ConfigsT>(configs)...) 21 22// CHECK: struct GeneratedPDLLPattern1 : ::mlir::PDLPatternModule { 23 24// CHECK: struct GeneratedPDLLPattern2 : ::mlir::PDLPatternModule { 25// CHECK: : ::mlir::PDLPatternModule(::mlir::parseSourceString<::mlir::ModuleOp>( 26// CHECK: R"mlir( 27// CHECK: pdl.pattern 28// CHECK: operation "test.op3" 29// CHECK: )mlir", context), std::forward<ConfigsT>(configs)...) 30 31// CHECK: static void LLVM_ATTRIBUTE_UNUSED populateGeneratedPDLLPatterns(::mlir::RewritePatternSet &patterns, ConfigsT &&...configs) { 32// CHECK-NEXT: patterns.add<GeneratedPDLLPattern0>(patterns.getContext(), configs...); 33// CHECK-NEXT: patterns.add<NamedPattern>(patterns.getContext(), configs...); 34// CHECK-NEXT: patterns.add<GeneratedPDLLPattern1>(patterns.getContext(), configs...); 35// CHECK-NEXT: patterns.add<GeneratedPDLLPattern2>(patterns.getContext(), configs...); 36// CHECK-NEXT: } 37 38Pattern => erase op<test.op>; 39Pattern NamedPattern => erase op<test.op2>; 40Pattern GeneratedPDLLPattern1 => erase op<>; 41Pattern => erase op<test.op3>; 42 43// ----- 44 45// Check the generation of native constraints and rewrites. 46 47#include "include/ods.td" 48 49// CHECK: static ::llvm::LogicalResult TestCstPDLFn(::mlir::PatternRewriter &rewriter, 50// CHECK-SAME: ::mlir::Attribute attr, ::mlir::Operation * op, ::mlir::Type type, 51// CHECK-SAME: ::mlir::Value value, ::mlir::TypeRange typeRange, ::mlir::ValueRange valueRange) { 52// CHECK-NEXT: return success(); 53// CHECK: } 54 55// CHECK-NOT: TestUnusedCst 56 57// CHECK: static void TestRewritePDLFn(::mlir::PatternRewriter &rewriter, 58// CHECK-SAME: ::mlir::Attribute attr, ::mlir::Operation * op, ::mlir::Type type, 59// CHECK-SAME: ::mlir::Value value, ::mlir::TypeRange typeRange, ::mlir::ValueRange valueRange) { 60// CHECK: foo; 61// CHECK: } 62 63// CHECK: TestAttrInterface TestRewriteODSPDLFn(::mlir::PatternRewriter &rewriter, TestAttrInterface attr) { 64// CHECK: static ::mlir::Attribute TestRewriteSinglePDLFn(::mlir::PatternRewriter &rewriter) { 65// CHECK: std::tuple<::mlir::Attribute, ::mlir::Type> TestRewriteTuplePDLFn(::mlir::PatternRewriter &rewriter) { 66 67// CHECK-NOT: TestUnusedRewrite 68 69// CHECK: struct TestCstAndRewrite : ::mlir::PDLPatternModule { 70// CHECK: registerConstraintFunction("TestCst", TestCstPDLFn); 71// CHECK: registerRewriteFunction("TestRewrite", TestRewritePDLFn); 72 73Constraint TestCst(attr: Attr, op: Op, type: Type, value: Value, typeRange: TypeRange, valueRange: ValueRange) [{ 74 return success(); 75}]; 76Constraint TestUnusedCst() [{ return success(); }]; 77 78Rewrite TestRewrite(attr: Attr, op: Op, type: Type, value: Value, typeRange: TypeRange, valueRange: ValueRange) [{ foo; }]; 79Rewrite TestRewriteODS(attr: TestAttrInterface) -> TestAttrInterface [{}]; 80Rewrite TestRewriteSingle() -> Attr [{}]; 81Rewrite TestRewriteTuple() -> (Attr, Type) [{}]; 82Rewrite TestUnusedRewrite(op: Op) [{}]; 83 84Pattern TestCstAndRewrite { 85 let root = op<>(operand: Value, operands: ValueRange) -> (type: Type, types: TypeRange); 86 TestCst(attr<"true">, root, type, operand, types, operands); 87 rewrite root with { 88 TestRewrite(attr<"true">, root, type, operand, types, operands); 89 TestRewriteODS(attr<"true">); 90 TestRewriteSingle(); 91 TestRewriteTuple(); 92 erase root; 93 }; 94} 95