xref: /llvm-project/llvm/test/TableGen/SDNodeInfoEmitter/basic.td (revision f4de28a63c81c909df28b6b065fad19e2189c54e)
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