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 ilist_node<SDNode> Sentinel;
44 SDNode *createSentinel() const {
45 return static_cast<SDNode*>(&Sentinel);
47 static void destroySentinel(SDNode *) {}
49 SDNode *provideInitialHead() const { return createSentinel(); }
50 SDNode *ensureHead(SDNode*) const { return createSentinel(); }
51 static void noteHead(SDNode*, SDNode*) {}
53 static void deleteNode(SDNode *) {
54 assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!");
57 static void createNode(const SDNode &);
61 Unrestricted, // Combine may create illegal operations and illegal types.
62 NoIllegalTypes, // Combine may create illegal operations but no illegal types.
63 NoIllegalOperations // Combine may only create legal operations and types.
66 /// SelectionDAG class - This is used to represent a portion of an LLVM function
67 /// in a low-level Data Dependence DAG representation suitable for instruction
68 /// selection. This DAG is constructed as the first step of instruction
69 /// selection in order to allow implementation of machine specific optimizations
70 /// and code simplifications.
72 /// The representation used by the SelectionDAG is a target-independent
73 /// representation, which has some similarities to the GCC RTL representation,
74 /// but is significantly more simple, powerful, and is a graph form instead of a
80 FunctionLoweringInfo &FLI;
81 MachineModuleInfo *MMI;
84 /// EntryNode - The starting token.
87 /// Root - The root of the entire DAG.
90 /// AllNodes - A linked list of nodes in the current DAG.
91 ilist<SDNode> AllNodes;
93 /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
94 /// pool allocation with recycling.
95 typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
96 AlignOf<MostAlignedSDNode>::Alignment>
99 /// NodeAllocator - Pool allocation for nodes.
100 NodeAllocatorType NodeAllocator;
102 /// CSEMap - This structure is used to memoize nodes, automatically performing
103 /// CSE with existing nodes with a duplicate is requested.
104 FoldingSet<SDNode> CSEMap;
106 /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
107 BumpPtrAllocator OperandAllocator;
109 /// Allocator - Pool allocation for misc. objects that are created once per
111 BumpPtrAllocator Allocator;
113 /// VerifyNode - Sanity check the given node. Aborts if it is invalid.
114 void VerifyNode(SDNode *N);
116 /// setGraphColorHelper - Implementation of setSubgraphColor.
117 /// Return whether we had to truncate the search.
119 bool setSubgraphColorHelper(SDNode *N, const char *Color,
120 DenseSet<SDNode *> &visited,
121 int level, bool &printed);
124 SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
127 /// init - Prepare this SelectionDAG to process code in the given
130 void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw);
132 /// clear - Clear state and free memory necessary to make this
133 /// SelectionDAG ready to process a new block.
137 MachineFunction &getMachineFunction() const { return *MF; }
138 const TargetMachine &getTarget() const;
139 TargetLowering &getTargetLoweringInfo() const { return TLI; }
140 FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
141 MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
142 DwarfWriter *getDwarfWriter() const { return DW; }
144 /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
146 void viewGraph(const std::string &Title);
150 std::map<const SDNode *, std::string> NodeGraphAttrs;
153 /// clearGraphAttrs - Clear all previously defined node graph attributes.
154 /// Intended to be used from a debugging tool (eg. gdb).
155 void clearGraphAttrs();
157 /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
159 void setGraphAttrs(const SDNode *N, const char *Attrs);
161 /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
162 /// Used from getNodeAttributes.
163 const std::string getGraphAttrs(const SDNode *N) const;
165 /// setGraphColor - Convenience for setting node color attribute.
167 void setGraphColor(const SDNode *N, const char *Color);
169 /// setGraphColor - Convenience for setting subgraph color attribute.
171 void setSubgraphColor(SDNode *N, const char *Color);
173 typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
174 allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
175 allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
176 typedef ilist<SDNode>::iterator allnodes_iterator;
177 allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
178 allnodes_iterator allnodes_end() { return AllNodes.end(); }
179 ilist<SDNode>::size_type allnodes_size() const {
180 return AllNodes.size();
183 /// getRoot - Return the root tag of the SelectionDAG.
185 const SDValue &getRoot() const { return Root; }
187 /// getEntryNode - Return the token chain corresponding to the entry of the
189 SDValue getEntryNode() const {
190 return SDValue(const_cast<SDNode *>(&EntryNode), 0);
193 /// setRoot - Set the current root tag of the SelectionDAG.
195 const SDValue &setRoot(SDValue N) {
196 assert((!N.getNode() || N.getValueType() == MVT::Other) &&
197 "DAG root value is not a chain!");
201 /// Combine - This iterates over the nodes in the SelectionDAG, folding
202 /// certain types of nodes together, or eliminating superfluous nodes. The
203 /// Level argument controls whether Combine is allowed to produce nodes and
204 /// types that are illegal on the target.
205 void Combine(CombineLevel Level, AliasAnalysis &AA, unsigned OptLevel);
207 /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
208 /// only uses types natively supported by the target. Returns "true" if it
209 /// made any changes.
211 /// Note that this is an involved process that may invalidate pointers into
213 bool LegalizeTypes();
215 /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
216 /// compatible with the target instruction selector, as indicated by the
217 /// TargetLowering object.
219 /// Note that this is an involved process that may invalidate pointers into
221 void Legalize(bool TypesNeedLegalizing, unsigned OptLevel);
223 /// RemoveDeadNodes - This method deletes all unreachable nodes in the
225 void RemoveDeadNodes();
227 /// DeleteNode - Remove the specified node from the system. This node must
228 /// have no referrers.
229 void DeleteNode(SDNode *N);
231 /// getVTList - Return an SDVTList that represents the list of values
233 SDVTList getVTList(MVT VT);
234 SDVTList getVTList(MVT VT1, MVT VT2);
235 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
236 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3, MVT VT4);
237 SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
239 //===--------------------------------------------------------------------===//
240 // Node creation methods.
242 SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
243 SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
244 SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false);
245 SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
246 SDValue getTargetConstant(uint64_t Val, MVT VT) {
247 return getConstant(Val, VT, true);
249 SDValue getTargetConstant(const APInt &Val, MVT VT) {
250 return getConstant(Val, VT, true);
252 SDValue getTargetConstant(const ConstantInt &Val, MVT VT) {
253 return getConstant(Val, VT, true);
255 SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
256 SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
257 SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false);
258 SDValue getTargetConstantFP(double Val, MVT VT) {
259 return getConstantFP(Val, VT, true);
261 SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
262 return getConstantFP(Val, VT, true);
264 SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) {
265 return getConstantFP(Val, VT, true);
267 SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
268 int64_t offset = 0, bool isTargetGA = false);
269 SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
270 int64_t offset = 0) {
271 return getGlobalAddress(GV, VT, offset, true);
273 SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false);
274 SDValue getTargetFrameIndex(int FI, MVT VT) {
275 return getFrameIndex(FI, VT, true);
277 SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false);
278 SDValue getTargetJumpTable(int JTI, MVT VT) {
279 return getJumpTable(JTI, VT, true);
281 SDValue getConstantPool(Constant *C, MVT VT,
282 unsigned Align = 0, int Offs = 0, bool isT=false);
283 SDValue getTargetConstantPool(Constant *C, MVT VT,
284 unsigned Align = 0, int Offset = 0) {
285 return getConstantPool(C, VT, Align, Offset, true);
287 SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
288 unsigned Align = 0, int Offs = 0, bool isT=false);
289 SDValue getTargetConstantPool(MachineConstantPoolValue *C,
290 MVT VT, unsigned Align = 0,
292 return getConstantPool(C, VT, Align, Offset, true);
294 // When generating a branch to a BB, we don't in general know enough
295 // to provide debug info for the BB at that time, so keep this one around.
296 SDValue getBasicBlock(MachineBasicBlock *MBB);
297 SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
298 SDValue getExternalSymbol(const char *Sym, MVT VT);
299 SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
300 SDValue getTargetExternalSymbol(const char *Sym, MVT VT);
301 SDValue getTargetExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
302 SDValue getArgFlags(ISD::ArgFlagsTy Flags);
303 SDValue getValueType(MVT);
304 SDValue getRegister(unsigned Reg, MVT VT);
305 SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
307 SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
310 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
311 return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
312 getRegister(Reg, N.getValueType()), N);
315 // This version of the getCopyToReg method takes an extra operand, which
316 // indicates that there is potentially an incoming flag value (if Flag is not
317 // null) and that there should be a flag result.
318 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
320 SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
321 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
322 return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
325 // Similar to last getCopyToReg() except parameter Reg is a SDValue
326 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
328 SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
329 SDValue Ops[] = { Chain, Reg, N, Flag };
330 return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
333 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT) {
334 SDVTList VTs = getVTList(VT, MVT::Other);
335 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
336 return getNode(ISD::CopyFromReg, dl, VTs, Ops, 2);
339 // This version of the getCopyFromReg method takes an extra operand, which
340 // indicates that there is potentially an incoming flag value (if Flag is not
341 // null) and that there should be a flag result.
342 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT,
344 SDVTList VTs = getVTList(VT, MVT::Other, MVT::Flag);
345 SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
346 return getNode(ISD::CopyFromReg, dl, VTs, Ops, Flag.getNode() ? 3 : 2);
349 SDValue getCondCode(ISD::CondCode Cond);
351 /// Returns the ConvertRndSat Note: Avoid using this node because it may
352 /// disappear in the future and most targets don't support it.
353 SDValue getConvertRndSat(MVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
355 SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
357 /// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node. The number of
358 /// elements in VT, which must be a vector type, must match the number of
359 /// mask elements NumElts. A negative integer mask element is treated as
361 SDValue getVectorShuffle(MVT VT, DebugLoc dl, SDValue N1, SDValue N2,
362 const int *MaskElts);
364 /// getZeroExtendInReg - Return the expression required to zero extend the Op
365 /// value assuming it was the smaller SrcTy value.
366 SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy);
368 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
369 SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
371 /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
372 /// a flag result (to ensure it's not CSE'd). CALLSEQ_START does not have a
374 SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
375 SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
376 SDValue Ops[] = { Chain, Op };
377 return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(),
381 /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
382 /// flag result (to ensure it's not CSE'd). CALLSEQ_END does not have
383 /// a useful DebugLoc.
384 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
386 SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
387 SmallVector<SDValue, 4> Ops;
388 Ops.push_back(Chain);
391 Ops.push_back(InFlag);
392 return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys,
394 (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
397 /// getUNDEF - Return an UNDEF node. UNDEF does not have a useful DebugLoc.
398 SDValue getUNDEF(MVT VT) {
399 return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT);
402 /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node. This does
403 /// not have a useful DebugLoc.
404 SDValue getGLOBAL_OFFSET_TABLE(MVT VT) {
405 return getNode(ISD::GLOBAL_OFFSET_TABLE, DebugLoc::getUnknownLoc(), VT);
408 /// getNode - Gets or creates the specified node.
410 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
411 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
412 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
413 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
414 SDValue N1, SDValue N2, SDValue N3);
415 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
416 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
417 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
418 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
420 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
421 const SDUse *Ops, unsigned NumOps);
422 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
423 const SDValue *Ops, unsigned NumOps);
424 SDValue getNode(unsigned Opcode, DebugLoc DL,
425 const std::vector<MVT> &ResultTys,
426 const SDValue *Ops, unsigned NumOps);
427 SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
428 const SDValue *Ops, unsigned NumOps);
429 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
430 const SDValue *Ops, unsigned NumOps);
431 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
432 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
433 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
434 SDValue N1, SDValue N2);
435 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
436 SDValue N1, SDValue N2, SDValue N3);
437 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
438 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
439 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
440 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
443 SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
444 SDValue Size, unsigned Align, bool AlwaysInline,
445 const Value *DstSV, uint64_t DstSVOff,
446 const Value *SrcSV, uint64_t SrcSVOff);
448 SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
449 SDValue Size, unsigned Align,
450 const Value *DstSV, uint64_t DstOSVff,
451 const Value *SrcSV, uint64_t SrcSVOff);
453 SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
454 SDValue Size, unsigned Align,
455 const Value *DstSV, uint64_t DstSVOff);
457 /// getSetCC - Helper function to make it easier to build SetCC's if you just
458 /// have an ISD::CondCode instead of an SDValue.
460 SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
461 ISD::CondCode Cond) {
462 return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
465 /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
466 /// if you just have an ISD::CondCode instead of an SDValue.
468 SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
469 ISD::CondCode Cond) {
470 return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
473 /// getSelectCC - Helper function to make it easier to build SelectCC's if you
474 /// just have an ISD::CondCode instead of an SDValue.
476 SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
477 SDValue True, SDValue False, ISD::CondCode Cond) {
478 return getNode(ISD::SELECT_CC, DL, True.getValueType(),
479 LHS, RHS, True, False, getCondCode(Cond));
482 /// getVAArg - VAArg produces a result and token chain, and takes a pointer
483 /// and a source value as input.
484 SDValue getVAArg(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
487 /// getAtomic - Gets a node for an atomic op, produces result and chain and
489 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
490 SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
491 unsigned Alignment=0);
493 /// getAtomic - Gets a node for an atomic op, produces result and chain and
494 /// takes 2 operands.
495 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
496 SDValue Ptr, SDValue Val, const Value* PtrVal,
497 unsigned Alignment = 0);
499 /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
500 /// result and takes a list of operands.
501 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
502 const MVT *VTs, unsigned NumVTs,
503 const SDValue *Ops, unsigned NumOps,
504 MVT MemVT, const Value *srcValue, int SVOff,
505 unsigned Align = 0, bool Vol = false,
506 bool ReadMem = true, bool WriteMem = true);
508 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
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 /// getMergeValues - Create a MERGE_VALUES node from the given operands.
515 SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
517 /// getCall - Create a CALL node from the given information.
519 SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
520 bool IsTailCall, bool isInreg, SDVTList VTs,
521 const SDValue *Operands, unsigned NumOperands);
523 /// getLoad - Loads are not normal binary operators: their result type is not
524 /// determined by their operands, and they produce a value AND a token chain.
526 SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
527 const Value *SV, int SVOffset, bool isVolatile=false,
528 unsigned Alignment=0);
529 SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
530 SDValue Chain, SDValue Ptr, const Value *SV,
531 int SVOffset, MVT EVT, bool isVolatile=false,
532 unsigned Alignment=0);
533 SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
534 SDValue Offset, ISD::MemIndexedMode AM);
535 SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
536 MVT VT, SDValue Chain,
537 SDValue Ptr, SDValue Offset,
538 const Value *SV, int SVOffset, MVT EVT,
539 bool isVolatile=false, unsigned Alignment=0);
541 /// getStore - Helper function to build ISD::STORE nodes.
543 SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
544 const Value *SV, int SVOffset, bool isVolatile=false,
545 unsigned Alignment=0);
546 SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
547 const Value *SV, int SVOffset, MVT TVT,
548 bool isVolatile=false, unsigned Alignment=0);
549 SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
550 SDValue Offset, ISD::MemIndexedMode AM);
552 /// getSrcValue - Construct a node to track a Value* through the backend.
553 SDValue getSrcValue(const Value *v);
555 /// getMemOperand - Construct a node to track a memory reference
556 /// through the backend.
557 SDValue getMemOperand(const MachineMemOperand &MO);
559 /// getShiftAmountOperand - Return the specified value casted to
560 /// the target's desired shift amount type.
561 SDValue getShiftAmountOperand(SDValue Op);
563 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
564 /// specified operands. If the resultant node already exists in the DAG,
565 /// this does not modify the specified node, instead it returns the node that
566 /// already exists. If the resultant node does not exist in the DAG, the
567 /// input node is returned. As a degenerate case, if you specify the same
568 /// input operands as the node already has, the input node is returned.
569 SDValue UpdateNodeOperands(SDValue N, SDValue Op);
570 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
571 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
573 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
574 SDValue Op3, SDValue Op4);
575 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
576 SDValue Op3, SDValue Op4, SDValue Op5);
577 SDValue UpdateNodeOperands(SDValue N,
578 const SDValue *Ops, unsigned NumOps);
580 /// SelectNodeTo - These are used for target selectors to *mutate* the
581 /// specified node to have the specified return type, Target opcode, and
582 /// operands. Note that target opcodes are stored as
583 /// ~TargetOpcode in the node opcode field. The resultant node is returned.
584 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
585 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
586 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
587 SDValue Op1, SDValue Op2);
588 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
589 SDValue Op1, SDValue Op2, SDValue Op3);
590 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
591 const SDValue *Ops, unsigned NumOps);
592 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
593 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
594 MVT VT2, const SDValue *Ops, unsigned NumOps);
595 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
596 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
597 SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
598 MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
600 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
601 MVT VT2, SDValue Op1);
602 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
603 MVT VT2, SDValue Op1, SDValue Op2);
604 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
605 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
606 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
607 MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
608 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
609 const SDValue *Ops, unsigned NumOps);
611 /// MorphNodeTo - These *mutate* the specified node to have the specified
612 /// return type, opcode, and operands.
613 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
614 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
615 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
616 SDValue Op1, SDValue Op2);
617 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
618 SDValue Op1, SDValue Op2, SDValue Op3);
619 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
620 const SDValue *Ops, unsigned NumOps);
621 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
622 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
623 MVT VT2, const SDValue *Ops, unsigned NumOps);
624 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
625 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
626 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
627 MVT VT2, SDValue Op1);
628 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
629 MVT VT2, SDValue Op1, SDValue Op2);
630 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
631 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
632 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
633 const SDValue *Ops, unsigned NumOps);
635 /// getTargetNode - These are used for target selectors to create a new node
636 /// with specified return type(s), target opcode, and operands.
638 /// Note that getTargetNode returns the resultant node. If there is already a
639 /// node of the specified opcode and operands, it returns that node instead of
641 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
642 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
643 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
645 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
646 SDValue Op1, SDValue Op2, SDValue Op3);
647 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
648 const SDValue *Ops, unsigned NumOps);
649 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
650 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
652 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
653 MVT VT2, SDValue Op1, SDValue Op2);
654 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
655 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
656 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
657 const SDValue *Ops, unsigned NumOps);
658 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
659 SDValue Op1, SDValue Op2);
660 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
661 SDValue Op1, SDValue Op2, SDValue Op3);
662 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
663 const SDValue *Ops, unsigned NumOps);
664 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
665 MVT VT4, const SDValue *Ops, unsigned NumOps);
666 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
667 const std::vector<MVT> &ResultTys, const SDValue *Ops,
670 /// getNodeIfExists - Get the specified node if it's already available, or
671 /// else return NULL.
672 SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
673 const SDValue *Ops, unsigned NumOps);
675 /// DAGUpdateListener - Clients of various APIs that cause global effects on
676 /// the DAG can optionally implement this interface. This allows the clients
677 /// to handle the various sorts of updates that happen.
678 class DAGUpdateListener {
680 virtual ~DAGUpdateListener();
682 /// NodeDeleted - The node N that was deleted and, if E is not null, an
683 /// equivalent node E that replaced it.
684 virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
686 /// NodeUpdated - The node N that was updated.
687 virtual void NodeUpdated(SDNode *N) = 0;
690 /// RemoveDeadNode - Remove the specified node from the system. If any of its
691 /// operands then becomes dead, remove them as well. Inform UpdateListener
692 /// for each node deleted.
693 void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
695 /// RemoveDeadNodes - This method deletes the unreachable nodes in the
696 /// given list, and any nodes that become unreachable as a result.
697 void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
698 DAGUpdateListener *UpdateListener = 0);
700 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
701 /// This can cause recursive merging of nodes in the DAG. Use the first
702 /// version if 'From' is known to have a single result, use the second
703 /// if you have two nodes with identical results (or if 'To' has a superset
704 /// of the results of 'From'), use the third otherwise.
706 /// These methods all take an optional UpdateListener, which (if not null) is
707 /// informed about nodes that are deleted and modified due to recursive
708 /// changes in the dag.
710 /// These functions only replace all existing uses. It's possible that as
711 /// these replacements are being performed, CSE may cause the From node
712 /// to be given new uses. These new uses of From are left in place, and
713 /// not automatically transfered to To.
715 void ReplaceAllUsesWith(SDValue From, SDValue Op,
716 DAGUpdateListener *UpdateListener = 0);
717 void ReplaceAllUsesWith(SDNode *From, SDNode *To,
718 DAGUpdateListener *UpdateListener = 0);
719 void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
720 DAGUpdateListener *UpdateListener = 0);
722 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
723 /// uses of other values produced by From.Val alone.
724 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
725 DAGUpdateListener *UpdateListener = 0);
727 /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
728 /// for multiple values at once. This correctly handles the case where
729 /// there is an overlap between the From values and the To values.
730 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
732 DAGUpdateListener *UpdateListener = 0);
734 /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
735 /// assign a unique node id for each node in the DAG based on their
736 /// topological order. Returns the number of nodes.
737 unsigned AssignTopologicalOrder();
739 /// RepositionNode - Move node N in the AllNodes list to be immediately
740 /// before the given iterator Position. This may be used to update the
741 /// topological ordering when the list of nodes is modified.
742 void RepositionNode(allnodes_iterator Position, SDNode *N) {
743 AllNodes.insert(Position, AllNodes.remove(N));
746 /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
748 static bool isCommutativeBinOp(unsigned Opcode) {
749 // FIXME: This should get its info from the td file, so that we can include
766 case ISD::ADDE: return true;
767 default: return false;
773 /// CreateStackTemporary - Create a stack temporary, suitable for holding the
774 /// specified value type. If minAlign is specified, the slot size will have
775 /// at least that alignment.
776 SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
778 /// CreateStackTemporary - Create a stack temporary suitable for holding
779 /// either of the specified value types.
780 SDValue CreateStackTemporary(MVT VT1, MVT VT2);
782 /// FoldConstantArithmetic -
783 SDValue FoldConstantArithmetic(unsigned Opcode,
785 ConstantSDNode *Cst1,
786 ConstantSDNode *Cst2);
788 /// FoldSetCC - Constant fold a setcc to true or false.
789 SDValue FoldSetCC(MVT VT, SDValue N1,
790 SDValue N2, ISD::CondCode Cond, DebugLoc dl);
792 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
793 /// use this predicate to simplify operations downstream.
794 bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
796 /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We
797 /// use this predicate to simplify operations downstream. Op and Mask are
798 /// known to be the same type.
799 bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
802 /// ComputeMaskedBits - Determine which of the bits specified in Mask are
803 /// known to be either zero or one and return them in the KnownZero/KnownOne
804 /// bitsets. This code only analyzes bits in Mask, in order to short-circuit
805 /// processing. Targets can implement the computeMaskedBitsForTargetNode
806 /// method in the TargetLowering class to allow target nodes to be understood.
807 void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
808 APInt &KnownOne, unsigned Depth = 0) const;
810 /// ComputeNumSignBits - Return the number of times the sign bit of the
811 /// register is replicated into the other bits. We know that at least 1 bit
812 /// is always equal to the sign bit (itself), but other cases can give us
813 /// information. For example, immediately after an "SRA X, 2", we know that
814 /// the top 3 bits are all equal to each other, so we return 3. Targets can
815 /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
816 /// class to allow target nodes to be understood.
817 unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
819 /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
820 /// been verified as a debug information descriptor.
821 bool isVerifiedDebugInfoDesc(SDValue Op) const;
823 /// getShuffleScalarElt - Returns the scalar element that will make up the ith
824 /// element of the result of the vector shuffle.
825 SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
828 bool RemoveNodeFromCSEMaps(SDNode *N);
829 void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
830 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
831 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
833 SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
836 void DeleteNodeNotInCSEMaps(SDNode *N);
837 void DeallocateNode(SDNode *N);
839 unsigned getMVTAlignment(MVT MemoryVT) const;
841 void allnodes_clear();
843 /// VTList - List of non-single value types.
844 std::vector<SDVTList> VTList;
846 /// CondCodeNodes - Maps to auto-CSE operations.
847 std::vector<CondCodeSDNode*> CondCodeNodes;
849 std::vector<SDNode*> ValueTypeNodes;
850 std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
851 StringMap<SDNode*> ExternalSymbols;
852 StringMap<SDNode*> TargetExternalSymbols;
855 template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
856 typedef SelectionDAG::allnodes_iterator nodes_iterator;
857 static nodes_iterator nodes_begin(SelectionDAG *G) {
858 return G->allnodes_begin();
860 static nodes_iterator nodes_end(SelectionDAG *G) {
861 return G->allnodes_end();
865 } // end namespace llvm