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 SDValue getBasicBlock(MachineBasicBlock *MBB);
310 SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
311 SDValue getExternalSymbol(const char *Sym, MVT VT);
312 SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
313 SDValue getTargetExternalSymbol(const char *Sym, MVT VT);
314 SDValue getTargetExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
315 SDValue getArgFlags(ISD::ArgFlagsTy Flags);
316 SDValue getValueType(MVT);
317 SDValue getRegister(unsigned Reg, MVT VT);
318 SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
320 SDValue getLabel(unsigned Opcode, SDValue Root, unsigned LabelID);
321 SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
324 SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N) {
325 return getNode(ISD::CopyToReg, MVT::Other, Chain,
326 getRegister(Reg, N.getValueType()), N);
329 // This version of the getCopyToReg method takes an extra operand, which
330 // indicates that there is potentially an incoming flag value (if Flag is not
331 // null) and that there should be a flag result.
332 SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N,
334 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
335 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
336 return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
339 // Similar to last getCopyToReg() except parameter Reg is a SDValue
340 SDValue getCopyToReg(SDValue Chain, SDValue Reg, SDValue N,
342 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
343 SDValue Ops[] = { Chain, Reg, N, Flag };
344 return getNode(ISD::CopyToReg, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
347 SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT) {
348 const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
349 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
350 return getNode(ISD::CopyFromReg, VTs, 2, Ops, 2);
353 // This version of the getCopyFromReg method takes an extra operand, which
354 // indicates that there is potentially an incoming flag value (if Flag is not
355 // null) and that there should be a flag result.
356 SDValue getCopyFromReg(SDValue Chain, unsigned Reg, MVT VT,
358 const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
359 SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
360 return getNode(ISD::CopyFromReg, VTs, 3, Ops, Flag.getNode() ? 3 : 2);
363 SDValue getCondCode(ISD::CondCode Cond);
365 /// Returns the ConvertRndSat Note: Avoid using this node because it may
366 /// disappear in the future and most targets don't support it.
367 SDValue getConvertRndSat(MVT VT, SDValue Val, SDValue DTy, SDValue STy,
368 SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
370 /// getZeroExtendInReg - Return the expression required to zero extend the Op
371 /// value assuming it was the smaller SrcTy value.
372 SDValue getZeroExtendInReg(SDValue Op, MVT SrcTy);
373 SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy);
375 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
376 SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
378 /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
379 /// a flag result (to ensure it's not CSE'd).
380 SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
381 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
382 SDValue Ops[] = { Chain, Op };
383 return getNode(ISD::CALLSEQ_START, VTs, 2, Ops, 2);
386 /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
387 /// flag result (to ensure it's not CSE'd).
388 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
390 SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
391 SmallVector<SDValue, 4> Ops;
392 Ops.push_back(Chain);
395 Ops.push_back(InFlag);
396 return getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0],
397 (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
400 /// getNode - Gets or creates the specified node.
402 SDValue getNode(unsigned Opcode, MVT VT);
403 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
404 SDValue getNode(unsigned Opcode, MVT VT, SDValue N);
405 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
406 SDValue getNode(unsigned Opcode, MVT VT, SDValue N1, SDValue N2);
407 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
408 SDValue getNode(unsigned Opcode, MVT VT,
409 SDValue N1, SDValue N2, SDValue N3);
410 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
411 SDValue N1, SDValue N2, SDValue N3);
412 SDValue getNode(unsigned Opcode, MVT VT,
413 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
414 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
415 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
416 SDValue getNode(unsigned Opcode, MVT VT,
417 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
419 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
420 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
422 SDValue getNode(unsigned Opcode, MVT VT,
423 const SDUse *Ops, unsigned NumOps);
424 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
425 const SDUse *Ops, unsigned NumOps);
426 SDValue getNode(unsigned Opcode, MVT VT,
427 const SDValue *Ops, unsigned NumOps);
428 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
429 const SDValue *Ops, unsigned NumOps);
430 SDValue getNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
431 const SDValue *Ops, unsigned NumOps);
432 SDValue getNode(unsigned Opcode, DebugLoc DL,
433 const std::vector<MVT> &ResultTys,
434 const SDValue *Ops, unsigned NumOps);
435 SDValue getNode(unsigned Opcode, const MVT *VTs, unsigned NumVTs,
436 const SDValue *Ops, unsigned NumOps);
437 SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
438 const SDValue *Ops, unsigned NumOps);
439 SDValue getNode(unsigned Opcode, SDVTList VTs,
440 const SDValue *Ops, unsigned NumOps);
441 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
442 const SDValue *Ops, unsigned NumOps);
444 SDValue getNode(unsigned Opcode, SDVTList VTs);
445 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
446 SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N);
447 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
448 SDValue getNode(unsigned Opcode, SDVTList VTs, SDValue N1, SDValue N2);
449 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
450 SDValue N1, SDValue N2);
451 SDValue getNode(unsigned Opcode, SDVTList VTs,
452 SDValue N1, SDValue N2, SDValue N3);
453 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
454 SDValue N1, SDValue N2, SDValue N3);
455 SDValue getNode(unsigned Opcode, SDVTList VTs,
456 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
457 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
458 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
459 SDValue getNode(unsigned Opcode, SDVTList VTs,
460 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
462 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
463 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
466 SDValue getMemcpy(SDValue Chain, SDValue Dst, SDValue Src,
467 SDValue Size, unsigned Align, bool AlwaysInline,
468 const Value *DstSV, uint64_t DstSVOff,
469 const Value *SrcSV, uint64_t SrcSVOff);
471 SDValue getMemmove(SDValue Chain, SDValue Dst, SDValue Src,
472 SDValue Size, unsigned Align,
473 const Value *DstSV, uint64_t DstOSVff,
474 const Value *SrcSV, uint64_t SrcSVOff);
476 SDValue getMemset(SDValue Chain, SDValue Dst, SDValue Src,
477 SDValue Size, unsigned Align,
478 const Value *DstSV, uint64_t DstSVOff);
480 /// getSetCC - Helper function to make it easier to build SetCC's if you just
481 /// have an ISD::CondCode instead of an SDValue.
483 SDValue getSetCC(MVT VT, SDValue LHS, SDValue RHS,
484 ISD::CondCode Cond) {
485 return getNode(ISD::SETCC, DebugLoc::getUnknownLoc(), VT,
486 LHS, RHS, getCondCode(Cond));
488 SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
489 ISD::CondCode Cond) {
490 return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
493 /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
494 /// if you just have an ISD::CondCode instead of an SDValue.
496 SDValue getVSetCC(MVT VT, SDValue LHS, SDValue RHS,
497 ISD::CondCode Cond) {
498 return getNode(ISD::VSETCC, DebugLoc::getUnknownLoc(), VT,
499 LHS, RHS, getCondCode(Cond));
501 SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
502 ISD::CondCode Cond) {
503 return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
506 /// getSelectCC - Helper function to make it easier to build SelectCC's if you
507 /// just have an ISD::CondCode instead of an SDValue.
509 SDValue getSelectCC(SDValue LHS, SDValue RHS,
510 SDValue True, SDValue False, ISD::CondCode Cond) {
511 return getNode(ISD::SELECT_CC, DebugLoc::getUnknownLoc(), True.getValueType(),
512 LHS, RHS, True, False, getCondCode(Cond));
514 SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
515 SDValue True, SDValue False, ISD::CondCode Cond) {
516 return getNode(ISD::SELECT_CC, DL, True.getValueType(),
517 LHS, RHS, True, False, getCondCode(Cond));
520 /// getVAArg - VAArg produces a result and token chain, and takes a pointer
521 /// and a source value as input.
522 SDValue getVAArg(MVT VT, SDValue Chain, SDValue Ptr,
525 /// getAtomic - Gets a node for an atomic op, produces result and chain and
527 SDValue getAtomic(unsigned Opcode, MVT MemVT, SDValue Chain, SDValue Ptr,
528 SDValue Cmp, SDValue Swp, const Value* PtrVal,
529 unsigned Alignment=0);
530 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
531 SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
532 unsigned Alignment=0);
534 /// getAtomic - Gets a node for an atomic op, produces result and chain and
535 /// takes 2 operands.
536 SDValue getAtomic(unsigned Opcode, MVT MemVT, SDValue Chain, SDValue Ptr,
537 SDValue Val, const Value* PtrVal,
538 unsigned Alignment = 0);
539 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
540 SDValue Ptr, SDValue Val, const Value* PtrVal,
541 unsigned Alignment = 0);
543 /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
544 /// result and takes a list of operands.
545 SDValue getMemIntrinsicNode(unsigned Opcode,
546 const MVT *VTs, unsigned NumVTs,
547 const SDValue *Ops, unsigned NumOps,
548 MVT MemVT, const Value *srcValue, int SVOff,
549 unsigned Align = 0, bool Vol = false,
550 bool ReadMem = true, bool WriteMem = true);
551 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
552 const MVT *VTs, unsigned NumVTs,
553 const SDValue *Ops, unsigned NumOps,
554 MVT MemVT, const Value *srcValue, int SVOff,
555 unsigned Align = 0, bool Vol = false,
556 bool ReadMem = true, bool WriteMem = true);
558 SDValue getMemIntrinsicNode(unsigned Opcode, SDVTList VTList,
559 const SDValue *Ops, unsigned NumOps,
560 MVT MemVT, const Value *srcValue, int SVOff,
561 unsigned Align = 0, bool Vol = false,
562 bool ReadMem = true, bool WriteMem = true);
563 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
564 const SDValue *Ops, unsigned NumOps,
565 MVT MemVT, const Value *srcValue, int SVOff,
566 unsigned Align = 0, bool Vol = false,
567 bool ReadMem = true, bool WriteMem = true);
569 /// getMergeValues - Create a MERGE_VALUES node from the given operands.
570 SDValue getMergeValues(const SDValue *Ops, unsigned NumOps);
572 /// getCall - Create a CALL node from the given information.
574 SDValue getCall(unsigned CallingConv, bool IsVarArgs, bool IsTailCall,
575 bool isInreg, SDVTList VTs, const SDValue *Operands,
576 unsigned NumOperands);
577 SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
578 bool IsTailCall, bool isInreg, SDVTList VTs,
579 const SDValue *Operands, unsigned NumOperands);
581 /// getLoad - Loads are not normal binary operators: their result type is not
582 /// determined by their operands, and they produce a value AND a token chain.
584 SDValue getLoad(MVT VT, SDValue Chain, SDValue Ptr,
585 const Value *SV, int SVOffset, bool isVolatile=false,
586 unsigned Alignment=0);
587 SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
588 const Value *SV, int SVOffset, bool isVolatile=false,
589 unsigned Alignment=0);
590 SDValue getExtLoad(ISD::LoadExtType ExtType, MVT VT,
591 SDValue Chain, SDValue Ptr, const Value *SV,
592 int SVOffset, MVT EVT, bool isVolatile=false,
593 unsigned Alignment=0);
594 SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
595 SDValue Chain, SDValue Ptr, const Value *SV,
596 int SVOffset, MVT EVT, bool isVolatile=false,
597 unsigned Alignment=0);
598 SDValue getIndexedLoad(SDValue OrigLoad, SDValue Base,
599 SDValue Offset, ISD::MemIndexedMode AM);
600 SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
601 SDValue Offset, ISD::MemIndexedMode AM);
602 SDValue getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
603 MVT VT, SDValue Chain,
604 SDValue Ptr, SDValue Offset,
605 const Value *SV, int SVOffset, MVT EVT,
606 bool isVolatile=false, unsigned Alignment=0);
607 SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
608 MVT VT, SDValue Chain,
609 SDValue Ptr, SDValue Offset,
610 const Value *SV, int SVOffset, MVT EVT,
611 bool isVolatile=false, unsigned Alignment=0);
613 /// getStore - Helper function to build ISD::STORE nodes.
615 SDValue getStore(SDValue Chain, SDValue Val, SDValue Ptr,
616 const Value *SV, int SVOffset, bool isVolatile=false,
617 unsigned Alignment=0);
618 SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
619 const Value *SV, int SVOffset, bool isVolatile=false,
620 unsigned Alignment=0);
621 SDValue getTruncStore(SDValue Chain, SDValue Val, SDValue Ptr,
622 const Value *SV, int SVOffset, MVT TVT,
623 bool isVolatile=false, unsigned Alignment=0);
624 SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
625 const Value *SV, int SVOffset, MVT TVT,
626 bool isVolatile=false, unsigned Alignment=0);
627 SDValue getIndexedStore(SDValue OrigStoe, SDValue Base,
628 SDValue Offset, ISD::MemIndexedMode AM);
629 SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
630 SDValue Offset, ISD::MemIndexedMode AM);
632 /// getSrcValue - Construct a node to track a Value* through the backend.
633 SDValue getSrcValue(const Value *v);
635 /// getMemOperand - Construct a node to track a memory reference
636 /// through the backend.
637 SDValue getMemOperand(const MachineMemOperand &MO);
639 /// getShiftAmountOperand - Return the specified value casted to
640 /// the target's desired shift amount type.
641 SDValue getShiftAmountOperand(SDValue Op);
643 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
644 /// specified operands. If the resultant node already exists in the DAG,
645 /// this does not modify the specified node, instead it returns the node that
646 /// already exists. If the resultant node does not exist in the DAG, the
647 /// input node is returned. As a degenerate case, if you specify the same
648 /// input operands as the node already has, the input node is returned.
649 SDValue UpdateNodeOperands(SDValue N, SDValue Op);
650 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
651 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
653 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
654 SDValue Op3, SDValue Op4);
655 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
656 SDValue Op3, SDValue Op4, SDValue Op5);
657 SDValue UpdateNodeOperands(SDValue N,
658 const SDValue *Ops, unsigned NumOps);
660 /// SelectNodeTo - These are used for target selectors to *mutate* the
661 /// specified node to have the specified return type, Target opcode, and
662 /// operands. Note that target opcodes are stored as
663 /// ~TargetOpcode in the node opcode field. The resultant node is returned.
664 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
665 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
666 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
667 SDValue Op1, SDValue Op2);
668 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
669 SDValue Op1, SDValue Op2, SDValue Op3);
670 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
671 const SDValue *Ops, unsigned NumOps);
672 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
673 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
674 MVT VT2, const SDValue *Ops, unsigned NumOps);
675 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
676 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
677 SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
678 MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
680 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
681 MVT VT2, SDValue Op1);
682 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
683 MVT VT2, SDValue Op1, SDValue Op2);
684 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
685 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
686 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
687 MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
688 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
689 const SDValue *Ops, unsigned NumOps);
691 /// MorphNodeTo - These *mutate* the specified node to have the specified
692 /// return type, opcode, and operands.
693 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
694 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
695 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
696 SDValue Op1, SDValue Op2);
697 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
698 SDValue Op1, SDValue Op2, SDValue Op3);
699 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
700 const SDValue *Ops, unsigned NumOps);
701 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
702 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
703 MVT VT2, const SDValue *Ops, unsigned NumOps);
704 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
705 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
706 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
707 MVT VT2, SDValue Op1);
708 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
709 MVT VT2, SDValue Op1, SDValue Op2);
710 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
711 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
712 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
713 const SDValue *Ops, unsigned NumOps);
715 /// getTargetNode - These are used for target selectors to create a new node
716 /// with specified return type(s), target opcode, and operands.
718 /// Note that getTargetNode returns the resultant node. If there is already a
719 /// node of the specified opcode and operands, it returns that node instead of
721 SDNode *getTargetNode(unsigned Opcode, MVT VT);
722 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
724 SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1);
725 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
727 SDNode *getTargetNode(unsigned Opcode, MVT VT, SDValue Op1, SDValue Op2);
728 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
731 SDNode *getTargetNode(unsigned Opcode, MVT VT,
732 SDValue Op1, SDValue Op2, SDValue Op3);
733 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
734 SDValue Op1, SDValue Op2, SDValue Op3);
736 SDNode *getTargetNode(unsigned Opcode, MVT VT,
737 const SDValue *Ops, unsigned NumOps);
738 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
739 const SDValue *Ops, unsigned NumOps);
741 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2);
742 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
744 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, SDValue Op1);
745 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
748 SDNode *getTargetNode(unsigned Opcode, MVT VT1,
749 MVT VT2, SDValue Op1, SDValue Op2);
750 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
751 MVT VT2, SDValue Op1, SDValue Op2);
753 SDNode *getTargetNode(unsigned Opcode, MVT VT1,
754 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
755 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
756 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
758 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2,
759 const SDValue *Ops, unsigned NumOps);
760 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
761 const SDValue *Ops, unsigned NumOps);
763 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
764 SDValue Op1, SDValue Op2);
765 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
766 SDValue Op1, SDValue Op2);
768 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
769 SDValue Op1, SDValue Op2, SDValue Op3);
770 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
771 SDValue Op1, SDValue Op2, SDValue Op3);
773 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3,
774 const SDValue *Ops, unsigned NumOps);
775 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
776 const SDValue *Ops, unsigned NumOps);
778 SDNode *getTargetNode(unsigned Opcode, MVT VT1, MVT VT2, MVT VT3, MVT VT4,
779 const SDValue *Ops, unsigned NumOps);
780 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
781 MVT VT4, const SDValue *Ops, unsigned NumOps);
783 SDNode *getTargetNode(unsigned Opcode, const std::vector<MVT> &ResultTys,
784 const SDValue *Ops, unsigned NumOps);
785 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
786 const std::vector<MVT> &ResultTys, const SDValue *Ops,
789 /// getNodeIfExists - Get the specified node if it's already available, or
790 /// else return NULL.
791 SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
792 const SDValue *Ops, unsigned NumOps);
794 /// DAGUpdateListener - Clients of various APIs that cause global effects on
795 /// the DAG can optionally implement this interface. This allows the clients
796 /// to handle the various sorts of updates that happen.
797 class DAGUpdateListener {
799 virtual ~DAGUpdateListener();
801 /// NodeDeleted - The node N that was deleted and, if E is not null, an
802 /// equivalent node E that replaced it.
803 virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
805 /// NodeUpdated - The node N that was updated.
806 virtual void NodeUpdated(SDNode *N) = 0;
809 /// RemoveDeadNode - Remove the specified node from the system. If any of its
810 /// operands then becomes dead, remove them as well. Inform UpdateListener
811 /// for each node deleted.
812 void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
814 /// RemoveDeadNodes - This method deletes the unreachable nodes in the
815 /// given list, and any nodes that become unreachable as a result.
816 void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
817 DAGUpdateListener *UpdateListener = 0);
819 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
820 /// This can cause recursive merging of nodes in the DAG. Use the first
821 /// version if 'From' is known to have a single result, use the second
822 /// if you have two nodes with identical results, use the third otherwise.
824 /// These methods all take an optional UpdateListener, which (if not null) is
825 /// informed about nodes that are deleted and modified due to recursive
826 /// changes in the dag.
828 /// These functions only replace all existing uses. It's possible that as
829 /// these replacements are being performed, CSE may cause the From node
830 /// to be given new uses. These new uses of From are left in place, and
831 /// not automatically transfered to To.
833 void ReplaceAllUsesWith(SDValue From, SDValue Op,
834 DAGUpdateListener *UpdateListener = 0);
835 void ReplaceAllUsesWith(SDNode *From, SDNode *To,
836 DAGUpdateListener *UpdateListener = 0);
837 void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
838 DAGUpdateListener *UpdateListener = 0);
840 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
841 /// uses of other values produced by From.Val alone.
842 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
843 DAGUpdateListener *UpdateListener = 0);
845 /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
846 /// for multiple values at once. This correctly handles the case where
847 /// there is an overlap between the From values and the To values.
848 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
850 DAGUpdateListener *UpdateListener = 0);
852 /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
853 /// assign a unique node id for each node in the DAG based on their
854 /// topological order. Returns the number of nodes.
855 unsigned AssignTopologicalOrder();
857 /// RepositionNode - Move node N in the AllNodes list to be immediately
858 /// before the given iterator Position. This may be used to update the
859 /// topological ordering when the list of nodes is modified.
860 void RepositionNode(allnodes_iterator Position, SDNode *N) {
861 AllNodes.insert(Position, AllNodes.remove(N));
864 /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
866 static bool isCommutativeBinOp(unsigned Opcode) {
867 // FIXME: This should get its info from the td file, so that we can include
882 case ISD::ADDE: return true;
883 default: return false;
889 /// CreateStackTemporary - Create a stack temporary, suitable for holding the
890 /// specified value type. If minAlign is specified, the slot size will have
891 /// at least that alignment.
892 SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
894 /// CreateStackTemporary - Create a stack temporary suitable for holding
895 /// either of the specified value types.
896 SDValue CreateStackTemporary(MVT VT1, MVT VT2);
898 /// FoldConstantArithmetic -
899 SDValue FoldConstantArithmetic(unsigned Opcode,
901 ConstantSDNode *Cst1,
902 ConstantSDNode *Cst2);
904 /// FoldSetCC - Constant fold a setcc to true or false.
905 SDValue FoldSetCC(MVT VT, SDValue N1,
906 SDValue N2, ISD::CondCode Cond);
908 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
909 /// use this predicate to simplify operations downstream.
910 bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
912 /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We
913 /// use this predicate to simplify operations downstream. Op and Mask are
914 /// known to be the same type.
915 bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
918 /// ComputeMaskedBits - Determine which of the bits specified in Mask are
919 /// known to be either zero or one and return them in the KnownZero/KnownOne
920 /// bitsets. This code only analyzes bits in Mask, in order to short-circuit
921 /// processing. Targets can implement the computeMaskedBitsForTargetNode
922 /// method in the TargetLowering class to allow target nodes to be understood.
923 void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
924 APInt &KnownOne, unsigned Depth = 0) const;
926 /// ComputeNumSignBits - Return the number of times the sign bit of the
927 /// register is replicated into the other bits. We know that at least 1 bit
928 /// is always equal to the sign bit (itself), but other cases can give us
929 /// information. For example, immediately after an "SRA X, 2", we know that
930 /// the top 3 bits are all equal to each other, so we return 3. Targets can
931 /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
932 /// class to allow target nodes to be understood.
933 unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
935 /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
936 /// been verified as a debug information descriptor.
937 bool isVerifiedDebugInfoDesc(SDValue Op) const;
939 /// getShuffleScalarElt - Returns the scalar element that will make up the ith
940 /// element of the result of the vector shuffle.
941 SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
944 bool RemoveNodeFromCSEMaps(SDNode *N);
945 void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
946 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
947 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
949 SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
952 void DeleteNodeNotInCSEMaps(SDNode *N);
953 void DeallocateNode(SDNode *N);
955 unsigned getMVTAlignment(MVT MemoryVT) const;
957 void allnodes_clear();
959 /// VTList - List of non-single value types.
960 std::vector<SDVTList> VTList;
962 /// CondCodeNodes - Maps to auto-CSE operations.
963 std::vector<CondCodeSDNode*> CondCodeNodes;
965 std::vector<SDNode*> ValueTypeNodes;
966 std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
967 StringMap<SDNode*> ExternalSymbols;
968 StringMap<SDNode*> TargetExternalSymbols;
971 template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
972 typedef SelectionDAG::allnodes_iterator nodes_iterator;
973 static nodes_iterator nodes_begin(SelectionDAG *G) {
974 return G->allnodes_begin();
976 static nodes_iterator nodes_end(SelectionDAG *G) {
977 return G->allnodes_end();
981 } // end namespace llvm