| // RUN: llvm-tblgen -gen-sd-node-info -I %p/../../../include %s 2> %t.warn | FileCheck %s |
| // RUN: FileCheck --check-prefix=WARN --implicit-check-not=warning %s < %t.warn |
| |
| // RUN: llvm-tblgen -gen-sd-node-info -warn-on-skipped-nodes=false \ |
| // RUN: -I %p/../../../include %s 2> %t.nowarn | FileCheck %s |
| // RUN: not test -s %t.nowarn |
| |
| include "llvm/Target/Target.td" |
| |
| def MyTarget : Target; |
| |
| // WARN: [[#@LINE+1]]:5: warning: skipped node: invalid enum name |
| def bad_name_1 : SDNode<"", SDTypeProfile<0, 0, []>>; |
| |
| // WARN: [[#@LINE+1]]:5: warning: skipped node: invalid enum name |
| def bad_name_2 : SDNode<"NODE", SDTypeProfile<0, 0, []>>; |
| |
| // WARN: [[#@LINE+1]]:5: warning: skipped node: invalid enum name |
| def bad_name_3 : SDNode<"MyTargetISD::", SDTypeProfile<0, 0, []>>; |
| |
| // WARN: [[#@LINE+1]]:5: warning: skipped node: invalid enum name |
| def bad_name_4 : SDNode<"MyISD::", SDTypeProfile<0, 0, []>>; |
| |
| // WARN: [[#@LINE+1]]:5: warning: skipped node: invalid enum name |
| def bad_name_5 : SDNode<"::NODE", SDTypeProfile<0, 0, []>>; |
| |
| |
| // Standard namespace. |
| def silent_1 : SDNode<"ISD::SILENT", SDTypeProfile<0, 0, []>>; |
| |
| // Different namespace. |
| def silent_2 : SDNode<"MyISD::SILENT", SDTypeProfile<0, 0, []>>; |
| |
| |
| // Different number of results. |
| // WARN: [[#@LINE+2]]:5: warning: skipped node: incompatible description |
| // WARN: [[#@LINE+2]]:5: warning: skipped node: incompatible description |
| def node_1a : SDNode<"MyTargetISD::NODE_1", SDTypeProfile<0, 0, []>>; |
| def node_1b : SDNode<"MyTargetISD::NODE_1", SDTypeProfile<1, 0, []>>; |
| |
| // Different number of operands. |
| // WARN: [[#@LINE+2]]:5: warning: skipped node: incompatible description |
| // WARN: [[#@LINE+2]]:5: warning: skipped node: incompatible description |
| def node_2a : SDNode<"MyTargetISD::NODE_2", SDTypeProfile<0, 0, []>>; |
| def node_2b : SDNode<"MyTargetISD::NODE_2", SDTypeProfile<0, 1, []>>; |
| |
| // Different value of IsStrictFP. |
| // WARN: [[#@LINE+3]]:5: warning: skipped node: incompatible description |
| // WARN: [[#@LINE+3]]:5: warning: skipped node: incompatible description |
| let IsStrictFP = true in |
| def node_3a : SDNode<"MyTargetISD::NODE_3", SDTypeProfile<0, 0, []>>; |
| def node_3b : SDNode<"MyTargetISD::NODE_3", SDTypeProfile<0, 0, []>>; |
| |
| // Different value of TSFlags. |
| // WARN: [[#@LINE+3]]:5: warning: skipped node: incompatible description |
| // WARN: [[#@LINE+3]]:5: warning: skipped node: incompatible description |
| let TSFlags = 1 in |
| def node_4a : SDNode<"MyTargetISD::NODE_4", SDTypeProfile<0, 0, []>>; |
| def node_4b : SDNode<"MyTargetISD::NODE_4", SDTypeProfile<0, 0, []>>; |
| |
| // Different properties. |
| // WARN: [[#@LINE+2]]:5: warning: skipped node: incompatible description |
| // WARN: [[#@LINE+2]]:5: warning: skipped node: incompatible description |
| def node_5a : SDNode<"MyTargetISD::NODE_5", SDTypeProfile<0, 0, []>>; |
| def node_5b : SDNode<"MyTargetISD::NODE_5", SDTypeProfile<0, 0, []>, [SDNPHasChain]>; |
| |
| |
| // CHECK: enum GenNodeType : unsigned { |
| // CHECK-NEXT: COMPAT = ISD::BUILTIN_OP_END, |
| // CHECK-NEXT: }; |
| |
| // CHECK: static constexpr char MyTargetSDNodeNamesStorage[] = |
| // CHECK-NEXT: "\0" |
| // CHECK-NEXT: "MyTargetISD::COMPAT\0" |
| // CHECK-NEXT: ; |
| |
| // CHECK: static const SDTypeConstraint MyTargetSDTypeConstraints[] = { |
| // CHECK-NEXT: /* dummy */ {SDTCisVT, 0, 0, MVT::INVALID_SIMPLE_VALUE_TYPE} |
| // CHECK-NEXT: }; |
| // CHECK-EMPTY: |
| // CHECK-NEXT: static const SDNodeDesc MyTargetSDNodeDescs[] = { |
| // CHECK-NEXT: {1, -1, 0, 0, 0, 1, 0, 0}, // COMPAT |
| // CHECK-NEXT: }; |
| // CHECK-EMPTY: |
| // CHECK-NEXT: static const SDNodeInfo MyTargetGenSDNodeInfo( |
| // CHECK-NEXT: /*NumOpcodes=*/1, MyTargetSDNodeDescs, |
| // CHECK-NEXT: MyTargetSDNodeNames, MyTargetSDTypeConstraints); |
| |
| def compat_a : SDNode<"MyTargetISD::COMPAT", SDTypeProfile<1, -1, []>>; |
| def compat_b : SDNode<"MyTargetISD::COMPAT", SDTypeProfile<1, -1, [SDTCisVT<0, untyped>]>>; |
| def compat_c : SDNode<"MyTargetISD::COMPAT", SDTypeProfile<1, -1, [SDTCisVT<0, untyped>]>, |
| [SDNPCommutative, SDNPAssociative, SDNPMayStore, SDNPMayLoad, SDNPSideEffect]>; |