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/StringMap.h"
21 #include "llvm/CodeGen/SelectionDAGNodes.h"
22 #include "llvm/Target/TargetMachine.h"
32 class MachineModuleInfo;
34 class MachineFunction;
35 class MachineConstantPoolValue;
36 class FunctionLoweringInfo;
38 template<> struct ilist_traits<SDNode> : public ilist_default_traits<SDNode> {
40 mutable ilist_node<SDNode> Sentinel;
42 SDNode *createSentinel() const {
43 return static_cast<SDNode*>(&Sentinel);
45 static void destroySentinel(SDNode *) {}
47 SDNode *provideInitialHead() const { return createSentinel(); }
48 SDNode *ensureHead(SDNode*) const { return createSentinel(); }
49 static void noteHead(SDNode*, 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;
83 /// EntryNode - The starting token.
86 /// Root - The root of the entire DAG.
89 /// AllNodes - A linked list of nodes in the current DAG.
90 ilist<SDNode> AllNodes;
92 /// NodeAllocatorType - The AllocatorType for allocating SDNodes. We use
93 /// pool allocation with recycling.
94 typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
95 AlignOf<MostAlignedSDNode>::Alignment>
98 /// NodeAllocator - Pool allocation for nodes.
99 NodeAllocatorType NodeAllocator;
101 /// CSEMap - This structure is used to memoize nodes, automatically performing
102 /// CSE with existing nodes with a duplicate is requested.
103 FoldingSet<SDNode> CSEMap;
105 /// OperandAllocator - Pool allocation for machine-opcode SDNode operands.
106 BumpPtrAllocator OperandAllocator;
108 /// Allocator - Pool allocation for misc. objects that are created once per
110 BumpPtrAllocator Allocator;
112 /// VerifyNode - Sanity check the given node. Aborts if it is invalid.
113 void VerifyNode(SDNode *N);
115 /// setGraphColorHelper - Implementation of setSubgraphColor.
116 /// Return whether we had to truncate the search.
118 bool setSubgraphColorHelper(SDNode *N, const char *Color,
119 DenseSet<SDNode *> &visited,
120 int level, bool &printed);
123 SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
126 /// init - Prepare this SelectionDAG to process code in the given
129 void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw);
131 /// clear - Clear state and free memory necessary to make this
132 /// SelectionDAG ready to process a new block.
136 MachineFunction &getMachineFunction() const { return *MF; }
137 const TargetMachine &getTarget() const;
138 TargetLowering &getTargetLoweringInfo() const { return TLI; }
139 FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
140 MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
141 DwarfWriter *getDwarfWriter() const { return DW; }
142 LLVMContext *getContext() const {return Context; }
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,
206 CodeGenOpt::Level OptLevel);
208 /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
209 /// only uses types natively supported by the target. Returns "true" if it
210 /// made any changes.
212 /// Note that this is an involved process that may invalidate pointers into
214 bool LegalizeTypes();
216 /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
217 /// compatible with the target instruction selector, as indicated by the
218 /// TargetLowering object.
220 /// Note that this is an involved process that may invalidate pointers into
222 void Legalize(bool TypesNeedLegalizing, CodeGenOpt::Level OptLevel);
224 /// LegalizeVectors - This transforms the SelectionDAG into a SelectionDAG
225 /// that only uses vector math operations supported by the target. This is
226 /// necessary as a separate step from Legalize because unrolling a vector
227 /// operation can introduce illegal types, which requires running
228 /// LegalizeTypes again.
230 /// This returns true if it made any changes; in that case, LegalizeTypes
231 /// is called again before Legalize.
233 /// Note that this is an involved process that may invalidate pointers into
235 bool LegalizeVectors();
237 /// RemoveDeadNodes - This method deletes all unreachable nodes in the
239 void RemoveDeadNodes();
241 /// DeleteNode - Remove the specified node from the system. This node must
242 /// have no referrers.
243 void DeleteNode(SDNode *N);
245 /// getVTList - Return an SDVTList that represents the list of values
247 SDVTList getVTList(MVT VT);
248 SDVTList getVTList(MVT VT1, MVT VT2);
249 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
250 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3, MVT VT4);
251 SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
253 //===--------------------------------------------------------------------===//
254 // Node creation methods.
256 SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
257 SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
258 SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false);
259 SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
260 SDValue getTargetConstant(uint64_t Val, MVT VT) {
261 return getConstant(Val, VT, true);
263 SDValue getTargetConstant(const APInt &Val, MVT VT) {
264 return getConstant(Val, VT, true);
266 SDValue getTargetConstant(const ConstantInt &Val, MVT VT) {
267 return getConstant(Val, VT, true);
269 SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
270 SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
271 SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false);
272 SDValue getTargetConstantFP(double Val, MVT VT) {
273 return getConstantFP(Val, VT, true);
275 SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
276 return getConstantFP(Val, VT, true);
278 SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) {
279 return getConstantFP(Val, VT, true);
281 SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
282 int64_t offset = 0, bool isTargetGA = false,
283 unsigned char TargetFlags = 0);
284 SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
286 unsigned char TargetFlags = 0) {
287 return getGlobalAddress(GV, VT, offset, true, TargetFlags);
289 SDValue getFrameIndex(int FI, MVT VT, bool isTarget = false);
290 SDValue getTargetFrameIndex(int FI, MVT VT) {
291 return getFrameIndex(FI, VT, true);
293 SDValue getJumpTable(int JTI, MVT VT, bool isTarget = false,
294 unsigned char TargetFlags = 0);
295 SDValue getTargetJumpTable(int JTI, MVT VT, unsigned char TargetFlags = 0) {
296 return getJumpTable(JTI, VT, true, TargetFlags);
298 SDValue getConstantPool(Constant *C, MVT VT,
299 unsigned Align = 0, int Offs = 0, bool isT=false,
300 unsigned char TargetFlags = 0);
301 SDValue getTargetConstantPool(Constant *C, MVT VT,
302 unsigned Align = 0, int Offset = 0,
303 unsigned char TargetFlags = 0) {
304 return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
306 SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
307 unsigned Align = 0, int Offs = 0, bool isT=false,
308 unsigned char TargetFlags = 0);
309 SDValue getTargetConstantPool(MachineConstantPoolValue *C,
310 MVT VT, unsigned Align = 0,
311 int Offset = 0, unsigned char TargetFlags=0) {
312 return getConstantPool(C, VT, Align, Offset, true, TargetFlags);
314 // When generating a branch to a BB, we don't in general know enough
315 // to provide debug info for the BB at that time, so keep this one around.
316 SDValue getBasicBlock(MachineBasicBlock *MBB);
317 SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
318 SDValue getExternalSymbol(const char *Sym, MVT VT);
319 SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
320 SDValue getTargetExternalSymbol(const char *Sym, MVT VT,
321 unsigned char TargetFlags = 0);
322 SDValue getArgFlags(ISD::ArgFlagsTy Flags);
323 SDValue getValueType(MVT);
324 SDValue getRegister(unsigned Reg, MVT VT);
325 SDValue getDbgStopPoint(DebugLoc DL, SDValue Root,
326 unsigned Line, unsigned Col, Value *CU);
327 SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
330 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
331 return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
332 getRegister(Reg, N.getValueType()), N);
335 // This version of the getCopyToReg method takes an extra operand, which
336 // indicates that there is potentially an incoming flag value (if Flag is not
337 // null) and that there should be a flag result.
338 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
340 SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
341 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
342 return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
345 // Similar to last getCopyToReg() except parameter Reg is a SDValue
346 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
348 SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
349 SDValue Ops[] = { Chain, Reg, N, Flag };
350 return getNode(ISD::CopyToReg, dl, VTs, Ops, Flag.getNode() ? 4 : 3);
353 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT) {
354 SDVTList VTs = getVTList(VT, MVT::Other);
355 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
356 return getNode(ISD::CopyFromReg, dl, VTs, Ops, 2);
359 // This version of the getCopyFromReg method takes an extra operand, which
360 // indicates that there is potentially an incoming flag value (if Flag is not
361 // null) and that there should be a flag result.
362 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT,
364 SDVTList VTs = getVTList(VT, MVT::Other, MVT::Flag);
365 SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
366 return getNode(ISD::CopyFromReg, dl, VTs, Ops, Flag.getNode() ? 3 : 2);
369 SDValue getCondCode(ISD::CondCode Cond);
371 /// Returns the ConvertRndSat Note: Avoid using this node because it may
372 /// disappear in the future and most targets don't support it.
373 SDValue getConvertRndSat(MVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
375 SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
377 /// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node. The number of
378 /// elements in VT, which must be a vector type, must match the number of
379 /// mask elements NumElts. A integer mask element equal to -1 is treated as
381 SDValue getVectorShuffle(MVT VT, DebugLoc dl, SDValue N1, SDValue N2,
382 const int *MaskElts);
384 /// getZeroExtendInReg - Return the expression required to zero extend the Op
385 /// value assuming it was the smaller SrcTy value.
386 SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy);
388 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
389 SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
391 /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
392 /// a flag result (to ensure it's not CSE'd). CALLSEQ_START does not have a
394 SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
395 SDVTList VTs = getVTList(MVT::Other, MVT::Flag);
396 SDValue Ops[] = { Chain, Op };
397 return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(),
401 /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
402 /// flag result (to ensure it's not CSE'd). CALLSEQ_END does not have
403 /// a useful DebugLoc.
404 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
406 SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
407 SmallVector<SDValue, 4> Ops;
408 Ops.push_back(Chain);
411 Ops.push_back(InFlag);
412 return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys,
414 (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
417 /// getUNDEF - Return an UNDEF node. UNDEF does not have a useful DebugLoc.
418 SDValue getUNDEF(MVT VT) {
419 return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT);
422 /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node. This does
423 /// not have a useful DebugLoc.
424 SDValue getGLOBAL_OFFSET_TABLE(MVT VT) {
425 return getNode(ISD::GLOBAL_OFFSET_TABLE, DebugLoc::getUnknownLoc(), VT);
428 /// getNode - Gets or creates the specified node.
430 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
431 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
432 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
433 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
434 SDValue N1, SDValue N2, SDValue N3);
435 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
436 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
437 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
438 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
440 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
441 const SDUse *Ops, unsigned NumOps);
442 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
443 const SDValue *Ops, unsigned NumOps);
444 SDValue getNode(unsigned Opcode, DebugLoc DL,
445 const std::vector<MVT> &ResultTys,
446 const SDValue *Ops, unsigned NumOps);
447 SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
448 const SDValue *Ops, unsigned NumOps);
449 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
450 const SDValue *Ops, unsigned NumOps);
451 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
452 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
453 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
454 SDValue N1, SDValue N2);
455 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
456 SDValue N1, SDValue N2, SDValue N3);
457 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
458 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
459 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
460 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
463 SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
464 SDValue Size, unsigned Align, bool AlwaysInline,
465 const Value *DstSV, uint64_t DstSVOff,
466 const Value *SrcSV, uint64_t SrcSVOff);
468 SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
469 SDValue Size, unsigned Align,
470 const Value *DstSV, uint64_t DstOSVff,
471 const Value *SrcSV, uint64_t SrcSVOff);
473 SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
474 SDValue Size, unsigned Align,
475 const Value *DstSV, uint64_t DstSVOff);
477 /// getSetCC - Helper function to make it easier to build SetCC's if you just
478 /// have an ISD::CondCode instead of an SDValue.
480 SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
481 ISD::CondCode Cond) {
482 return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
485 /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
486 /// if you just have an ISD::CondCode instead of an SDValue.
488 SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
489 ISD::CondCode Cond) {
490 return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
493 /// getSelectCC - Helper function to make it easier to build SelectCC's if you
494 /// just have an ISD::CondCode instead of an SDValue.
496 SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
497 SDValue True, SDValue False, ISD::CondCode Cond) {
498 return getNode(ISD::SELECT_CC, DL, True.getValueType(),
499 LHS, RHS, True, False, getCondCode(Cond));
502 /// getVAArg - VAArg produces a result and token chain, and takes a pointer
503 /// and a source value as input.
504 SDValue getVAArg(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
507 /// getAtomic - Gets a node for an atomic op, produces result and chain and
509 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
510 SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
511 unsigned Alignment=0);
513 /// getAtomic - Gets a node for an atomic op, produces result and chain and
514 /// takes 2 operands.
515 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
516 SDValue Ptr, SDValue Val, const Value* PtrVal,
517 unsigned Alignment = 0);
519 /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
520 /// result and takes a list of operands.
521 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
522 const MVT *VTs, unsigned NumVTs,
523 const SDValue *Ops, unsigned NumOps,
524 MVT MemVT, const Value *srcValue, int SVOff,
525 unsigned Align = 0, bool Vol = false,
526 bool ReadMem = true, bool WriteMem = true);
528 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
529 const SDValue *Ops, unsigned NumOps,
530 MVT MemVT, const Value *srcValue, int SVOff,
531 unsigned Align = 0, bool Vol = false,
532 bool ReadMem = true, bool WriteMem = true);
534 /// getMergeValues - Create a MERGE_VALUES node from the given operands.
535 SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
537 /// getCall - Create a CALL node from the given information.
539 SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
540 bool IsTailCall, bool isInreg, SDVTList VTs,
541 const SDValue *Operands, unsigned NumOperands,
542 unsigned NumFixedArgs);
544 /// getLoad - Loads are not normal binary operators: their result type is not
545 /// determined by their operands, and they produce a value AND a token chain.
547 SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
548 const Value *SV, int SVOffset, bool isVolatile=false,
549 unsigned Alignment=0);
550 SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
551 SDValue Chain, SDValue Ptr, const Value *SV,
552 int SVOffset, MVT EVT, bool isVolatile=false,
553 unsigned Alignment=0);
554 SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
555 SDValue Offset, ISD::MemIndexedMode AM);
556 SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
557 MVT VT, SDValue Chain,
558 SDValue Ptr, SDValue Offset,
559 const Value *SV, int SVOffset, MVT EVT,
560 bool isVolatile=false, unsigned Alignment=0);
562 /// getStore - Helper function to build ISD::STORE nodes.
564 SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
565 const Value *SV, int SVOffset, bool isVolatile=false,
566 unsigned Alignment=0);
567 SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
568 const Value *SV, int SVOffset, MVT TVT,
569 bool isVolatile=false, unsigned Alignment=0);
570 SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
571 SDValue Offset, ISD::MemIndexedMode AM);
573 /// getSrcValue - Construct a node to track a Value* through the backend.
574 SDValue getSrcValue(const Value *v);
576 /// getMemOperand - Construct a node to track a memory reference
577 /// through the backend.
578 SDValue getMemOperand(const MachineMemOperand &MO);
580 /// getShiftAmountOperand - Return the specified value casted to
581 /// the target's desired shift amount type.
582 SDValue getShiftAmountOperand(SDValue Op);
584 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
585 /// specified operands. If the resultant node already exists in the DAG,
586 /// this does not modify the specified node, instead it returns the node that
587 /// already exists. If the resultant node does not exist in the DAG, the
588 /// input node is returned. As a degenerate case, if you specify the same
589 /// input operands as the node already has, the input node is returned.
590 SDValue UpdateNodeOperands(SDValue N, SDValue Op);
591 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
592 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
594 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
595 SDValue Op3, SDValue Op4);
596 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
597 SDValue Op3, SDValue Op4, SDValue Op5);
598 SDValue UpdateNodeOperands(SDValue N,
599 const SDValue *Ops, unsigned NumOps);
601 /// SelectNodeTo - These are used for target selectors to *mutate* the
602 /// specified node to have the specified return type, Target opcode, and
603 /// operands. Note that target opcodes are stored as
604 /// ~TargetOpcode in the node opcode field. The resultant node is returned.
605 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
606 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
607 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
608 SDValue Op1, SDValue Op2);
609 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
610 SDValue Op1, SDValue Op2, SDValue Op3);
611 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
612 const SDValue *Ops, unsigned NumOps);
613 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
614 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
615 MVT VT2, const SDValue *Ops, unsigned NumOps);
616 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
617 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
618 SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
619 MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
621 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
622 MVT VT2, SDValue Op1);
623 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
624 MVT VT2, SDValue Op1, SDValue Op2);
625 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
626 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
627 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
628 MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
629 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
630 const SDValue *Ops, unsigned NumOps);
632 /// MorphNodeTo - These *mutate* the specified node to have the specified
633 /// return type, opcode, and operands.
634 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
635 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
636 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
637 SDValue Op1, SDValue Op2);
638 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
639 SDValue Op1, SDValue Op2, SDValue Op3);
640 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
641 const SDValue *Ops, unsigned NumOps);
642 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
643 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
644 MVT VT2, const SDValue *Ops, unsigned NumOps);
645 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
646 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
647 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
648 MVT VT2, SDValue Op1);
649 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
650 MVT VT2, SDValue Op1, SDValue Op2);
651 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
652 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
653 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
654 const SDValue *Ops, unsigned NumOps);
656 /// getTargetNode - These are used for target selectors to create a new node
657 /// with specified return type(s), target opcode, and operands.
659 /// Note that getTargetNode returns the resultant node. If there is already a
660 /// node of the specified opcode and operands, it returns that node instead of
662 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
663 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
664 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
666 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
667 SDValue Op1, SDValue Op2, SDValue Op3);
668 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
669 const SDValue *Ops, unsigned NumOps);
670 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
671 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
673 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
674 MVT VT2, SDValue Op1, SDValue Op2);
675 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
676 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
677 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
678 const SDValue *Ops, unsigned NumOps);
679 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
680 SDValue Op1, SDValue Op2);
681 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
682 SDValue Op1, SDValue Op2, SDValue Op3);
683 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
684 const SDValue *Ops, unsigned NumOps);
685 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
686 MVT VT4, const SDValue *Ops, unsigned NumOps);
687 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
688 const std::vector<MVT> &ResultTys, const SDValue *Ops,
691 /// getNodeIfExists - Get the specified node if it's already available, or
692 /// else return NULL.
693 SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
694 const SDValue *Ops, unsigned NumOps);
696 /// DAGUpdateListener - Clients of various APIs that cause global effects on
697 /// the DAG can optionally implement this interface. This allows the clients
698 /// to handle the various sorts of updates that happen.
699 class DAGUpdateListener {
701 virtual ~DAGUpdateListener();
703 /// NodeDeleted - The node N that was deleted and, if E is not null, an
704 /// equivalent node E that replaced it.
705 virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
707 /// NodeUpdated - The node N that was updated.
708 virtual void NodeUpdated(SDNode *N) = 0;
711 /// RemoveDeadNode - Remove the specified node from the system. If any of its
712 /// operands then becomes dead, remove them as well. Inform UpdateListener
713 /// for each node deleted.
714 void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
716 /// RemoveDeadNodes - This method deletes the unreachable nodes in the
717 /// given list, and any nodes that become unreachable as a result.
718 void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
719 DAGUpdateListener *UpdateListener = 0);
721 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
722 /// This can cause recursive merging of nodes in the DAG. Use the first
723 /// version if 'From' is known to have a single result, use the second
724 /// if you have two nodes with identical results (or if 'To' has a superset
725 /// of the results of 'From'), use the third otherwise.
727 /// These methods all take an optional UpdateListener, which (if not null) is
728 /// informed about nodes that are deleted and modified due to recursive
729 /// changes in the dag.
731 /// These functions only replace all existing uses. It's possible that as
732 /// these replacements are being performed, CSE may cause the From node
733 /// to be given new uses. These new uses of From are left in place, and
734 /// not automatically transfered to To.
736 void ReplaceAllUsesWith(SDValue From, SDValue Op,
737 DAGUpdateListener *UpdateListener = 0);
738 void ReplaceAllUsesWith(SDNode *From, SDNode *To,
739 DAGUpdateListener *UpdateListener = 0);
740 void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
741 DAGUpdateListener *UpdateListener = 0);
743 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
744 /// uses of other values produced by From.Val alone.
745 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
746 DAGUpdateListener *UpdateListener = 0);
748 /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
749 /// for multiple values at once. This correctly handles the case where
750 /// there is an overlap between the From values and the To values.
751 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
753 DAGUpdateListener *UpdateListener = 0);
755 /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
756 /// assign a unique node id for each node in the DAG based on their
757 /// topological order. Returns the number of nodes.
758 unsigned AssignTopologicalOrder();
760 /// RepositionNode - Move node N in the AllNodes list to be immediately
761 /// before the given iterator Position. This may be used to update the
762 /// topological ordering when the list of nodes is modified.
763 void RepositionNode(allnodes_iterator Position, SDNode *N) {
764 AllNodes.insert(Position, AllNodes.remove(N));
767 /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
769 static bool isCommutativeBinOp(unsigned Opcode) {
770 // FIXME: This should get its info from the td file, so that we can include
787 case ISD::ADDE: return true;
788 default: return false;
794 /// CreateStackTemporary - Create a stack temporary, suitable for holding the
795 /// specified value type. If minAlign is specified, the slot size will have
796 /// at least that alignment.
797 SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
799 /// CreateStackTemporary - Create a stack temporary suitable for holding
800 /// either of the specified value types.
801 SDValue CreateStackTemporary(MVT VT1, MVT VT2);
803 /// FoldConstantArithmetic -
804 SDValue FoldConstantArithmetic(unsigned Opcode,
806 ConstantSDNode *Cst1,
807 ConstantSDNode *Cst2);
809 /// FoldSetCC - Constant fold a setcc to true or false.
810 SDValue FoldSetCC(MVT VT, SDValue N1,
811 SDValue N2, ISD::CondCode Cond, DebugLoc dl);
813 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
814 /// use this predicate to simplify operations downstream.
815 bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
817 /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We
818 /// use this predicate to simplify operations downstream. Op and Mask are
819 /// known to be the same type.
820 bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
823 /// ComputeMaskedBits - Determine which of the bits specified in Mask are
824 /// known to be either zero or one and return them in the KnownZero/KnownOne
825 /// bitsets. This code only analyzes bits in Mask, in order to short-circuit
826 /// processing. Targets can implement the computeMaskedBitsForTargetNode
827 /// method in the TargetLowering class to allow target nodes to be understood.
828 void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
829 APInt &KnownOne, unsigned Depth = 0) const;
831 /// ComputeNumSignBits - Return the number of times the sign bit of the
832 /// register is replicated into the other bits. We know that at least 1 bit
833 /// is always equal to the sign bit (itself), but other cases can give us
834 /// information. For example, immediately after an "SRA X, 2", we know that
835 /// the top 3 bits are all equal to each other, so we return 3. Targets can
836 /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
837 /// class to allow target nodes to be understood.
838 unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
840 /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
841 /// been verified as a debug information descriptor.
842 bool isVerifiedDebugInfoDesc(SDValue Op) const;
844 /// getShuffleScalarElt - Returns the scalar element that will make up the ith
845 /// element of the result of the vector shuffle.
846 SDValue getShuffleScalarElt(const ShuffleVectorSDNode *N, unsigned Idx);
849 bool RemoveNodeFromCSEMaps(SDNode *N);
850 void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
851 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
852 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
854 SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
857 void DeleteNodeNotInCSEMaps(SDNode *N);
858 void DeallocateNode(SDNode *N);
860 unsigned getMVTAlignment(MVT MemoryVT) const;
862 void allnodes_clear();
864 /// VTList - List of non-single value types.
865 std::vector<SDVTList> VTList;
867 /// CondCodeNodes - Maps to auto-CSE operations.
868 std::vector<CondCodeSDNode*> CondCodeNodes;
870 std::vector<SDNode*> ValueTypeNodes;
871 std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
872 StringMap<SDNode*> ExternalSymbols;
874 std::map<std::pair<std::string, unsigned char>,SDNode*> TargetExternalSymbols;
877 template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
878 typedef SelectionDAG::allnodes_iterator nodes_iterator;
879 static nodes_iterator nodes_begin(SelectionDAG *G) {
880 return G->allnodes_begin();
882 static nodes_iterator nodes_end(SelectionDAG *G) {
883 return G->allnodes_end();
887 } // end namespace llvm