// RUN: split-file %s %t //--- no-nodes.td // RUN: llvm-tblgen -gen-sd-node-info -I %p/../../../include %t/no-nodes.td \ // RUN: | FileCheck %t/no-nodes.td include "llvm/Target/Target.td" def MyTarget : Target; // CHECK: #ifdef GET_SDNODE_ENUM // CHECK-NEXT: #undef GET_SDNODE_ENUM // CHECK-EMPTY: // CHECK-NEXT: namespace llvm::MyTargetISD { // CHECK-EMPTY: // CHECK-NEXT: static constexpr unsigned GENERATED_OPCODE_END = ISD::BUILTIN_OP_END; // CHECK-EMPTY: // CHECK-NEXT: } // namespace llvm::MyTargetISD // CHECK-EMPTY: // CHECK-NEXT: #endif // GET_SDNODE_ENUM // CHECK-EMPTY: // CHECK-NEXT: #ifdef GET_SDNODE_DESC // CHECK-NEXT: #undef GET_SDNODE_DESC // CHECK-EMPTY: // CHECK-NEXT: namespace llvm { // CHECK-EMPTY: // CHECK-NEXT: #ifdef __GNUC__ // CHECK-NEXT: #pragma GCC diagnostic push // CHECK-NEXT: #pragma GCC diagnostic ignored "-Woverlength-strings" // CHECK-NEXT: #endif // CHECK-NEXT: static constexpr char MyTargetSDNodeNamesStorage[] = // CHECK-NEXT: "\0" // CHECK-NEXT: ; // CHECK-NEXT: #ifdef __GNUC__ // CHECK-NEXT: #pragma GCC diagnostic pop // CHECK-NEXT: #endif // CHECK-EMPTY: // CHECK-NEXT: static constexpr llvm::StringTable // CHECK-NEXT: MyTargetSDNodeNames = MyTargetSDNodeNamesStorage; // CHECK-EMPTY: // CHECK-NEXT: 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: }; // CHECK-EMPTY: // CHECK-NEXT: static const SDNodeInfo MyTargetGenSDNodeInfo( // CHECK-NEXT: /*NumOpcodes=*/0, MyTargetSDNodeDescs, // CHECK-NEXT: MyTargetSDNodeNames, MyTargetSDTypeConstraints); // CHECK-EMPTY: // CHECK-NEXT: } // namespace llvm // CHECK-EMPTY: // CHECK-NEXT: #endif // GET_SDNODE_DESC //--- trivial-node.td // RUN: llvm-tblgen -gen-sd-node-info -I %p/../../../include %t/trivial-node.td \ // RUN: | FileCheck %t/trivial-node.td include "llvm/Target/Target.td" def MyTarget : Target; def my_noop : SDNode<"MyTargetISD::NOOP", SDTypeProfile<0, 0, []>>; // CHECK: namespace llvm::MyTargetISD { // CHECK-EMPTY: // CHECK-NEXT: enum GenNodeType : unsigned { // CHECK-NEXT: NOOP = ISD::BUILTIN_OP_END, // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK-NEXT: static constexpr unsigned GENERATED_OPCODE_END = NOOP + 1; // CHECK-EMPTY: // CHECK-NEXT: } // namespace llvm::MyTargetISD // CHECK: static constexpr char MyTargetSDNodeNamesStorage[] = // CHECK-NEXT: "\0" // CHECK-NEXT: "MyTargetISD::NOOP\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: {0, 0, 0, 0, 0, 1, 0, 0}, // NOOP // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK-NEXT: static const SDNodeInfo MyTargetGenSDNodeInfo( // CHECK-NEXT: /*NumOpcodes=*/1, MyTargetSDNodeDescs, // CHECK-NEXT: MyTargetSDNodeNames, MyTargetSDTypeConstraints); //--- advanced.td // RUN: llvm-tblgen -gen-sd-node-info -I %p/../../../include %t/advanced.td \ // RUN: | FileCheck %t/advanced.td include "llvm/Target/Target.td" def MyTarget : Target; def my_node_1 : SDNode< "MyTargetISD::NODE_1", SDTypeProfile<1, 1, [SDTCisVT<0, i1>, SDTCisVT<1, i2>]>, [SDNPHasChain] >; let TSFlags = 42 in def my_node_2 : SDNode< "MyTargetISD::NODE_2", SDTypeProfile<3, 1, [ // Prefix of my_node_3 constraints. SDTCisVT<0, i1>, SDTCisPtrTy<1>, SDTCisInt<2>, SDTCisFP<3>, ]>, [SDNPMayStore, SDNPMayLoad, SDNPSideEffect, SDNPMemOperand, SDNPVariadic] >; let IsStrictFP = true, TSFlags = 24 in def my_node_3 : SDNode< "MyTargetISD::NODE_3", SDTypeProfile<2, -1, [ SDTCisVT<0, i1>, SDTCisPtrTy<1>, SDTCisInt<2>, SDTCisFP<3>, SDTCisVec<4>, SDTCisSameAs<6, 5>, SDTCisVTSmallerThanOp<8, 7>, SDTCisOpSmallerThanOp<10, 9>, SDTCisEltOfVec<12, 11>, SDTCisSubVecOfVec<14, 13>, SDTCVecEltisVT<15, i32>, SDTCisSameNumEltsAs<17, 16>, SDTCisSameSizeAs<19, 18>, ]>, [SDNPCommutative, SDNPAssociative, SDNPHasChain, SDNPOutGlue, SDNPInGlue, SDNPOptInGlue] >; // CHECK: namespace llvm::MyTargetISD { // CHECK-EMPTY: // CHECK-NEXT: enum GenNodeType : unsigned { // CHECK-NEXT: NODE_1 = ISD::BUILTIN_OP_END, // CHECK-NEXT: NODE_2, // CHECK-NEXT: NODE_3, // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK-NEXT: static constexpr unsigned GENERATED_OPCODE_END = NODE_3 + 1; // CHECK-EMPTY: // CHECK-NEXT: } // namespace llvm::MyTargetISD // CHECK: static constexpr char MyTargetSDNodeNamesStorage[] = // CHECK-NEXT: "\0" // CHECK-NEXT: "MyTargetISD::NODE_1\0" // CHECK-NEXT: "MyTargetISD::NODE_2\0" // CHECK-NEXT: "MyTargetISD::NODE_3\0" // CHECK-NEXT: ; // CHECK: static const SDTypeConstraint MyTargetSDTypeConstraints[] = { // CHECK-NEXT: /* 0 */ {SDTCisVT, 1, 0, MVT::i2}, // CHECK-SAME: {SDTCisVT, 0, 0, MVT::i1}, // CHECK-NEXT: /* 2 */ {SDTCisSameSizeAs, 19, 18, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisSameNumEltsAs, 17, 16, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCVecEltisVT, 15, 0, MVT::i32}, // CHECK-SAME: {SDTCisSubVecOfVec, 14, 13, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisEltOfVec, 12, 11, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisOpSmallerThanOp, 10, 9, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisVTSmallerThanOp, 8, 7, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisSameAs, 6, 5, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisVec, 4, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisFP, 3, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisInt, 2, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisPtrTy, 1, 0, MVT::INVALID_SIMPLE_VALUE_TYPE}, // CHECK-SAME: {SDTCisVT, 0, 0, MVT::i1}, // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK-NEXT: static const SDNodeDesc MyTargetSDNodeDescs[] = { // CHECK-NEXT: {1, 1, 0|1<