// RUN: not llvm-tblgen -I %p/../../../include -gen-global-isel-combiner \ // RUN: -combiners=MyCombiner %s 2>&1 | \ // RUN: FileCheck -implicit-check-not=error %s include "llvm/Target/Target.td" include "llvm/Target/GlobalISel/Combine.td" def MyTargetISA : InstrInfo; def MyTarget : Target { let InstructionSet = MyTargetISA; } def dummy; def R0 : Register<"r0"> { let Namespace = "MyTarget"; } def GPR32 : RegisterClass<"MyTarget", [i32], 32, (add R0)>; class I<dag OOps, dag IOps, list<dag> Pat> : Instruction { let Namespace = "MyTarget"; let OutOperandList = OOps; let InOperandList = IOps; let Pattern = Pat; } def MOV : I<(outs GPR32:$dst), (ins GPR32:$src1), []>; def missing_match_node : GICombineRule< (defs root:$a), (dummy), (dummy)>; // CHECK: :[[@LINE-4]]:{{[0-9]+}}: error: Expected match operator // CHECK-NEXT: def missing_match_node : GICombineRule< // CHECK: :[[@LINE-6]]:{{[0-9]+}}: error: Failed to parse rule def null_matcher : GICombineRule< (defs root:$a), (match), (dummy)>; // CHECK: :[[@LINE-4]]:{{[0-9]+}}: error: Matcher is empty // CHECK-NEXT: def null_matcher : GICombineRule< // CHECK: :[[@LINE-6]]:{{[0-9]+}}: error: Failed to parse rule def unknown_kind1 : GICombineRule< (defs root:$a), (match 0), (dummy)>; // CHECK: :[[@LINE-4]]:{{[0-9]+}}: error: Expected a subclass of GIMatchKind or a sub-dag whose operator is either of a GIMatchKindWithArgs or Instruction // CHECK-NEXT: def unknown_kind1 : GICombineRule< // CHECK: :[[@LINE-6]]:{{[0-9]+}}: error: Failed to parse rule def unknown_kind2 : GICombineRule< (defs root:$a), (match (dummy)), (dummy)>; // CHECK: :[[@LINE-4]]:{{[0-9]+}}: error: Expected a subclass of GIMatchKind or a sub-dag whose operator is either of a GIMatchKindWithArgs or Instruction // CHECK-NEXT: def unknown_kind2 : GICombineRule< // CHECK: :[[@LINE-6]]:{{[0-9]+}}: error: Failed to parse rule def multidef : GICombineRule< (defs root:$a), (match (MOV $a, $b), (MOV $a, $b)), (dummy)>; // CHECK: :[[@LINE-5]]:{{[0-9]+}}: error: Two different MachineInstrs cannot def the same vreg // CHECK-NEXT: def multidef : GICombineRule< // CHECK: :[[@LINE-7]]:{{[0-9]+}}: error: Failed to parse rule def multidef_but_not_an_error: GICombineRule< (defs root:$a), (match (MOV $a, $b), (MOV $a, $b)), (dummy)>; // CHECK-NOT: :[[@LINE-5]]:{{[0-9]+}}: error: def MyCombiner: GICombinerHelper<"GenMyCombiner", [ // CHECK: :[[@LINE-1]]:{{[0-9]+}}: error: Failed to parse one or more rules missing_match_node, null_matcher, unknown_kind1, unknown_kind2, multidef // Rules omitted from a matcher can be as broken as you like. They will not be read. // multidef_but_not_an_error ]>;