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, DebugLoc dl, SDValue Root,
325 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
326 return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
327 getRegister(Reg, N.getValueType()), N);
330 // This version of the getCopyToReg method takes an extra operand, which
331 // indicates that there is potentially an incoming flag value (if Flag is not
332 // null) and that there should be a flag result.
333 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
335 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
336 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
337 return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
340 // Similar to last getCopyToReg() except parameter Reg is a SDValue
341 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
343 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
344 SDValue Ops[] = { Chain, Reg, N, Flag };
345 return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
348 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT) {
349 const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
350 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
351 return getNode(ISD::CopyFromReg, dl, VTs, 2, Ops, 2);
354 // This version of the getCopyFromReg method takes an extra operand, which
355 // indicates that there is potentially an incoming flag value (if Flag is not
356 // null) and that there should be a flag result.
357 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT,
359 const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
360 SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
361 return getNode(ISD::CopyFromReg, dl, VTs, 3, Ops, Flag.getNode() ? 3 : 2);
364 SDValue getCondCode(ISD::CondCode Cond);
366 /// Returns the ConvertRndSat Note: Avoid using this node because it may
367 /// disappear in the future and most targets don't support it.
368 SDValue getConvertRndSat(MVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
370 SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
372 /// getZeroExtendInReg - Return the expression required to zero extend the Op
373 /// value assuming it was the smaller SrcTy value.
374 SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy);
376 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
377 SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
379 /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
380 /// a flag result (to ensure it's not CSE'd). CALLSEQ_START does not have a
382 SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
383 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
384 SDValue Ops[] = { Chain, Op };
385 return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(),
389 /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
390 /// flag result (to ensure it's not CSE'd). CALLSEQ_END does not have
391 /// a useful DebugLoc.
392 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
394 SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
395 SmallVector<SDValue, 4> Ops;
396 Ops.push_back(Chain);
399 Ops.push_back(InFlag);
400 return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys,
402 (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
405 /// getUNDEF - Return an UNDEF node. UNDEF does not have a useful DebugLoc.
406 SDValue getUNDEF(MVT VT) {
407 return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT);
410 /// getNode - Gets or creates the specified node.
412 SDValue getNode(unsigned Opcode, MVT VT);
413 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
414 SDValue getNode(unsigned Opcode, MVT VT, SDValue N);
415 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
416 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
417 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
418 SDValue N1, SDValue N2, SDValue N3);
419 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
420 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
421 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
422 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
424 SDValue getNode(unsigned Opcode, MVT VT,
425 const SDUse *Ops, unsigned NumOps);
426 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
427 const SDUse *Ops, unsigned NumOps);
428 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
429 const SDValue *Ops, unsigned NumOps);
430 SDValue getNode(unsigned Opcode, DebugLoc DL,
431 const std::vector<MVT> &ResultTys,
432 const SDValue *Ops, unsigned NumOps);
433 SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
434 const SDValue *Ops, unsigned NumOps);
435 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
436 const SDValue *Ops, unsigned NumOps);
437 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
438 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
439 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
440 SDValue N1, SDValue N2);
441 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
442 SDValue N1, SDValue N2, SDValue N3);
443 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
444 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
445 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
446 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
449 SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
450 SDValue Size, unsigned Align, bool AlwaysInline,
451 const Value *DstSV, uint64_t DstSVOff,
452 const Value *SrcSV, uint64_t SrcSVOff);
454 SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
455 SDValue Size, unsigned Align,
456 const Value *DstSV, uint64_t DstOSVff,
457 const Value *SrcSV, uint64_t SrcSVOff);
459 SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
460 SDValue Size, unsigned Align,
461 const Value *DstSV, uint64_t DstSVOff);
463 /// getSetCC - Helper function to make it easier to build SetCC's if you just
464 /// have an ISD::CondCode instead of an SDValue.
466 SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
467 ISD::CondCode Cond) {
468 return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
471 /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
472 /// if you just have an ISD::CondCode instead of an SDValue.
474 SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
475 ISD::CondCode Cond) {
476 return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
479 /// getSelectCC - Helper function to make it easier to build SelectCC's if you
480 /// just have an ISD::CondCode instead of an SDValue.
482 SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
483 SDValue True, SDValue False, ISD::CondCode Cond) {
484 return getNode(ISD::SELECT_CC, DL, True.getValueType(),
485 LHS, RHS, True, False, getCondCode(Cond));
488 /// getVAArg - VAArg produces a result and token chain, and takes a pointer
489 /// and a source value as input.
490 SDValue getVAArg(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
493 /// getAtomic - Gets a node for an atomic op, produces result and chain and
495 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
496 SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
497 unsigned Alignment=0);
499 /// getAtomic - Gets a node for an atomic op, produces result and chain and
500 /// takes 2 operands.
501 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
502 SDValue Ptr, SDValue Val, const Value* PtrVal,
503 unsigned Alignment = 0);
505 /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
506 /// result and takes a list of operands.
507 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
508 const MVT *VTs, unsigned NumVTs,
509 const SDValue *Ops, unsigned NumOps,
510 MVT MemVT, const Value *srcValue, int SVOff,
511 unsigned Align = 0, bool Vol = false,
512 bool ReadMem = true, bool WriteMem = true);
514 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
515 const SDValue *Ops, unsigned NumOps,
516 MVT MemVT, const Value *srcValue, int SVOff,
517 unsigned Align = 0, bool Vol = false,
518 bool ReadMem = true, bool WriteMem = true);
520 /// getMergeValues - Create a MERGE_VALUES node from the given operands.
521 SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
523 /// getCall - Create a CALL node from the given information.
525 SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
526 bool IsTailCall, bool isInreg, SDVTList VTs,
527 const SDValue *Operands, unsigned NumOperands);
529 /// getLoad - Loads are not normal binary operators: their result type is not
530 /// determined by their operands, and they produce a value AND a token chain.
532 SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
533 const Value *SV, int SVOffset, bool isVolatile=false,
534 unsigned Alignment=0);
535 SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
536 SDValue Chain, SDValue Ptr, const Value *SV,
537 int SVOffset, MVT EVT, bool isVolatile=false,
538 unsigned Alignment=0);
539 SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
540 SDValue Offset, ISD::MemIndexedMode AM);
541 SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
542 MVT VT, SDValue Chain,
543 SDValue Ptr, SDValue Offset,
544 const Value *SV, int SVOffset, MVT EVT,
545 bool isVolatile=false, unsigned Alignment=0);
547 /// getStore - Helper function to build ISD::STORE nodes.
549 SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
550 const Value *SV, int SVOffset, bool isVolatile=false,
551 unsigned Alignment=0);
552 SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
553 const Value *SV, int SVOffset, MVT TVT,
554 bool isVolatile=false, unsigned Alignment=0);
555 SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
556 SDValue Offset, ISD::MemIndexedMode AM);
558 /// getSrcValue - Construct a node to track a Value* through the backend.
559 SDValue getSrcValue(const Value *v);
561 /// getMemOperand - Construct a node to track a memory reference
562 /// through the backend.
563 SDValue getMemOperand(const MachineMemOperand &MO);
565 /// getShiftAmountOperand - Return the specified value casted to
566 /// the target's desired shift amount type.
567 SDValue getShiftAmountOperand(SDValue Op);
569 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
570 /// specified operands. If the resultant node already exists in the DAG,
571 /// this does not modify the specified node, instead it returns the node that
572 /// already exists. If the resultant node does not exist in the DAG, the
573 /// input node is returned. As a degenerate case, if you specify the same
574 /// input operands as the node already has, the input node is returned.
575 SDValue UpdateNodeOperands(SDValue N, SDValue Op);
576 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
577 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
579 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
580 SDValue Op3, SDValue Op4);
581 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
582 SDValue Op3, SDValue Op4, SDValue Op5);
583 SDValue UpdateNodeOperands(SDValue N,
584 const SDValue *Ops, unsigned NumOps);
586 /// SelectNodeTo - These are used for target selectors to *mutate* the
587 /// specified node to have the specified return type, Target opcode, and
588 /// operands. Note that target opcodes are stored as
589 /// ~TargetOpcode in the node opcode field. The resultant node is returned.
590 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
591 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
592 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
593 SDValue Op1, SDValue Op2);
594 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
595 SDValue Op1, SDValue Op2, SDValue Op3);
596 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
597 const SDValue *Ops, unsigned NumOps);
598 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
599 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
600 MVT VT2, const SDValue *Ops, unsigned NumOps);
601 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
602 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
603 SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
604 MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
606 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
607 MVT VT2, SDValue Op1);
608 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
609 MVT VT2, SDValue Op1, SDValue Op2);
610 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
611 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
612 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
613 MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
614 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
615 const SDValue *Ops, unsigned NumOps);
617 /// MorphNodeTo - These *mutate* the specified node to have the specified
618 /// return type, opcode, and operands.
619 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
620 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
621 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
622 SDValue Op1, SDValue Op2);
623 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
624 SDValue Op1, SDValue Op2, SDValue Op3);
625 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
626 const SDValue *Ops, unsigned NumOps);
627 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
628 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
629 MVT VT2, const SDValue *Ops, unsigned NumOps);
630 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
631 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
632 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
633 MVT VT2, SDValue Op1);
634 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
635 MVT VT2, SDValue Op1, SDValue Op2);
636 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
637 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
638 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
639 const SDValue *Ops, unsigned NumOps);
641 /// getTargetNode - These are used for target selectors to create a new node
642 /// with specified return type(s), target opcode, and operands.
644 /// Note that getTargetNode returns the resultant node. If there is already a
645 /// node of the specified opcode and operands, it returns that node instead of
647 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
648 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
649 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
651 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
652 SDValue Op1, SDValue Op2, SDValue Op3);
653 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
654 const SDValue *Ops, unsigned NumOps);
655 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
656 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
658 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
659 MVT VT2, SDValue Op1, SDValue Op2);
660 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
661 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
662 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
663 const SDValue *Ops, unsigned NumOps);
664 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
665 SDValue Op1, SDValue Op2);
666 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
667 SDValue Op1, SDValue Op2, SDValue Op3);
668 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
669 const SDValue *Ops, unsigned NumOps);
670 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
671 MVT VT4, const SDValue *Ops, unsigned NumOps);
672 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
673 const std::vector<MVT> &ResultTys, const SDValue *Ops,
676 /// getNodeIfExists - Get the specified node if it's already available, or
677 /// else return NULL.
678 SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
679 const SDValue *Ops, unsigned NumOps);
681 /// DAGUpdateListener - Clients of various APIs that cause global effects on
682 /// the DAG can optionally implement this interface. This allows the clients
683 /// to handle the various sorts of updates that happen.
684 class DAGUpdateListener {
686 virtual ~DAGUpdateListener();
688 /// NodeDeleted - The node N that was deleted and, if E is not null, an
689 /// equivalent node E that replaced it.
690 virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
692 /// NodeUpdated - The node N that was updated.
693 virtual void NodeUpdated(SDNode *N) = 0;
696 /// RemoveDeadNode - Remove the specified node from the system. If any of its
697 /// operands then becomes dead, remove them as well. Inform UpdateListener
698 /// for each node deleted.
699 void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
701 /// RemoveDeadNodes - This method deletes the unreachable nodes in the
702 /// given list, and any nodes that become unreachable as a result.
703 void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
704 DAGUpdateListener *UpdateListener = 0);
706 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
707 /// This can cause recursive merging of nodes in the DAG. Use the first
708 /// version if 'From' is known to have a single result, use the second
709 /// if you have two nodes with identical results, use the third otherwise.
711 /// These methods all take an optional UpdateListener, which (if not null) is
712 /// informed about nodes that are deleted and modified due to recursive
713 /// changes in the dag.
715 /// These functions only replace all existing uses. It's possible that as
716 /// these replacements are being performed, CSE may cause the From node
717 /// to be given new uses. These new uses of From are left in place, and
718 /// not automatically transfered to To.
720 void ReplaceAllUsesWith(SDValue From, SDValue Op,
721 DAGUpdateListener *UpdateListener = 0);
722 void ReplaceAllUsesWith(SDNode *From, SDNode *To,
723 DAGUpdateListener *UpdateListener = 0);
724 void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
725 DAGUpdateListener *UpdateListener = 0);
727 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
728 /// uses of other values produced by From.Val alone.
729 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
730 DAGUpdateListener *UpdateListener = 0);
732 /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
733 /// for multiple values at once. This correctly handles the case where
734 /// there is an overlap between the From values and the To values.
735 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
737 DAGUpdateListener *UpdateListener = 0);
739 /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
740 /// assign a unique node id for each node in the DAG based on their
741 /// topological order. Returns the number of nodes.
742 unsigned AssignTopologicalOrder();
744 /// RepositionNode - Move node N in the AllNodes list to be immediately
745 /// before the given iterator Position. This may be used to update the
746 /// topological ordering when the list of nodes is modified.
747 void RepositionNode(allnodes_iterator Position, SDNode *N) {
748 AllNodes.insert(Position, AllNodes.remove(N));
751 /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
753 static bool isCommutativeBinOp(unsigned Opcode) {
754 // FIXME: This should get its info from the td file, so that we can include
769 case ISD::ADDE: return true;
770 default: return false;
776 /// CreateStackTemporary - Create a stack temporary, suitable for holding the
777 /// specified value type. If minAlign is specified, the slot size will have
778 /// at least that alignment.
779 SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
781 /// CreateStackTemporary - Create a stack temporary suitable for holding
782 /// either of the specified value types.
783 SDValue CreateStackTemporary(MVT VT1, MVT VT2);
785 /// FoldConstantArithmetic -
786 SDValue FoldConstantArithmetic(unsigned Opcode,
788 ConstantSDNode *Cst1,
789 ConstantSDNode *Cst2);
791 /// FoldSetCC - Constant fold a setcc to true or false.
792 SDValue FoldSetCC(MVT VT, SDValue N1,
793 SDValue N2, ISD::CondCode Cond, DebugLoc dl);
795 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
796 /// use this predicate to simplify operations downstream.
797 bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
799 /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We
800 /// use this predicate to simplify operations downstream. Op and Mask are
801 /// known to be the same type.
802 bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
805 /// ComputeMaskedBits - Determine which of the bits specified in Mask are
806 /// known to be either zero or one and return them in the KnownZero/KnownOne
807 /// bitsets. This code only analyzes bits in Mask, in order to short-circuit
808 /// processing. Targets can implement the computeMaskedBitsForTargetNode
809 /// method in the TargetLowering class to allow target nodes to be understood.
810 void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
811 APInt &KnownOne, unsigned Depth = 0) const;
813 /// ComputeNumSignBits - Return the number of times the sign bit of the
814 /// register is replicated into the other bits. We know that at least 1 bit
815 /// is always equal to the sign bit (itself), but other cases can give us
816 /// information. For example, immediately after an "SRA X, 2", we know that
817 /// the top 3 bits are all equal to each other, so we return 3. Targets can
818 /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
819 /// class to allow target nodes to be understood.
820 unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
822 /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
823 /// been verified as a debug information descriptor.
824 bool isVerifiedDebugInfoDesc(SDValue Op) const;
826 /// getShuffleScalarElt - Returns the scalar element that will make up the ith
827 /// element of the result of the vector shuffle.
828 SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
831 bool RemoveNodeFromCSEMaps(SDNode *N);
832 void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
833 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
834 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
836 SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
839 void DeleteNodeNotInCSEMaps(SDNode *N);
840 void DeallocateNode(SDNode *N);
842 unsigned getMVTAlignment(MVT MemoryVT) const;
844 void allnodes_clear();
846 /// VTList - List of non-single value types.
847 std::vector<SDVTList> VTList;
849 /// CondCodeNodes - Maps to auto-CSE operations.
850 std::vector<CondCodeSDNode*> CondCodeNodes;
852 std::vector<SDNode*> ValueTypeNodes;
853 std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
854 StringMap<SDNode*> ExternalSymbols;
855 StringMap<SDNode*> TargetExternalSymbols;
858 template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
859 typedef SelectionDAG::allnodes_iterator nodes_iterator;
860 static nodes_iterator nodes_begin(SelectionDAG *G) {
861 return G->allnodes_begin();
863 static nodes_iterator nodes_end(SelectionDAG *G) {
864 return G->allnodes_end();
868 } // end namespace llvm