1// RUN: split-file %s %t 2 3//--- no-nodes.td 4// RUN: llvm-tblgen -gen-sd-node-info -I %p/../../../include %t/no-nodes.td \ 5// RUN: | FileCheck %t/no-nodes.td 6 7include "llvm/Target/Target.td" 8 9def MyTarget : Target; 10 11// CHECK: #ifdef GET_SDNODE_ENUM 12// CHECK-NEXT: #undef GET_SDNODE_ENUM 13// CHECK-EMPTY: 14// CHECK-NEXT: namespace llvm::MyTargetISD { 15// CHECK-EMPTY: 16// CHECK-NEXT: static constexpr unsigned GENERATED_OPCODE_END = ISD::BUILTIN_OP_END; 17// CHECK-EMPTY: 18// CHECK-NEXT: } // namespace llvm::MyTargetISD 19// CHECK-EMPTY: 20// CHECK-NEXT: #endif // GET_SDNODE_ENUM 21// CHECK-EMPTY: 22// CHECK-NEXT: #ifdef GET_SDNODE_DESC 23// CHECK-NEXT: #undef GET_SDNODE_DESC 24// CHECK-EMPTY: 25// CHECK-NEXT: namespace llvm { 26// CHECK-EMPTY: 27// CHECK-NEXT: #ifdef __GNUC__ 28// CHECK-NEXT: #pragma GCC diagnostic push 29// CHECK-NEXT: #pragma GCC diagnostic ignored "-Woverlength-strings" 30// CHECK-NEXT: #endif 31// CHECK-NEXT: static constexpr char MyTargetSDNodeNamesStorage[] = 32// CHECK-NEXT: "\0" 33// CHECK-NEXT: ; 34// CHECK-NEXT: #ifdef __GNUC__ 35// CHECK-NEXT: #pragma GCC diagnostic pop 36// CHECK-NEXT: #endif 37// CHECK-EMPTY: 38// CHECK-NEXT: static constexpr llvm::StringTable MyTargetSDNodeNames = 39// CHECK-NEXT: MyTargetSDNodeNamesStorage; 40// CHECK-EMPTY: 41// CHECK-NEXT: static const SDTypeConstraint MyTargetSDTypeConstraints[] = { 42// CHECK-NEXT: /* dummy */ {SDTCisVT, 0, 0, MVT::INVALID_SIMPLE_VALUE_TYPE} 43// CHECK-NEXT: }; 44// CHECK-EMPTY: 45// CHECK-NEXT: static const SDNodeDesc MyTargetSDNodeDescs[] = { 46// CHECK-NEXT: }; 47// CHECK-EMPTY: 48// CHECK-NEXT: static const SDNodeInfo MyTargetGenSDNodeInfo( 49// CHECK-NEXT: /*NumOpcodes=*/0, MyTargetSDNodeDescs, 50// CHECK-NEXT: MyTargetSDNodeNames, MyTargetSDTypeConstraints); 51// CHECK-EMPTY: 52// CHECK-NEXT: } // namespace llvm 53// CHECK-EMPTY: 54// CHECK-NEXT: #endif // GET_SDNODE_DESC 55 56 57//--- trivial-node.td 58// RUN: llvm-tblgen -gen-sd-node-info -I %p/../../../include %t/trivial-node.td \ 59// RUN: | FileCheck %t/trivial-node.td 60 61include "llvm/Target/Target.td" 62 63def MyTarget : Target; 64 65def my_noop : SDNode<"MyTargetISD::NOOP", SDTypeProfile<0, 0, []>>; 66 67// CHECK: namespace llvm::MyTargetISD { 68// CHECK-EMPTY: 69// CHECK-NEXT: enum GenNodeType : unsigned { 70// CHECK-NEXT: NOOP = ISD::BUILTIN_OP_END, 71// CHECK-NEXT: }; 72// CHECK-EMPTY: 73// CHECK-NEXT: static constexpr unsigned GENERATED_OPCODE_END = NOOP + 1; 74// CHECK-EMPTY: 75// CHECK-NEXT: } // namespace llvm::MyTargetISD 76 77// CHECK: static constexpr char MyTargetSDNodeNamesStorage[] = 78// CHECK-NEXT: "\0" 79// CHECK-NEXT: "MyTargetISD::NOOP\0" 80// CHECK-NEXT: ; 81 82// CHECK: static const SDTypeConstraint MyTargetSDTypeConstraints[] = { 83// CHECK-NEXT: /* dummy */ {SDTCisVT, 0, 0, MVT::INVALID_SIMPLE_VALUE_TYPE} 84// CHECK-NEXT: }; 85// CHECK-EMPTY: 86// CHECK-NEXT: static const SDNodeDesc MyTargetSDNodeDescs[] = { 87// CHECK-NEXT: {0, 0, 0, 0, 0, 1, 0, 0}, // NOOP 88// CHECK-NEXT: }; 89// CHECK-EMPTY: 90// CHECK-NEXT: static const SDNodeInfo MyTargetGenSDNodeInfo( 91// CHECK-NEXT: /*NumOpcodes=*/1, MyTargetSDNodeDescs, 92// CHECK-NEXT: MyTargetSDNodeNames, MyTargetSDTypeConstraints); 93 94//--- advanced.td 95// RUN: llvm-tblgen -gen-sd-node-info -I %p/../../../include %t/advanced.td \ 96// RUN: | FileCheck %t/advanced.td 97 98include "llvm/Target/Target.td" 99 100def MyTarget : Target; 101 102def my_node_1 : SDNode< 103 "MyTargetISD::NODE_1", 104 SDTypeProfile<1, 1, [SDTCisVT<0, i1>, SDTCisVT<1, i2>]>, 105 [SDNPHasChain] 106>; 107 108let TSFlags = 42 in 109def my_node_2 : SDNode< 110 "MyTargetISD::NODE_2", 111 SDTypeProfile<3, 1, [ 112 // Prefix of my_node_3 constraints. 113 SDTCisVT<0, i1>, 114 SDTCisPtrTy<1>, 115 SDTCisInt<2>, 116 SDTCisFP<3>, 117 ]>, 118 [SDNPMayStore, SDNPMayLoad, SDNPSideEffect, 119 SDNPMemOperand, SDNPVariadic] 120>; 121 122let IsStrictFP = true, TSFlags = 24 in 123def my_node_3 : SDNode< 124 "MyTargetISD::NODE_3", 125 SDTypeProfile<2, -1, [ 126 SDTCisVT<0, i1>, 127 SDTCisPtrTy<1>, 128 SDTCisInt<2>, 129 SDTCisFP<3>, 130 SDTCisVec<4>, 131 SDTCisSameAs<6, 5>, 132 SDTCisVTSmallerThanOp<8, 7>, 133 SDTCisOpSmallerThanOp<10, 9>, 134 SDTCisEltOfVec<12, 11>, 135 SDTCisSubVecOfVec<14, 13>, 136 SDTCVecEltisVT<15, i32>, 137 SDTCisSameNumEltsAs<17, 16>, 138 SDTCisSameSizeAs<19, 18>, 139 ]>, 140 [SDNPCommutative, SDNPAssociative, SDNPHasChain, 141 SDNPOutGlue, SDNPInGlue, SDNPOptInGlue] 142>; 143 144// CHECK: namespace llvm::MyTargetISD { 145// CHECK-EMPTY: 146// CHECK-NEXT: enum GenNodeType : unsigned { 147// CHECK-NEXT: NODE_1 = ISD::BUILTIN_OP_END, 148// CHECK-NEXT: NODE_2, 149// CHECK-NEXT: NODE_3, 150// CHECK-NEXT: }; 151// CHECK-EMPTY: 152// CHECK-NEXT: static constexpr unsigned GENERATED_OPCODE_END = NODE_3 + 1; 153// CHECK-EMPTY: 154// CHECK-NEXT: } // namespace llvm::MyTargetISD 155 156// CHECK: static constexpr char MyTargetSDNodeNamesStorage[] = 157// CHECK-NEXT: "\0" 158// CHECK-NEXT: "MyTargetISD::NODE_1\0" 159// CHECK-NEXT: "MyTargetISD::NODE_2\0" 160// CHECK-NEXT: "MyTargetISD::NODE_3\0" 161// CHECK-NEXT: ; 162 163// CHECK: static const SDTypeConstraint MyTargetSDTypeConstraints[] = { 164// CHECK-NEXT: /* 0 */ {SDTCisVT, 1, 0, MVT::i2}, 165// CHECK-SAME: {SDTCisVT, 0, 0, MVT::i1}, 166// CHECK-NEXT: /* 2 */ {SDTCisSameSizeAs, 19, 18, MVT::INVALID_SIMPLE_VALUE_TYPE}, 167// CHECK-SAME: {SDTCisSameNumEltsAs, 17, 16, MVT::INVALID_SIMPLE_VALUE_TYPE}, 168// CHECK-SAME: {SDTCVecEltisVT, 15, 0, MVT::i32}, 169// CHECK-SAME: {SDTCisSubVecOfVec, 14, 13, MVT::INVALID_SIMPLE_VALUE_TYPE}, 170// CHECK-SAME: {SDTCisEltOfVec, 12, 11, MVT::INVALID_SIMPLE_VALUE_TYPE}, 171// CHECK-SAME: {SDTCisOpSmallerThanOp, 10, 9, MVT::INVALID_SIMPLE_VALUE_TYPE}, 172// CHECK-SAME: {SDTCisVTSmallerThanOp, 8, 7, MVT::INVALID_SIMPLE_VALUE_TYPE}, 173// CHECK-SAME: {SDTCisSameAs, 6, 5, MVT::INVALID_SIMPLE_VALUE_TYPE}, 174// CHECK-SAME: {SDTCisVec, 4, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, 175// CHECK-SAME: {SDTCisFP, 3, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, 176// CHECK-SAME: {SDTCisInt, 2, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, 177// CHECK-SAME: {SDTCisPtrTy, 1, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, 178// CHECK-SAME: {SDTCisVT, 0, 0, MVT::i1}, 179// CHECK-NEXT: }; 180// CHECK-EMPTY: 181// CHECK-NEXT: static const SDNodeDesc MyTargetSDNodeDescs[] = { 182// CHECK-NEXT: {1, 1, 0|1<<SDNPHasChain, 0, 0, 1, 0, 2}, // NODE_1 183// CHECK-NEXT: {3, 1, 0|1<<SDNPVariadic|1<<SDNPMemOperand, 0, 42, 21, 11, 4}, // NODE_2 184// CHECK-NEXT: {2, -1, 0|1<<SDNPHasChain|1<<SDNPOutGlue|1<<SDNPInGlue|1<<SDNPOptInGlue, 0|1<<SDNFIsStrictFP, 24, 41, 2, 13}, // NODE_3 185// CHECK-NEXT: }; 186// CHECK-EMPTY: 187// CHECK-NEXT: static const SDNodeInfo MyTargetGenSDNodeInfo( 188// CHECK-NEXT: /*NumOpcodes=*/3, MyTargetSDNodeDescs, 189// CHECK-NEXT: MyTargetSDNodeNames, MyTargetSDTypeConstraints); 190