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, DebugLoc::getUnknownLoc(),
47 SDNode *createSentinel() const {
50 static void destroySentinel(SDNode *) {}
52 static void deleteNode(SDNode *) {
53 assert(0 && "ilist_traits<SDNode> shouldn't see a deleteNode call!");
56 static void createNode(const SDNode &);
60 Unrestricted, // Combine may create illegal operations and illegal types.
61 NoIllegalTypes, // Combine may create illegal operations but no illegal types.
62 NoIllegalOperations // Combine may only create legal operations and types.
65 /// SelectionDAG class - This is used to represent a portion of an LLVM function
66 /// in a low-level Data Dependence DAG representation suitable for instruction
67 /// selection. This DAG is constructed as the first step of instruction
68 /// selection in order to allow implementation of machine specific optimizations
69 /// and code simplifications.
71 /// The representation used by the SelectionDAG is a target-independent
72 /// representation, which has some similarities to the GCC RTL representation,
73 /// but is significantly more simple, powerful, and is a graph form instead of a
79 FunctionLoweringInfo &FLI;
80 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, DenseSet<SDNode *> &visited,
119 int level, bool &printed);
122 SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli);
125 /// init - Prepare this SelectionDAG to process code in the given
128 void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw);
130 /// clear - Clear state and free memory necessary to make this
131 /// SelectionDAG ready to process a new block.
135 MachineFunction &getMachineFunction() const { return *MF; }
136 const TargetMachine &getTarget() const;
137 TargetLowering &getTargetLoweringInfo() const { return TLI; }
138 FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
139 MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
140 DwarfWriter *getDwarfWriter() const { return DW; }
142 /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
144 void viewGraph(const std::string &Title);
148 std::map<const SDNode *, std::string> NodeGraphAttrs;
151 /// clearGraphAttrs - Clear all previously defined node graph attributes.
152 /// Intended to be used from a debugging tool (eg. gdb).
153 void clearGraphAttrs();
155 /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
157 void setGraphAttrs(const SDNode *N, const char *Attrs);
159 /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
160 /// Used from getNodeAttributes.
161 const std::string getGraphAttrs(const SDNode *N) const;
163 /// setGraphColor - Convenience for setting node color attribute.
165 void setGraphColor(const SDNode *N, const char *Color);
167 /// setGraphColor - Convenience for setting subgraph color attribute.
169 void setSubgraphColor(SDNode *N, const char *Color);
171 typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
172 allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
173 allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
174 typedef ilist<SDNode>::iterator allnodes_iterator;
175 allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
176 allnodes_iterator allnodes_end() { return AllNodes.end(); }
177 ilist<SDNode>::size_type allnodes_size() const {
178 return AllNodes.size();
181 /// getRoot - Return the root tag of the SelectionDAG.
183 const SDValue &getRoot() const { return Root; }
185 /// getEntryNode - Return the token chain corresponding to the entry of the
187 SDValue getEntryNode() const {
188 return SDValue(const_cast<SDNode *>(&EntryNode), 0);
191 /// setRoot - Set the current root tag of the SelectionDAG.
193 const SDValue &setRoot(SDValue N) {
194 assert((!N.getNode() || N.getValueType() == MVT::Other) &&
195 "DAG root value is not a chain!");
199 /// Combine - This iterates over the nodes in the SelectionDAG, folding
200 /// certain types of nodes together, or eliminating superfluous nodes. The
201 /// Level argument controls whether Combine is allowed to produce nodes and
202 /// types that are illegal on the target.
203 void Combine(CombineLevel Level, AliasAnalysis &AA, bool Fast);
205 /// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
206 /// only uses types natively supported by the target. Returns "true" if it
207 /// made any changes.
209 /// Note that this is an involved process that may invalidate pointers into
211 bool LegalizeTypes();
213 /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
214 /// compatible with the target instruction selector, as indicated by the
215 /// TargetLowering object.
217 /// Note that this is an involved process that may invalidate pointers into
219 void Legalize(bool TypesNeedLegalizing, bool Fast);
221 /// RemoveDeadNodes - This method deletes all unreachable nodes in the
223 void RemoveDeadNodes();
225 /// DeleteNode - Remove the specified node from the system. This node must
226 /// have no referrers.
227 void DeleteNode(SDNode *N);
229 /// getVTList - Return an SDVTList that represents the list of values
231 SDVTList getVTList(MVT VT);
232 SDVTList getVTList(MVT VT1, MVT VT2);
233 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3);
234 SDVTList getVTList(MVT VT1, MVT VT2, MVT VT3, MVT VT4);
235 SDVTList getVTList(const MVT *VTs, unsigned NumVTs);
237 /// getNodeValueTypes - These are obsolete, use getVTList instead.
238 const MVT *getNodeValueTypes(MVT VT) {
239 return getVTList(VT).VTs;
241 const MVT *getNodeValueTypes(MVT VT1, MVT VT2) {
242 return getVTList(VT1, VT2).VTs;
244 const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3) {
245 return getVTList(VT1, VT2, VT3).VTs;
247 const MVT *getNodeValueTypes(MVT VT1, MVT VT2, MVT VT3, MVT VT4) {
248 return getVTList(VT1, VT2, VT3, VT4).VTs;
250 const MVT *getNodeValueTypes(const std::vector<MVT> &vtList) {
251 return getVTList(&vtList[0], (unsigned)vtList.size()).VTs;
255 //===--------------------------------------------------------------------===//
256 // Node creation methods.
258 SDValue getConstant(uint64_t Val, MVT VT, bool isTarget = false);
259 SDValue getConstant(const APInt &Val, MVT VT, bool isTarget = false);
260 SDValue getConstant(const ConstantInt &Val, MVT VT, bool isTarget = false);
261 SDValue getIntPtrConstant(uint64_t Val, bool isTarget = false);
262 SDValue getTargetConstant(uint64_t Val, MVT VT) {
263 return getConstant(Val, VT, true);
265 SDValue getTargetConstant(const APInt &Val, MVT VT) {
266 return getConstant(Val, VT, true);
268 SDValue getTargetConstant(const ConstantInt &Val, MVT VT) {
269 return getConstant(Val, VT, true);
271 SDValue getConstantFP(double Val, MVT VT, bool isTarget = false);
272 SDValue getConstantFP(const APFloat& Val, MVT VT, bool isTarget = false);
273 SDValue getConstantFP(const ConstantFP &CF, MVT VT, bool isTarget = false);
274 SDValue getTargetConstantFP(double Val, MVT VT) {
275 return getConstantFP(Val, VT, true);
277 SDValue getTargetConstantFP(const APFloat& Val, MVT VT) {
278 return getConstantFP(Val, VT, true);
280 SDValue getTargetConstantFP(const ConstantFP &Val, MVT VT) {
281 return getConstantFP(Val, VT, true);
283 SDValue getGlobalAddress(const GlobalValue *GV, MVT VT,
284 int64_t offset = 0, bool isTargetGA = false);
285 SDValue getTargetGlobalAddress(const GlobalValue *GV, MVT VT,
286 int64_t offset = 0) {
287 return getGlobalAddress(GV, VT, offset, true);
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 SDValue getTargetJumpTable(int JTI, MVT VT) {
295 return getJumpTable(JTI, VT, true);
297 SDValue getConstantPool(Constant *C, MVT VT,
298 unsigned Align = 0, int Offs = 0, bool isT=false);
299 SDValue getTargetConstantPool(Constant *C, MVT VT,
300 unsigned Align = 0, int Offset = 0) {
301 return getConstantPool(C, VT, Align, Offset, true);
303 SDValue getConstantPool(MachineConstantPoolValue *C, MVT VT,
304 unsigned Align = 0, int Offs = 0, bool isT=false);
305 SDValue getTargetConstantPool(MachineConstantPoolValue *C,
306 MVT VT, unsigned Align = 0,
308 return getConstantPool(C, VT, Align, Offset, true);
310 // When generating a branch to a BB, we don't in general know enough
311 // to provide debug info for the BB at that time, so keep this one around.
312 SDValue getBasicBlock(MachineBasicBlock *MBB);
313 SDValue getBasicBlock(MachineBasicBlock *MBB, DebugLoc dl);
314 SDValue getExternalSymbol(const char *Sym, MVT VT);
315 SDValue getExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
316 SDValue getTargetExternalSymbol(const char *Sym, MVT VT);
317 SDValue getTargetExternalSymbol(const char *Sym, DebugLoc dl, MVT VT);
318 SDValue getArgFlags(ISD::ArgFlagsTy Flags);
319 SDValue getValueType(MVT);
320 SDValue getRegister(unsigned Reg, MVT VT);
321 SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
323 SDValue getLabel(unsigned Opcode, DebugLoc dl, SDValue Root,
326 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
327 return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
328 getRegister(Reg, N.getValueType()), N);
331 // This version of the getCopyToReg method takes an extra operand, which
332 // indicates that there is potentially an incoming flag value (if Flag is not
333 // null) and that there should be a flag result.
334 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N,
336 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
337 SDValue Ops[] = { Chain, getRegister(Reg, N.getValueType()), N, Flag };
338 return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
341 // Similar to last getCopyToReg() except parameter Reg is a SDValue
342 SDValue getCopyToReg(SDValue Chain, DebugLoc dl, SDValue Reg, SDValue N,
344 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
345 SDValue Ops[] = { Chain, Reg, N, Flag };
346 return getNode(ISD::CopyToReg, dl, VTs, 2, Ops, Flag.getNode() ? 4 : 3);
349 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT) {
350 const MVT *VTs = getNodeValueTypes(VT, MVT::Other);
351 SDValue Ops[] = { Chain, getRegister(Reg, VT) };
352 return getNode(ISD::CopyFromReg, dl, VTs, 2, Ops, 2);
355 // This version of the getCopyFromReg method takes an extra operand, which
356 // indicates that there is potentially an incoming flag value (if Flag is not
357 // null) and that there should be a flag result.
358 SDValue getCopyFromReg(SDValue Chain, DebugLoc dl, unsigned Reg, MVT VT,
360 const MVT *VTs = getNodeValueTypes(VT, MVT::Other, MVT::Flag);
361 SDValue Ops[] = { Chain, getRegister(Reg, VT), Flag };
362 return getNode(ISD::CopyFromReg, dl, VTs, 3, Ops, Flag.getNode() ? 3 : 2);
365 SDValue getCondCode(ISD::CondCode Cond);
367 /// Returns the ConvertRndSat Note: Avoid using this node because it may
368 /// disappear in the future and most targets don't support it.
369 SDValue getConvertRndSat(MVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
371 SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
373 /// getZeroExtendInReg - Return the expression required to zero extend the Op
374 /// value assuming it was the smaller SrcTy value.
375 SDValue getZeroExtendInReg(SDValue Op, DebugLoc DL, MVT SrcTy);
377 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
378 SDValue getNOT(DebugLoc DL, SDValue Val, MVT VT);
380 /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
381 /// a flag result (to ensure it's not CSE'd). CALLSEQ_START does not have a
383 SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
384 const MVT *VTs = getNodeValueTypes(MVT::Other, MVT::Flag);
385 SDValue Ops[] = { Chain, Op };
386 return getNode(ISD::CALLSEQ_START, DebugLoc::getUnknownLoc(),
390 /// getCALLSEQ_END - Return a new CALLSEQ_END node, which always must have a
391 /// flag result (to ensure it's not CSE'd). CALLSEQ_END does not have
392 /// a useful DebugLoc.
393 SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2,
395 SDVTList NodeTys = getVTList(MVT::Other, MVT::Flag);
396 SmallVector<SDValue, 4> Ops;
397 Ops.push_back(Chain);
400 Ops.push_back(InFlag);
401 return getNode(ISD::CALLSEQ_END, DebugLoc::getUnknownLoc(), NodeTys,
403 (unsigned)Ops.size() - (InFlag.getNode() == 0 ? 1 : 0));
406 /// getUNDEF - Return an UNDEF node. UNDEF does not have a useful DebugLoc.
407 SDValue getUNDEF(MVT VT) {
408 return getNode(ISD::UNDEF, DebugLoc::getUnknownLoc(), VT);
411 /// getGLOBAL_OFFSET_TABLE - Return a GLOBAL_OFFSET_TABLE node. This does
412 /// not have a useful DebugLoc.
413 SDValue getGLOBAL_OFFSET_TABLE(MVT VT) {
414 return getNode(ISD::GLOBAL_OFFSET_TABLE, DebugLoc::getUnknownLoc(), VT);
417 /// getNode - Gets or creates the specified node.
419 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT);
420 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N);
421 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT, SDValue N1, SDValue N2);
422 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
423 SDValue N1, SDValue N2, SDValue N3);
424 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
425 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
426 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
427 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
429 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
430 const SDUse *Ops, unsigned NumOps);
431 SDValue getNode(unsigned Opcode, DebugLoc DL, MVT VT,
432 const SDValue *Ops, unsigned NumOps);
433 SDValue getNode(unsigned Opcode, DebugLoc DL,
434 const std::vector<MVT> &ResultTys,
435 const SDValue *Ops, unsigned NumOps);
436 SDValue getNode(unsigned Opcode, DebugLoc DL, const MVT *VTs, unsigned NumVTs,
437 const SDValue *Ops, unsigned NumOps);
438 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
439 const SDValue *Ops, unsigned NumOps);
440 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs);
441 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs, SDValue N);
442 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
443 SDValue N1, SDValue N2);
444 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
445 SDValue N1, SDValue N2, SDValue N3);
446 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
447 SDValue N1, SDValue N2, SDValue N3, SDValue N4);
448 SDValue getNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
449 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
452 SDValue getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
453 SDValue Size, unsigned Align, bool AlwaysInline,
454 const Value *DstSV, uint64_t DstSVOff,
455 const Value *SrcSV, uint64_t SrcSVOff);
457 SDValue getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
458 SDValue Size, unsigned Align,
459 const Value *DstSV, uint64_t DstOSVff,
460 const Value *SrcSV, uint64_t SrcSVOff);
462 SDValue getMemset(SDValue Chain, DebugLoc dl, SDValue Dst, SDValue Src,
463 SDValue Size, unsigned Align,
464 const Value *DstSV, uint64_t DstSVOff);
466 /// getSetCC - Helper function to make it easier to build SetCC's if you just
467 /// have an ISD::CondCode instead of an SDValue.
469 SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
470 ISD::CondCode Cond) {
471 return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond));
474 /// getVSetCC - Helper function to make it easier to build VSetCC's nodes
475 /// if you just have an ISD::CondCode instead of an SDValue.
477 SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS,
478 ISD::CondCode Cond) {
479 return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond));
482 /// getSelectCC - Helper function to make it easier to build SelectCC's if you
483 /// just have an ISD::CondCode instead of an SDValue.
485 SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS,
486 SDValue True, SDValue False, ISD::CondCode Cond) {
487 return getNode(ISD::SELECT_CC, DL, True.getValueType(),
488 LHS, RHS, True, False, getCondCode(Cond));
491 /// getVAArg - VAArg produces a result and token chain, and takes a pointer
492 /// and a source value as input.
493 SDValue getVAArg(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
496 /// getAtomic - Gets a node for an atomic op, produces result and chain and
498 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
499 SDValue Ptr, SDValue Cmp, SDValue Swp, const Value* PtrVal,
500 unsigned Alignment=0);
502 /// getAtomic - Gets a node for an atomic op, produces result and chain and
503 /// takes 2 operands.
504 SDValue getAtomic(unsigned Opcode, DebugLoc dl, MVT MemVT, SDValue Chain,
505 SDValue Ptr, SDValue Val, const Value* PtrVal,
506 unsigned Alignment = 0);
508 /// getMemIntrinsicNode - Creates a MemIntrinsicNode that may produce a
509 /// result and takes a list of operands.
510 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
511 const MVT *VTs, unsigned NumVTs,
512 const SDValue *Ops, unsigned NumOps,
513 MVT MemVT, const Value *srcValue, int SVOff,
514 unsigned Align = 0, bool Vol = false,
515 bool ReadMem = true, bool WriteMem = true);
517 SDValue getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
518 const SDValue *Ops, unsigned NumOps,
519 MVT MemVT, const Value *srcValue, int SVOff,
520 unsigned Align = 0, bool Vol = false,
521 bool ReadMem = true, bool WriteMem = true);
523 /// getMergeValues - Create a MERGE_VALUES node from the given operands.
524 SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, DebugLoc dl);
526 /// getCall - Create a CALL node from the given information.
528 SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
529 bool IsTailCall, bool isInreg, SDVTList VTs,
530 const SDValue *Operands, unsigned NumOperands);
532 /// getLoad - Loads are not normal binary operators: their result type is not
533 /// determined by their operands, and they produce a value AND a token chain.
535 SDValue getLoad(MVT VT, DebugLoc dl, SDValue Chain, SDValue Ptr,
536 const Value *SV, int SVOffset, bool isVolatile=false,
537 unsigned Alignment=0);
538 SDValue getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, MVT VT,
539 SDValue Chain, SDValue Ptr, const Value *SV,
540 int SVOffset, MVT EVT, bool isVolatile=false,
541 unsigned Alignment=0);
542 SDValue getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
543 SDValue Offset, ISD::MemIndexedMode AM);
544 SDValue getLoad(ISD::MemIndexedMode AM, DebugLoc dl, ISD::LoadExtType ExtType,
545 MVT VT, SDValue Chain,
546 SDValue Ptr, SDValue Offset,
547 const Value *SV, int SVOffset, MVT EVT,
548 bool isVolatile=false, unsigned Alignment=0);
550 /// getStore - Helper function to build ISD::STORE nodes.
552 SDValue getStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
553 const Value *SV, int SVOffset, bool isVolatile=false,
554 unsigned Alignment=0);
555 SDValue getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val, SDValue Ptr,
556 const Value *SV, int SVOffset, MVT TVT,
557 bool isVolatile=false, unsigned Alignment=0);
558 SDValue getIndexedStore(SDValue OrigStoe, DebugLoc dl, SDValue Base,
559 SDValue Offset, ISD::MemIndexedMode AM);
561 /// getSrcValue - Construct a node to track a Value* through the backend.
562 SDValue getSrcValue(const Value *v);
564 /// getMemOperand - Construct a node to track a memory reference
565 /// through the backend.
566 SDValue getMemOperand(const MachineMemOperand &MO);
568 /// getShiftAmountOperand - Return the specified value casted to
569 /// the target's desired shift amount type.
570 SDValue getShiftAmountOperand(SDValue Op);
572 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
573 /// specified operands. If the resultant node already exists in the DAG,
574 /// this does not modify the specified node, instead it returns the node that
575 /// already exists. If the resultant node does not exist in the DAG, the
576 /// input node is returned. As a degenerate case, if you specify the same
577 /// input operands as the node already has, the input node is returned.
578 SDValue UpdateNodeOperands(SDValue N, SDValue Op);
579 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2);
580 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
582 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
583 SDValue Op3, SDValue Op4);
584 SDValue UpdateNodeOperands(SDValue N, SDValue Op1, SDValue Op2,
585 SDValue Op3, SDValue Op4, SDValue Op5);
586 SDValue UpdateNodeOperands(SDValue N,
587 const SDValue *Ops, unsigned NumOps);
589 /// SelectNodeTo - These are used for target selectors to *mutate* the
590 /// specified node to have the specified return type, Target opcode, and
591 /// operands. Note that target opcodes are stored as
592 /// ~TargetOpcode in the node opcode field. The resultant node is returned.
593 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT);
594 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT, SDValue Op1);
595 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
596 SDValue Op1, SDValue Op2);
597 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
598 SDValue Op1, SDValue Op2, SDValue Op3);
599 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
600 const SDValue *Ops, unsigned NumOps);
601 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
602 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
603 MVT VT2, const SDValue *Ops, unsigned NumOps);
604 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
605 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
606 SDNode *SelectNodeTo(SDNode *N, unsigned MachineOpc, MVT VT1,
607 MVT VT2, MVT VT3, MVT VT4, const SDValue *Ops,
609 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
610 MVT VT2, SDValue Op1);
611 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
612 MVT VT2, SDValue Op1, SDValue Op2);
613 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
614 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
615 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
616 MVT VT2, MVT VT3, SDValue Op1, SDValue Op2, SDValue Op3);
617 SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
618 const SDValue *Ops, unsigned NumOps);
620 /// MorphNodeTo - These *mutate* the specified node to have the specified
621 /// return type, opcode, and operands.
622 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT);
623 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT, SDValue Op1);
624 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
625 SDValue Op1, SDValue Op2);
626 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
627 SDValue Op1, SDValue Op2, SDValue Op3);
628 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT,
629 const SDValue *Ops, unsigned NumOps);
630 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1, MVT VT2);
631 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
632 MVT VT2, const SDValue *Ops, unsigned NumOps);
633 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
634 MVT VT2, MVT VT3, const SDValue *Ops, unsigned NumOps);
635 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
636 MVT VT2, SDValue Op1);
637 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
638 MVT VT2, SDValue Op1, SDValue Op2);
639 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, MVT VT1,
640 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
641 SDNode *MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs,
642 const SDValue *Ops, unsigned NumOps);
644 /// getTargetNode - These are used for target selectors to create a new node
645 /// with specified return type(s), target opcode, and operands.
647 /// Note that getTargetNode returns the resultant node. If there is already a
648 /// node of the specified opcode and operands, it returns that node instead of
650 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT);
651 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1);
652 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT, SDValue Op1,
654 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
655 SDValue Op1, SDValue Op2, SDValue Op3);
656 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT,
657 const SDValue *Ops, unsigned NumOps);
658 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2);
659 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
661 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
662 MVT VT2, SDValue Op1, SDValue Op2);
663 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1,
664 MVT VT2, SDValue Op1, SDValue Op2, SDValue Op3);
665 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2,
666 const SDValue *Ops, unsigned NumOps);
667 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
668 SDValue Op1, SDValue Op2);
669 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
670 SDValue Op1, SDValue Op2, SDValue Op3);
671 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
672 const SDValue *Ops, unsigned NumOps);
673 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl, MVT VT1, MVT VT2, MVT VT3,
674 MVT VT4, const SDValue *Ops, unsigned NumOps);
675 SDNode *getTargetNode(unsigned Opcode, DebugLoc dl,
676 const std::vector<MVT> &ResultTys, const SDValue *Ops,
679 /// getNodeIfExists - Get the specified node if it's already available, or
680 /// else return NULL.
681 SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs,
682 const SDValue *Ops, unsigned NumOps);
684 /// DAGUpdateListener - Clients of various APIs that cause global effects on
685 /// the DAG can optionally implement this interface. This allows the clients
686 /// to handle the various sorts of updates that happen.
687 class DAGUpdateListener {
689 virtual ~DAGUpdateListener();
691 /// NodeDeleted - The node N that was deleted and, if E is not null, an
692 /// equivalent node E that replaced it.
693 virtual void NodeDeleted(SDNode *N, SDNode *E) = 0;
695 /// NodeUpdated - The node N that was updated.
696 virtual void NodeUpdated(SDNode *N) = 0;
699 /// RemoveDeadNode - Remove the specified node from the system. If any of its
700 /// operands then becomes dead, remove them as well. Inform UpdateListener
701 /// for each node deleted.
702 void RemoveDeadNode(SDNode *N, DAGUpdateListener *UpdateListener = 0);
704 /// RemoveDeadNodes - This method deletes the unreachable nodes in the
705 /// given list, and any nodes that become unreachable as a result.
706 void RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
707 DAGUpdateListener *UpdateListener = 0);
709 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
710 /// This can cause recursive merging of nodes in the DAG. Use the first
711 /// version if 'From' is known to have a single result, use the second
712 /// if you have two nodes with identical results, use the third otherwise.
714 /// These methods all take an optional UpdateListener, which (if not null) is
715 /// informed about nodes that are deleted and modified due to recursive
716 /// changes in the dag.
718 /// These functions only replace all existing uses. It's possible that as
719 /// these replacements are being performed, CSE may cause the From node
720 /// to be given new uses. These new uses of From are left in place, and
721 /// not automatically transfered to To.
723 void ReplaceAllUsesWith(SDValue From, SDValue Op,
724 DAGUpdateListener *UpdateListener = 0);
725 void ReplaceAllUsesWith(SDNode *From, SDNode *To,
726 DAGUpdateListener *UpdateListener = 0);
727 void ReplaceAllUsesWith(SDNode *From, const SDValue *To,
728 DAGUpdateListener *UpdateListener = 0);
730 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
731 /// uses of other values produced by From.Val alone.
732 void ReplaceAllUsesOfValueWith(SDValue From, SDValue To,
733 DAGUpdateListener *UpdateListener = 0);
735 /// ReplaceAllUsesOfValuesWith - Like ReplaceAllUsesOfValueWith, but
736 /// for multiple values at once. This correctly handles the case where
737 /// there is an overlap between the From values and the To values.
738 void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To,
740 DAGUpdateListener *UpdateListener = 0);
742 /// AssignTopologicalOrder - Topological-sort the AllNodes list and a
743 /// assign a unique node id for each node in the DAG based on their
744 /// topological order. Returns the number of nodes.
745 unsigned AssignTopologicalOrder();
747 /// RepositionNode - Move node N in the AllNodes list to be immediately
748 /// before the given iterator Position. This may be used to update the
749 /// topological ordering when the list of nodes is modified.
750 void RepositionNode(allnodes_iterator Position, SDNode *N) {
751 AllNodes.insert(Position, AllNodes.remove(N));
754 /// isCommutativeBinOp - Returns true if the opcode is a commutative binary
756 static bool isCommutativeBinOp(unsigned Opcode) {
757 // FIXME: This should get its info from the td file, so that we can include
772 case ISD::ADDE: return true;
773 default: return false;
779 /// CreateStackTemporary - Create a stack temporary, suitable for holding the
780 /// specified value type. If minAlign is specified, the slot size will have
781 /// at least that alignment.
782 SDValue CreateStackTemporary(MVT VT, unsigned minAlign = 1);
784 /// CreateStackTemporary - Create a stack temporary suitable for holding
785 /// either of the specified value types.
786 SDValue CreateStackTemporary(MVT VT1, MVT VT2);
788 /// FoldConstantArithmetic -
789 SDValue FoldConstantArithmetic(unsigned Opcode,
791 ConstantSDNode *Cst1,
792 ConstantSDNode *Cst2);
794 /// FoldSetCC - Constant fold a setcc to true or false.
795 SDValue FoldSetCC(MVT VT, SDValue N1,
796 SDValue N2, ISD::CondCode Cond, DebugLoc dl);
798 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
799 /// use this predicate to simplify operations downstream.
800 bool SignBitIsZero(SDValue Op, unsigned Depth = 0) const;
802 /// MaskedValueIsZero - Return true if 'Op & Mask' is known to be zero. We
803 /// use this predicate to simplify operations downstream. Op and Mask are
804 /// known to be the same type.
805 bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth = 0)
808 /// ComputeMaskedBits - Determine which of the bits specified in Mask are
809 /// known to be either zero or one and return them in the KnownZero/KnownOne
810 /// bitsets. This code only analyzes bits in Mask, in order to short-circuit
811 /// processing. Targets can implement the computeMaskedBitsForTargetNode
812 /// method in the TargetLowering class to allow target nodes to be understood.
813 void ComputeMaskedBits(SDValue Op, const APInt &Mask, APInt &KnownZero,
814 APInt &KnownOne, unsigned Depth = 0) const;
816 /// ComputeNumSignBits - Return the number of times the sign bit of the
817 /// register is replicated into the other bits. We know that at least 1 bit
818 /// is always equal to the sign bit (itself), but other cases can give us
819 /// information. For example, immediately after an "SRA X, 2", we know that
820 /// the top 3 bits are all equal to each other, so we return 3. Targets can
821 /// implement the ComputeNumSignBitsForTarget method in the TargetLowering
822 /// class to allow target nodes to be understood.
823 unsigned ComputeNumSignBits(SDValue Op, unsigned Depth = 0) const;
825 /// isVerifiedDebugInfoDesc - Returns true if the specified SDValue has
826 /// been verified as a debug information descriptor.
827 bool isVerifiedDebugInfoDesc(SDValue Op) const;
829 /// getShuffleScalarElt - Returns the scalar element that will make up the ith
830 /// element of the result of the vector shuffle.
831 SDValue getShuffleScalarElt(const SDNode *N, unsigned Idx);
834 bool RemoveNodeFromCSEMaps(SDNode *N);
835 void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
836 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
837 SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
839 SDNode *FindModifiedNodeSlot(SDNode *N, const SDValue *Ops, unsigned NumOps,
842 void DeleteNodeNotInCSEMaps(SDNode *N);
843 void DeallocateNode(SDNode *N);
845 unsigned getMVTAlignment(MVT MemoryVT) const;
847 void allnodes_clear();
849 /// VTList - List of non-single value types.
850 std::vector<SDVTList> VTList;
852 /// CondCodeNodes - Maps to auto-CSE operations.
853 std::vector<CondCodeSDNode*> CondCodeNodes;
855 std::vector<SDNode*> ValueTypeNodes;
856 std::map<MVT, SDNode*, MVT::compareRawBits> ExtendedValueTypeNodes;
857 StringMap<SDNode*> ExternalSymbols;
858 StringMap<SDNode*> TargetExternalSymbols;
861 template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
862 typedef SelectionDAG::allnodes_iterator nodes_iterator;
863 static nodes_iterator nodes_begin(SelectionDAG *G) {
864 return G->allnodes_begin();
866 static nodes_iterator nodes_end(SelectionDAG *G) {
867 return G->allnodes_end();
871 } // end namespace llvm