1 //===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares the SelectionDAG class, and transitively defines the
11 // SDNode class and subclasses.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CODEGEN_SELECTIONDAG_H
16 #define LLVM_CODEGEN_SELECTIONDAG_H
18 #include "llvm/ADT/ilist.h"
19 #include "llvm/ADT/DenseSet.h"
20 #include "llvm/ADT/FoldingSet.h"
21 #include "llvm/ADT/StringMap.h"
22 #include "llvm/CodeGen/SelectionDAGNodes.h"
34 class MachineModuleInfo;
36 class MachineFunction;
37 class MachineConstantPoolValue;
38 class FunctionLoweringInfo;
40 template<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> {
42 mutable SDNode Sentinel;
44 ilist_traits() : Sentinel(ISD::DELETED_NODE, SDVTList()) {}
46 SDNode *createSentinel() const {
49 static void destroySentinel(SDNode *) {}
51 static void deleteNode(SDNode *) {
52 assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!");
55 static void createNode(const SDNode &);
59 Unrestricted, // Combine may create illegal operations and illegal types.
60 NoIllegalTypes, // Combine may create illegal operations but no illegal types.
61 NoIllegalOperations // Combine may only create legal operations and types.
64 /// SelectionDAG class - This is used to represent a portion of an LLVM function
65 /// in a low-level Data Dependence DAG representation suitable for instruction
66 /// selection. This DAG is constructed as the first step of instruction
67 /// selection in order to allow implementation of machine specific optimizations
68 /// and code simplifications.
70 /// The representation used by the SelectionDAG is a target-independent
71 /// representation, which has some similarities to the GCC RTL representation,
72 /// but is significantly more simple, powerful, and is a graph form instead of a
78 FunctionLoweringInfo &FLI;
79 MachineModuleInfo *MMI;
82 /// EntryNode - The starting token.
85 /// Root - The root of the entire DAG.
88 /// AllNodes - A linked list of nodes in the current DAG.
89 ilist<SDNode> AllNodes;
91 /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
92 /// pool allocation with recycling.
93 typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
94 AlignOf<MostAlignedSDNode>::Alignment>
97 /// NodeAllocator - Pool allocation for nodes.
98 NodeAllocatorType NodeAllocator;
100 /// CSEMap - This structure is used to memoize nodes, automatically performing
101 /// CSE with existing nodes with a duplicate is requested.
102 FoldingSet<SDNode> CSEMap;
104 /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
105 BumpPtrAllocator OperandAllocator;
107 /// Allocator - Pool allocation for misc. objects that are created once per
109 BumpPtrAllocator Allocator;
111 /// VerifyNode - Sanity check the given node. Aborts if it is invalid.
112 void VerifyNode(SDNode *N);
114 /// setGraphColorHelper - Implementation of setSubgraphColor.
115 /// Return whether we had to truncate the search.
117 bool setSubgraphColorHelper(SDNode *N, const char *Color, DenseSet<SDNode *> &visited,
118 int level, bool &printed);
121 SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
124 /// init - Prepare this SelectionDAG to process code in the given
127 void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw);
129 /// clear - Clear state and free memory necessary to make this
130 /// SelectionDAG ready to process a new block.
134 MachineFunction &getMachineFunction() const { return *MF; }
135 const TargetMachine &getTarget() const;
136 TargetLowering &getTargetLoweringInfo() const { return TLI; }
137 FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
138 MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
139 DwarfWriter *getDwarfWriter() const { return DW; }
141 /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
143 void viewGraph(const std::string &Title);
147 std::map<const SDNode *, std::string> NodeGraphAttrs;
150 /// clearGraphAttrs - Clear all previously defined node graph attributes.
151 /// Intended to be used from a debugging tool (eg. gdb).
152 void clearGraphAttrs();
154 /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
156 void setGraphAttrs(const SDNode *N, const char *Attrs);
158 /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
159 /// Used from getNodeAttributes.
160 const std::string getGraphAttrs(const SDNode *N) const;
162 /// setGraphColor - Convenience for setting node color attribute.
164 void setGraphColor(const SDNode *N, const char *Color);
166 /// setGraphColor - Convenience for setting subgraph color attribute.
168 void setSubgraphColor(SDNode *N, const char *Color);
170 typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
171 allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
172 allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
173 typedef ilist<SDNode>::iterator allnodes_iterator;
174 allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
175 allnodes_iterator allnodes_end() { return AllNodes.end(); }
176 ilist<SDNode>::size_type allnodes_size() const {
177 return AllNodes.size();
180 /// getRoot - Return the root tag of the SelectionDAG.
182 const SDValue &getRoot() const { return Root; }
184 /// getEntryNode - Return the token chain corresponding to the entry of the
186 SDValue getEntryNode() const {
187 return SDValue(const_cast<SDNode *>(&EntryNode), 0);
190 /// setRoot - Set the current root tag of the SelectionDAG.
192 const SDValue &setRoot(SDValue N) {
193 assert((!N.getNode() || N.getValueType() == MVT::Other) &&
194 "DAG root value is not a chain!");
198 /// Combine - This iterates over the nodes in the SelectionDAG, folding
199 /// certain types of nodes together, or eliminating superfluous nodes. The
200 /// Level argument controls whether Combine is allowed to produce nodes and
201 /// types that are illegal on the target.
202 void Combine(CombineLevel Level, AliasAnalysis &AA, bool Fast);
204 /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
205 /// only uses types natively supported by the target. Returns "true" if it
206 /// made any changes.
208 /// Note that this is an involved process that may invalidate pointers into
210 bool LegalizeTypes();
212 /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
213 /// compatible with the target instruction selector, as indicated by the
214 /// TargetLowering object.
216 /// Note that this is an involved process that may invalidate pointers into
218 void Legalize(bool TypesNeedLegalizing);
220 /// RemoveDeadNodes - This method deletes all unreachable nodes in the
222 void RemoveDeadNodes();
224 /// DeleteNode - Remove the specified node from the system. This node must
225 /// have no referrers.
226 void DeleteNode(SDNode *N);
228 /// getVTList - Return an SDVTList that represents the list of values
230 SDVTList getVTList(MVT VT);
231 SDVTList getVTList(MVT VT1, MVT VT2);
232 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
233 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3, MVT VT4);
234 SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
236 /// getNodeValueTypes - These are obsolete, use getVTList instead.
237 const MVT *getNodeValueTypes(MVT VT) {
238 return getVTList(VT).VTs;
240 const MVT *getNodeValueTypes(MVT VT1, MVT VT2) {
241 return getVTList(VT1, VT2).VTs;
243 const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3) {
244 return getVTList(VT1, VT2, VT3).VTs;
246 const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3, MVT VT4) {
247 return getVTList(VT1, VT2, VT3, VT4).VTs;
249 const MVT *getNodeValueTypes(const std::vector<MVT> &vtList) {
250 return getVTList(&vtList[0], (unsigned)vtList.size()).VTs;
254 //===--------------------------------------------------------------------===//
255 // Node creation methods.
257 SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
258 SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
259 SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false);
260 SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
261 SDValue getTargetConstant(uint64_t Val, MVT VT) {
262 return getConstant(Val, VT, true);
264 SDValue getTargetConstant(const APInt &Val, MVT VT) {
265 return getConstant(Val, VT, true);
267 SDValue getTargetConstant(const ConstantInt &Val, MVT VT) {
268 return getConstant(Val, VT, true);
270 SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
271 SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
272 SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false);
273 SDValue getTargetConstantFP(double Val, MVT VT) {
274 return getConstantFP(Val, VT, true);
276 SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
277 return getConstantFP(Val, VT, true);
279 SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) {
280 return getConstantFP(Val, VT, true);
282 SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
283 int64_t offset = 0, bool isTargetGA = false);
284 SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
285 int64_t offset = 0) {
286 return getGlobalAddress(GV, VT, offset, true);
288 SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false);
289 SDValue getTargetFrameIndex(int FI, MVT VT) {
290 return getFrameIndex(FI, VT, true);
292 SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false);
293 SDValue getTargetJumpTable(int JTI, MVT VT) {
294 return getJumpTable(JTI, VT, true);
296 SDValue getConstantPool(Constant *C, MVT VT,
297 unsigned Align = 0, int Offs = 0, bool isT=false);
298 SDValue getTargetConstantPool(Constant *C, MVT VT,
299 unsigned Align = 0, int Offset = 0) {
300 return getConstantPool(C, VT, Align, Offset, true);
302 SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
303 unsigned Align = 0, int Offs = 0, bool isT=false);
304 SDValue getTargetConstantPool(MachineConstantPoolValue *C,
305 MVT VT, unsigned Align = 0,
307 return getConstantPool(C, VT, Align, Offset, true);
309 // When generating a branch to a BB, we don't in general know enough
310 // to provide debug info for the BB at that time, so keep this one around.
311 SDValue getBasicBlock(MachineBasicBlock *MBB);
312 SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
313 SDValue getExternalSymbol(const char *Sym, MVT VT);
314 SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
315 SDValue getTargetExternalSymbol(const char *Sym, MVT VT);
316 SDValue getTargetExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
317 SDValue getArgFlags(ISD::ArgFlagsTy Flags);
318 SDValue getValueType(MVT);
319 SDValue getRegister(unsigned Reg, MVT VT);
320 SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
322 // SDValue getLabel(unsigned Opcode, SDValue Root, unsigned LabelID);
323 SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
326 SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N) {
327 return getNode(ISD::CopyToReg, MVT::Other, Chain,
328 getRegister(Reg, N.getValueType()), N);
330 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
331 return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
332 getRegister(Reg, N.getValueType()), N);
335 // This version of the getCopyToReg method takes an extra operand, which
336 // indicates that there is potentially an incoming flag value (if Flag is not
337 // null) and that there should be a flag result.
338 SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N,
340 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
341 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
342 return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
344 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
346 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
347 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
348 return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
351 // Similar to last getCopyToReg() except parameter Reg is a SDValue
352 SDValue getCopyToReg(SDValue Chain, SDValue Reg, SDValue N,
354 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
355 SDValue Ops[] = { Chain, Reg, N, Flag };
356 return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
358 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
360 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
361 SDValue Ops[] = { Chain, Reg, N, Flag };
362 return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
365 SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT) {
366 const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
367 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
368 return getNode(ISD::CopyFromReg, VTs, 2, Ops, 2);
370 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT) {
371 const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
372 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
373 return getNode(ISD::CopyFromReg, dl, VTs, 2, Ops, 2);
376 // This version of the getCopyFromReg method takes an extra operand, which
377 // indicates that there is potentially an incoming flag value (if Flag is not
378 // null) and that there should be a flag result.
379 SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT,
381 const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
382 SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
383 return getNode(ISD::CopyFromReg, VTs, 3, Ops, Flag.getNode() ? 3 : 2);
385 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT,
387 const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
388 SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
389 return getNode(ISD::CopyFromReg, dl, VTs, 3, Ops, Flag.getNode() ? 3 : 2);
392 SDValue getCondCode(ISD::CondCode Cond);
394 /// Returns the ConvertRndSat Note: Avoid using this node because it may
395 /// disappear in the future and most targets don't support it.
396 // SDValue getConvertRndSat(MVT VT, SDValue Val, SDValue DTy, SDValue STy,
397 // SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
398 SDValue getConvertRndSat(MVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
400 SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
402 /// getZeroExtendInReg - Return the expression required to zero extend the Op
403 /// value assuming it was the smaller SrcTy value.
404 SDValue getZeroExtendInReg(SDValue Op, MVT SrcTy);
405 SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy);
407 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
408 SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
410 /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
411 /// a flag result (to ensure it's not CSE'd).
412 SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
413 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
414 SDValue Ops[] = { Chain, Op };
415 return getNode(ISD::CALLSEQ_START, VTs, 2, Ops, 2);
418 /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
419 /// flag result (to ensure it's not CSE'd).
420 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
422 SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
423 SmallVector<SDValue, 4> Ops;
424 Ops.push_back(Chain);
427 Ops.push_back(InFlag);
428 return getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0],
429 (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
432 /// getNode - Gets or creates the specified node.
434 SDValue getNode(unsigned Opcode, MVT VT);
435 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
436 SDValue getNode(unsigned Opcode, MVT VT, SDValue N);
437 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
438 SDValue getNode(unsigned Opcode, MVT VT, SDValue N1, SDValue N2);
439 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
440 SDValue getNode(unsigned Opcode, MVT VT,
441 SDValue N1, SDValue N2, SDValue N3);
442 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
443 SDValue N1, SDValue N2, SDValue N3);
444 SDValue getNode(unsigned Opcode, MVT VT,
445 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
446 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
447 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
448 SDValue getNode(unsigned Opcode, MVT VT,
449 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
451 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
452 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
454 SDValue getNode(unsigned Opcode, MVT VT,
455 const SDUse *Ops, unsigned NumOps);
456 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
457 const SDUse *Ops, unsigned NumOps);
458 SDValue getNode(unsigned Opcode, MVT VT,
459 const SDValue *Ops, unsigned NumOps);
460 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
461 const SDValue *Ops, unsigned NumOps);
462 SDValue getNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
463 const SDValue *Ops, unsigned NumOps);
464 SDValue getNode(unsigned Opcode, DebugLoc DL,
465 const std::vector<MVT> &ResultTys,
466 const SDValue *Ops, unsigned NumOps);
467 SDValue getNode(unsigned Opcode, const MVT *VTs, unsigned NumVTs,
468 const SDValue *Ops, unsigned NumOps);
469 SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
470 const SDValue *Ops, unsigned NumOps);
471 SDValue getNode(unsigned Opcode, SDVTList VTs,
472 const SDValue *Ops, unsigned NumOps);
473 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
474 const SDValue *Ops, unsigned NumOps);
476 SDValue getNode(unsigned Opcode, SDVTList VTs);
477 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
478 SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N);
479 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
480 SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N1, SDValue N2);
481 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
482 SDValue N1, SDValue N2);
483 SDValue getNode(unsigned Opcode, SDVTList VTs,
484 SDValue N1, SDValue N2, SDValue N3);
485 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
486 SDValue N1, SDValue N2, SDValue N3);
487 SDValue getNode(unsigned Opcode, SDVTList VTs,
488 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
489 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
490 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
491 SDValue getNode(unsigned Opcode, SDVTList VTs,
492 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
494 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
495 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
498 SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
499 SDValue Size, unsigned Align, bool AlwaysInline,
500 const Value *DstSV, uint64_t DstSVOff,
501 const Value *SrcSV, uint64_t SrcSVOff);
503 SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
504 SDValue Size, unsigned Align,
505 const Value *DstSV, uint64_t DstOSVff,
506 const Value *SrcSV, uint64_t SrcSVOff);
508 SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
509 SDValue Size, unsigned Align,
510 const Value *DstSV, uint64_t DstSVOff);
512 /// getSetCC - Helper function to make it easier to build SetCC's if you just
513 /// have an ISD::CondCode instead of an SDValue.
515 SDValue getSetCC(MVT VT, SDValue LHS, SDValue RHS,
516 ISD::CondCode Cond) {
517 return getNode(ISD::SETCC, DebugLoc::getUnknownLoc(), VT,
518 LHS, RHS, getCondCode(Cond));
520 SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
521 ISD::CondCode Cond) {
522 return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
525 /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
526 /// if you just have an ISD::CondCode instead of an SDValue.
528 SDValue getVSetCC(MVT VT, SDValue LHS, SDValue RHS,
529 ISD::CondCode Cond) {
530 return getNode(ISD::VSETCC, DebugLoc::getUnknownLoc(), VT,
531 LHS, RHS, getCondCode(Cond));
533 SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
534 ISD::CondCode Cond) {
535 return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
538 /// getSelectCC - Helper function to make it easier to build SelectCC's if you
539 /// just have an ISD::CondCode instead of an SDValue.
541 SDValue getSelectCC(SDValue LHS, SDValue RHS,
542 SDValue True, SDValue False, ISD::CondCode Cond) {
543 return getNode(ISD::SELECT_CC, DebugLoc::getUnknownLoc(), True.getValueType(),
544 LHS, RHS, True, False, getCondCode(Cond));
546 SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
547 SDValue True, SDValue False, ISD::CondCode Cond) {
548 return getNode(ISD::SELECT_CC, DL, True.getValueType(),
549 LHS, RHS, True, False, getCondCode(Cond));
552 /// getVAArg - VAArg produces a result and token chain, and takes a pointer
553 /// and a source value as input.
554 SDValue getVAArg(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
557 /// getAtomic - Gets a node for an atomic op, produces result and chain and
559 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
560 SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
561 unsigned Alignment=0);
563 /// getAtomic - Gets a node for an atomic op, produces result and chain and
564 /// takes 2 operands.
565 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
566 SDValue Ptr, SDValue Val, const Value* PtrVal,
567 unsigned Alignment = 0);
569 /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
570 /// result and takes a list of operands.
571 SDValue getMemIntrinsicNode(unsigned Opcode,
572 const MVT *VTs, unsigned NumVTs,
573 const SDValue *Ops, unsigned NumOps,
574 MVT MemVT, const Value *srcValue, int SVOff,
575 unsigned Align = 0, bool Vol = false,
576 bool ReadMem = true, bool WriteMem = true);
577 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
578 const MVT *VTs, unsigned NumVTs,
579 const SDValue *Ops, unsigned NumOps,
580 MVT MemVT, const Value *srcValue, int SVOff,
581 unsigned Align = 0, bool Vol = false,
582 bool ReadMem = true, bool WriteMem = true);
584 SDValue getMemIntrinsicNode(unsigned Opcode, SDVTList VTList,
585 const SDValue *Ops, unsigned NumOps,
586 MVT MemVT, const Value *srcValue, int SVOff,
587 unsigned Align = 0, bool Vol = false,
588 bool ReadMem = true, bool WriteMem = true);
589 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
590 const SDValue *Ops, unsigned NumOps,
591 MVT MemVT, const Value *srcValue, int SVOff,
592 unsigned Align = 0, bool Vol = false,
593 bool ReadMem = true, bool WriteMem = true);
595 /// getMergeValues - Create a MERGE_VALUES node from the given operands.
596 SDValue getMergeValues(const SDValue *Ops, unsigned NumOps);
597 SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
599 /// getCall - Create a CALL node from the given information.
601 SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
602 bool IsTailCall, bool isInreg, SDVTList VTs,
603 const SDValue *Operands, unsigned NumOperands);
605 /// getLoad - Loads are not normal binary operators: their result type is not
606 /// determined by their operands, and they produce a value AND a token chain.
608 SDValue getLoad(MVT VT, SDValue Chain, SDValue Ptr,
609 const Value *SV, int SVOffset, bool isVolatile=false,
610 unsigned Alignment=0);
611 SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
612 const Value *SV, int SVOffset, bool isVolatile=false,
613 unsigned Alignment=0);
614 SDValue getExtLoad(ISD::LoadExtType ExtType, MVT VT,
615 SDValue Chain, SDValue Ptr, const Value *SV,
616 int SVOffset, MVT EVT, bool isVolatile=false,
617 unsigned Alignment=0);
618 SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
619 SDValue Chain, SDValue Ptr, const Value *SV,
620 int SVOffset, MVT EVT, bool isVolatile=false,
621 unsigned Alignment=0);
622 SDValue getIndexedLoad(SDValue OrigLoad, SDValue Base,
623 SDValue Offset, ISD::MemIndexedMode AM);
624 SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
625 SDValue Offset, ISD::MemIndexedMode AM);
626 SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
627 MVT VT, SDValue Chain,
628 SDValue Ptr, SDValue Offset,
629 const Value *SV, int SVOffset, MVT EVT,
630 bool isVolatile=false, unsigned Alignment=0);
631 SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
632 MVT VT, SDValue Chain,
633 SDValue Ptr, SDValue Offset,
634 const Value *SV, int SVOffset, MVT EVT,
635 bool isVolatile=false, unsigned Alignment=0);
637 /// getStore - Helper function to build ISD::STORE nodes.
639 SDValue getStore(SDValue Chain, SDValue Val, SDValue Ptr,
640 const Value *SV, int SVOffset, bool isVolatile=false,
641 unsigned Alignment=0);
642 SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
643 const Value *SV, int SVOffset, bool isVolatile=false,
644 unsigned Alignment=0);
645 SDValue getTruncStore(SDValue Chain, SDValue Val, SDValue Ptr,
646 const Value *SV, int SVOffset, MVT TVT,
647 bool isVolatile=false, unsigned Alignment=0);
648 SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
649 const Value *SV, int SVOffset, MVT TVT,
650 bool isVolatile=false, unsigned Alignment=0);
651 SDValue getIndexedStore(SDValue OrigStoe, SDValue Base,
652 SDValue Offset, ISD::MemIndexedMode AM);
653 SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
654 SDValue Offset, ISD::MemIndexedMode AM);
656 /// getSrcValue - Construct a node to track a Value* through the backend.
657 SDValue getSrcValue(const Value *v);
659 /// getMemOperand - Construct a node to track a memory reference
660 /// through the backend.
661 SDValue getMemOperand(const MachineMemOperand &MO);
663 /// getShiftAmountOperand - Return the specified value casted to
664 /// the target's desired shift amount type.
665 SDValue getShiftAmountOperand(SDValue Op);
667 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
668 /// specified operands. If the resultant node already exists in the DAG,
669 /// this does not modify the specified node, instead it returns the node that
670 /// already exists. If the resultant node does not exist in the DAG, the
671 /// input node is returned. As a degenerate case, if you specify the same
672 /// input operands as the node already has, the input node is returned.
673 SDValue UpdateNodeOperands(SDValue N, SDValue Op);
674 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
675 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
677 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
678 SDValue Op3, SDValue Op4);
679 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
680 SDValue Op3, SDValue Op4, SDValue Op5);
681 SDValue UpdateNodeOperands(SDValue N,
682 const SDValue *Ops, unsigned NumOps);
684 /// SelectNodeTo - These are used for target selectors to *mutate* the
685 /// specified node to have the specified return type, Target opcode, and
686 /// operands. Note that target opcodes are stored as
687 /// ~TargetOpcode in the node opcode field. The resultant node is returned.
688 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
689 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
690 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
691 SDValue Op1, SDValue Op2);
692 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
693 SDValue Op1, SDValue Op2, SDValue Op3);
694 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
695 const SDValue *Ops, unsigned NumOps);
696 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
697 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
698 MVT VT2, const SDValue *Ops, unsigned NumOps);
699 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
700 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
701 SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
702 MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
704 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
705 MVT VT2, SDValue Op1);
706 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
707 MVT VT2, SDValue Op1, SDValue Op2);
708 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
709 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
710 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
711 MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
712 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
713 const SDValue *Ops, unsigned NumOps);
715 /// MorphNodeTo - These *mutate* the specified node to have the specified
716 /// return type, opcode, and operands.
717 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
718 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
719 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
720 SDValue Op1, SDValue Op2);
721 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
722 SDValue Op1, SDValue Op2, SDValue Op3);
723 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
724 const SDValue *Ops, unsigned NumOps);
725 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
726 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
727 MVT VT2, const SDValue *Ops, unsigned NumOps);
728 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
729 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
730 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
731 MVT VT2, SDValue Op1);
732 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
733 MVT VT2, SDValue Op1, SDValue Op2);
734 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
735 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
736 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
737 const SDValue *Ops, unsigned NumOps);
739 /// getTargetNode - These are used for target selectors to create a new node
740 /// with specified return type(s), target opcode, and operands.
742 /// Note that getTargetNode returns the resultant node. If there is already a
743 /// node of the specified opcode and operands, it returns that node instead of
745 SDNode *getTargetNode(unsigned Opcode, MVT VT);
746 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
748 SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1);
749 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
751 SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1, SDValue Op2);
752 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
755 SDNode *getTargetNode(unsigned Opcode, MVT VT,
756 SDValue Op1, SDValue Op2, SDValue Op3);
757 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
758 SDValue Op1, SDValue Op2, SDValue Op3);
760 SDNode *getTargetNode(unsigned Opcode, MVT VT,
761 const SDValue *Ops, unsigned NumOps);
762 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
763 const SDValue *Ops, unsigned NumOps);
765 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2);
766 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
768 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, SDValue Op1);
769 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
772 SDNode *getTargetNode(unsigned Opcode, MVT VT1,
773 MVT VT2, SDValue Op1, SDValue Op2);
774 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
775 MVT VT2, SDValue Op1, SDValue Op2);
777 SDNode *getTargetNode(unsigned Opcode, MVT VT1,
778 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
779 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
780 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
782 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2,
783 const SDValue *Ops, unsigned NumOps);
784 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
785 const SDValue *Ops, unsigned NumOps);
787 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
788 SDValue Op1, SDValue Op2);
789 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
790 SDValue Op1, SDValue Op2);
792 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
793 SDValue Op1, SDValue Op2, SDValue Op3);
794 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
795 SDValue Op1, SDValue Op2, SDValue Op3);
797 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
798 const SDValue *Ops, unsigned NumOps);
799 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
800 const SDValue *Ops, unsigned NumOps);
802 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3, MVT VT4,
803 const SDValue *Ops, unsigned NumOps);
804 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
805 MVT VT4, const SDValue *Ops, unsigned NumOps);
807 SDNode *getTargetNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
808 const SDValue *Ops, unsigned NumOps);
809 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
810 const std::vector<MVT> &ResultTys, const SDValue *Ops,
813 /// getNodeIfExists - Get the specified node if it's already available, or
814 /// else return NULL.
815 SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
816 const SDValue *Ops, unsigned NumOps);
818 /// DAGUpdateListener - Clients of various APIs that cause global effects on
819 /// the DAG can optionally implement this interface. This allows the clients
820 /// to handle the various sorts of updates that happen.
821 class DAGUpdateListener {
823 virtual ~DAGUpdateListener();
825 /// NodeDeleted - The node N that was deleted and, if E is not null, an
826 /// equivalent node E that replaced it.
827 virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
829 /// NodeUpdated - The node N that was updated.
830 virtual void NodeUpdated(SDNode *N) = 0;
833 /// RemoveDeadNode - Remove the specified node from the system. If any of its
834 /// operands then becomes dead, remove them as well. Inform UpdateListener
835 /// for each node deleted.
836 void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
838 /// RemoveDeadNodes - This method deletes the unreachable nodes in the
839 /// given list, and any nodes that become unreachable as a result.
840 void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
841 DAGUpdateListener *UpdateListener = 0);
843 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
844 /// This can cause recursive merging of nodes in the DAG. Use the first
845 /// version if 'From' is known to have a single result, use the second
846 /// if you have two nodes with identical results, use the third otherwise.
848 /// These methods all take an optional UpdateListener, which (if not null) is
849 /// informed about nodes that are deleted and modified due to recursive
850 /// changes in the dag.
852 /// These functions only replace all existing uses. It's possible that as
853 /// these replacements are being performed, CSE may cause the From node
854 /// to be given new uses. These new uses of From are left in place, and
855 /// not automatically transfered to To.
857 void ReplaceAllUsesWith(SDValue From, SDValue Op,
858 DAGUpdateListener *UpdateListener = 0);
859 void ReplaceAllUsesWith(SDNode *From, SDNode *To,
860 DAGUpdateListener *UpdateListener = 0);
861 void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
862 DAGUpdateListener *UpdateListener = 0);
864 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
865 /// uses of other values produced by From.Val alone.
866 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
867 DAGUpdateListener *UpdateListener = 0);
869 /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
870 /// for multiple values at once. This correctly handles the case where
871 /// there is an overlap between the From values and the To values.
872 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
874 DAGUpdateListener *UpdateListener = 0);
876 /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
877 /// assign a unique node id for each node in the DAG based on their
878 /// topological order. Returns the number of nodes.
879 unsigned AssignTopologicalOrder();
881 /// RepositionNode - Move node N in the AllNodes list to be immediately
882 /// before the given iterator Position. This may be used to update the
883 /// topological ordering when the list of nodes is modified.
884 void RepositionNode(allnodes_iterator Position, SDNode *N) {
885 AllNodes.insert(Position, AllNodes.remove(N));
888 /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
890 static bool isCommutativeBinOp(unsigned Opcode) {
891 // FIXME: This should get its info from the td file, so that we can include
906 case ISD::ADDE: return true;
907 default: return false;
913 /// CreateStackTemporary - Create a stack temporary, suitable for holding the
914 /// specified value type. If minAlign is specified, the slot size will have
915 /// at least that alignment.
916 SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
918 /// CreateStackTemporary - Create a stack temporary suitable for holding
919 /// either of the specified value types.
920 SDValue CreateStackTemporary(MVT VT1, MVT VT2);
922 /// FoldConstantArithmetic -
923 SDValue FoldConstantArithmetic(unsigned Opcode,
925 ConstantSDNode *Cst1,
926 ConstantSDNode *Cst2);
928 /// FoldSetCC - Constant fold a setcc to true or false.
929 SDValue FoldSetCC(MVT VT, SDValue N1,
930 SDValue N2, ISD::CondCode Cond, DebugLoc dl);
932 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
933 /// use this predicate to simplify operations downstream.
934 bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
936 /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We
937 /// use this predicate to simplify operations downstream. Op and Mask are
938 /// known to be the same type.
939 bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
942 /// ComputeMaskedBits - Determine which of the bits specified in Mask are
943 /// known to be either zero or one and return them in the KnownZero/KnownOne
944 /// bitsets. This code only analyzes bits in Mask, in order to short-circuit
945 /// processing. Targets can implement the computeMaskedBitsForTargetNode
946 /// method in the TargetLowering class to allow target nodes to be understood.
947 void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
948 APInt &KnownOne, unsigned Depth = 0) const;
950 /// ComputeNumSignBits - Return the number of times the sign bit of the
951 /// register is replicated into the other bits. We know that at least 1 bit
952 /// is always equal to the sign bit (itself), but other cases can give us
953 /// information. For example, immediately after an "SRA X, 2", we know that
954 /// the top 3 bits are all equal to each other, so we return 3. Targets can
955 /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
956 /// class to allow target nodes to be understood.
957 unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
959 /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
960 /// been verified as a debug information descriptor.
961 bool isVerifiedDebugInfoDesc(SDValue Op) const;
963 /// getShuffleScalarElt - Returns the scalar element that will make up the ith
964 /// element of the result of the vector shuffle.
965 SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
968 bool RemoveNodeFromCSEMaps(SDNode *N);
969 void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
970 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
971 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
973 SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
976 void DeleteNodeNotInCSEMaps(SDNode *N);
977 void DeallocateNode(SDNode *N);
979 unsigned getMVTAlignment(MVT MemoryVT) const;
981 void allnodes_clear();
983 /// VTList - List of non-single value types.
984 std::vector<SDVTList> VTList;
986 /// CondCodeNodes - Maps to auto-CSE operations.
987 std::vector<CondCodeSDNode*> CondCodeNodes;
989 std::vector<SDNode*> ValueTypeNodes;
990 std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
991 StringMap<SDNode*> ExternalSymbols;
992 StringMap<SDNode*> TargetExternalSymbols;
995 template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
996 typedef SelectionDAG::allnodes_iterator nodes_iterator;
997 static nodes_iterator nodes_begin(SelectionDAG *G) {
998 return G->allnodes_begin();
1000 static nodes_iterator nodes_end(SelectionDAG *G) {
1001 return G->allnodes_end();
1005 } // end namespace llvm