SelectionDAG.h revision b2efb853f00d45b1c8d57f92acd0028fbdeffda6
1//===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the SelectionDAG class, and transitively defines the
11// SDNode class and subclasses.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_SELECTIONDAG_H
16#define LLVM_CODEGEN_SELECTIONDAG_H
17
18#include "llvm/CodeGen/SelectionDAGNodes.h"
19#include "llvm/ADT/ilist"
20
21#include <map>
22#include <list>
23#include <string>
24
25namespace llvm {
26  class TargetLowering;
27  class TargetMachine;
28  class MachineDebugInfo;
29  class MachineFunction;
30
31/// SelectionDAG class - This is used to represent a portion of an LLVM function
32/// in a low-level Data Dependence DAG representation suitable for instruction
33/// selection.  This DAG is constructed as the first step of instruction
34/// selection in order to allow implementation of machine specific optimizations
35/// and code simplifications.
36///
37/// The representation used by the SelectionDAG is a target-independent
38/// representation, which has some similarities to the GCC RTL representation,
39/// but is significantly more simple, powerful, and is a graph form instead of a
40/// linear form.
41///
42class SelectionDAG {
43  TargetLowering &TLI;
44  MachineFunction &MF;
45  MachineDebugInfo *DI;
46
47  // Root - The root of the entire DAG.  EntryNode - The starting token.
48  SDOperand Root, EntryNode;
49
50  // AllNodes - A linked list of nodes in the current DAG.
51  ilist<SDNode> AllNodes;
52
53  // ValueNodes - track SrcValue nodes
54  std::map<std::pair<const Value*, int>, SDNode*> ValueNodes;
55
56public:
57  SelectionDAG(TargetLowering &tli, MachineFunction &mf, MachineDebugInfo *di)
58  : TLI(tli), MF(mf), DI(di) {
59    EntryNode = Root = getNode(ISD::EntryToken, MVT::Other);
60  }
61  ~SelectionDAG();
62
63  MachineFunction &getMachineFunction() const { return MF; }
64  const TargetMachine &getTarget() const;
65  TargetLowering &getTargetLoweringInfo() const { return TLI; }
66  MachineDebugInfo *getMachineDebugInfo() const { return DI; }
67
68  /// viewGraph - Pop up a ghostview window with the DAG rendered using 'dot'.
69  ///
70  void viewGraph();
71
72
73  typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
74  allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
75  allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
76  typedef ilist<SDNode>::iterator allnodes_iterator;
77  allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
78  allnodes_iterator allnodes_end() { return AllNodes.end(); }
79
80  /// getRoot - Return the root tag of the SelectionDAG.
81  ///
82  const SDOperand &getRoot() const { return Root; }
83
84  /// getEntryNode - Return the token chain corresponding to the entry of the
85  /// function.
86  const SDOperand &getEntryNode() const { return EntryNode; }
87
88  /// setRoot - Set the current root tag of the SelectionDAG.
89  ///
90  const SDOperand &setRoot(SDOperand N) { return Root = N; }
91
92  /// Combine - This iterates over the nodes in the SelectionDAG, folding
93  /// certain types of nodes together, or eliminating superfluous nodes.  When
94  /// the AfterLegalize argument is set to 'true', Combine takes care not to
95  /// generate any nodes that will be illegal on the target.
96  void Combine(bool AfterLegalize);
97
98  /// Legalize - This transforms the SelectionDAG into a SelectionDAG that is
99  /// compatible with the target instruction selector, as indicated by the
100  /// TargetLowering object.
101  ///
102  /// Note that this is an involved process that may invalidate pointers into
103  /// the graph.
104  void Legalize();
105
106  /// RemoveDeadNodes - This method deletes all unreachable nodes in the
107  /// SelectionDAG, including nodes (like loads) that have uses of their token
108  /// chain but no other uses and no side effect.  If a node is passed in as an
109  /// argument, it is used as the seed for node deletion.
110  void RemoveDeadNodes(SDNode *N = 0);
111
112  SDOperand getString(const std::string &Val);
113  SDOperand getConstant(uint64_t Val, MVT::ValueType VT);
114  SDOperand getTargetConstant(uint64_t Val, MVT::ValueType VT);
115  SDOperand getConstantFP(double Val, MVT::ValueType VT);
116  SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
117                             int offset = 0);
118  SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
119                                   int offset = 0);
120  SDOperand getFrameIndex(int FI, MVT::ValueType VT);
121  SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
122  SDOperand getConstantPool(Constant *C, MVT::ValueType VT);
123  SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT);
124  SDOperand getBasicBlock(MachineBasicBlock *MBB);
125  SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT);
126  SDOperand getTargetExternalSymbol(const char *Sym, MVT::ValueType VT);
127  SDOperand getValueType(MVT::ValueType);
128  SDOperand getRegister(unsigned Reg, MVT::ValueType VT);
129
130  SDOperand getCopyToReg(SDOperand Chain, unsigned Reg, SDOperand N) {
131    return getNode(ISD::CopyToReg, MVT::Other, Chain,
132                   getRegister(Reg, N.getValueType()), N);
133  }
134
135  // This version of the getCopyToReg method takes an extra operand, which
136  // indicates that there is potentially an incoming flag value (if Flag is not
137  // null) and that there should be a flag result.
138  SDOperand getCopyToReg(SDOperand Chain, unsigned Reg, SDOperand N,
139                         SDOperand Flag) {
140    std::vector<MVT::ValueType> VTs;
141    VTs.push_back(MVT::Other);
142    VTs.push_back(MVT::Flag);
143    std::vector<SDOperand> Ops;
144    Ops.push_back(Chain);
145    Ops.push_back(getRegister(Reg, N.getValueType()));
146    Ops.push_back(N);
147    if (Flag.Val) Ops.push_back(Flag);
148    return getNode(ISD::CopyToReg, VTs, Ops);
149  }
150
151  // Similar to last getCopyToReg() except parameter Reg is a SDOperand
152  SDOperand getCopyToReg(SDOperand Chain, SDOperand Reg, SDOperand N,
153                         SDOperand Flag) {
154    std::vector<MVT::ValueType> VTs;
155    VTs.push_back(MVT::Other);
156    VTs.push_back(MVT::Flag);
157    std::vector<SDOperand> Ops;
158    Ops.push_back(Chain);
159    Ops.push_back(Reg);
160    Ops.push_back(N);
161    if (Flag.Val) Ops.push_back(Flag);
162    return getNode(ISD::CopyToReg, VTs, Ops);
163  }
164
165  SDOperand getCopyFromReg(SDOperand Chain, unsigned Reg, MVT::ValueType VT) {
166    std::vector<MVT::ValueType> ResultTys;
167    ResultTys.push_back(VT);
168    ResultTys.push_back(MVT::Other);
169    std::vector<SDOperand> Ops;
170    Ops.push_back(Chain);
171    Ops.push_back(getRegister(Reg, VT));
172    return getNode(ISD::CopyFromReg, ResultTys, Ops);
173  }
174
175  // This version of the getCopyFromReg method takes an extra operand, which
176  // indicates that there is potentially an incoming flag value (if Flag is not
177  // null) and that there should be a flag result.
178  SDOperand getCopyFromReg(SDOperand Chain, unsigned Reg, MVT::ValueType VT,
179                           SDOperand Flag) {
180    std::vector<MVT::ValueType> ResultTys;
181    ResultTys.push_back(VT);
182    ResultTys.push_back(MVT::Other);
183    ResultTys.push_back(MVT::Flag);
184    std::vector<SDOperand> Ops;
185    Ops.push_back(Chain);
186    Ops.push_back(getRegister(Reg, VT));
187    if (Flag.Val) Ops.push_back(Flag);
188    return getNode(ISD::CopyFromReg, ResultTys, Ops);
189  }
190
191  /// getCall - Note that this destroys the vector of RetVals passed in.
192  ///
193  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
194                  SDOperand Callee, bool isTailCall = false) {
195    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, Chain,
196                            Callee);
197    setNodeValueTypes(NN, RetVals);
198    AllNodes.push_back(NN);
199    return NN;
200  }
201  /// getCall - Note that this destroys the vector of RetVals passed in.
202  ///
203  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
204                  SDOperand Callee, SDOperand Flag, bool isTailCall = false) {
205    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, Chain,
206                            Callee, Flag);
207    setNodeValueTypes(NN, RetVals);
208    AllNodes.push_back(NN);
209    return NN;
210  }
211
212  /// getCall - This is identical to the one above, and should be used for calls
213  /// where arguments are passed in physical registers.  This destroys the
214  /// RetVals and ArgsInRegs vectors.
215  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
216                  SDOperand Callee, std::vector<SDOperand> &ArgsInRegs,
217                  bool isTailCall = false) {
218    ArgsInRegs.insert(ArgsInRegs.begin(), Callee);
219    ArgsInRegs.insert(ArgsInRegs.begin(), Chain);
220    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, ArgsInRegs);
221    setNodeValueTypes(NN, RetVals);
222    AllNodes.push_back(NN);
223    return NN;
224  }
225
226  SDOperand getCondCode(ISD::CondCode Cond);
227
228  /// getZeroExtendInReg - Return the expression required to zero extend the Op
229  /// value assuming it was the smaller SrcTy value.
230  SDOperand getZeroExtendInReg(SDOperand Op, MVT::ValueType SrcTy);
231
232  /// getNode - Gets or creates the specified node.
233  ///
234  SDOperand getNode(unsigned Opcode, MVT::ValueType VT);
235  SDOperand getNode(unsigned Opcode, MVT::ValueType VT, SDOperand N);
236  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
237                    SDOperand N1, SDOperand N2);
238  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
239                    SDOperand N1, SDOperand N2, SDOperand N3);
240  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
241                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4);
242  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
243                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4,
244                    SDOperand N5);
245  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
246                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4,
247                    SDOperand N5, SDOperand N6);
248  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
249                    std::vector<SDOperand> &Children);
250  SDOperand getNode(unsigned Opcode, std::vector<MVT::ValueType> &ResultTys,
251                    std::vector<SDOperand> &Ops);
252
253  /// getSetCC - Helper function to make it easier to build SetCC's if you just
254  /// have an ISD::CondCode instead of an SDOperand.
255  ///
256  SDOperand getSetCC(MVT::ValueType VT, SDOperand LHS, SDOperand RHS,
257                     ISD::CondCode Cond) {
258    return getNode(ISD::SETCC, VT, LHS, RHS, getCondCode(Cond));
259  }
260
261  /// getSelectCC - Helper function to make it easier to build SelectCC's if you
262  /// just have an ISD::CondCode instead of an SDOperand.
263  ///
264  SDOperand getSelectCC(SDOperand LHS, SDOperand RHS,
265                        SDOperand True, SDOperand False, ISD::CondCode Cond) {
266    MVT::ValueType VT = True.getValueType();
267    return getNode(ISD::SELECT_CC, VT, LHS, RHS, True, False,getCondCode(Cond));
268  }
269
270  /// getBR2Way_CC - Helper function to make it easier to build BRTWOWAY_CC
271  /// nodes.
272  ///
273  SDOperand getBR2Way_CC(SDOperand Chain, SDOperand CCNode, SDOperand LHS,
274                         SDOperand RHS, SDOperand True, SDOperand False) {
275    std::vector<SDOperand> Ops;
276    Ops.push_back(Chain);
277    Ops.push_back(CCNode);
278    Ops.push_back(LHS);
279    Ops.push_back(RHS);
280    Ops.push_back(True);
281    Ops.push_back(False);
282    return getNode(ISD::BRTWOWAY_CC, MVT::Other, Ops);
283  }
284
285  /// getLoad - Loads are not normal binary operators: their result type is not
286  /// determined by their operands, and they produce a value AND a token chain.
287  ///
288  SDOperand getLoad(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr,
289                    SDOperand SV);
290  SDOperand getVecLoad(unsigned Count, MVT::ValueType VT, SDOperand Chain,
291                       SDOperand Ptr, SDOperand SV);
292  SDOperand getExtLoad(unsigned Opcode, MVT::ValueType VT, SDOperand Chain,
293                       SDOperand Ptr, SDOperand SV, MVT::ValueType EVT);
294
295  // getSrcValue - construct a node to track a Value* through the backend
296  SDOperand getSrcValue(const Value* I, int offset = 0);
297
298
299  /// SelectNodeTo - These are used for target selectors to *mutate* the
300  /// specified node to have the specified return type, Target opcode, and
301  /// operands.  Note that target opcodes are stored as
302  /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field.  The 0th value
303  /// of the resultant node is returned.
304  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT);
305  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
306                         SDOperand Op1);
307  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
308                         SDOperand Op1, SDOperand Op2);
309  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
310                         SDOperand Op1, SDOperand Op2, SDOperand Op3);
311  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
312                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
313                         SDOperand Op4);
314  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
315                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
316                         SDOperand Op4, SDOperand Op5);
317  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
318                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
319                         SDOperand Op4, SDOperand Op5, SDOperand Op6);
320  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
321                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
322  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
323                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
324                         SDOperand Op3);
325  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
326                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
327                         SDOperand Op3, SDOperand Op4);
328  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
329                         MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
330                         SDOperand Op3, SDOperand Op4, SDOperand Op5);
331
332  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT) {
333    return getNode(ISD::BUILTIN_OP_END+Opcode, VT);
334  }
335  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
336                          SDOperand Op1) {
337    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1);
338  }
339  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
340                          SDOperand Op1, SDOperand Op2) {
341    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2);
342  }
343  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
344                          SDOperand Op1, SDOperand Op2, SDOperand Op3) {
345    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3);
346  }
347  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
348                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
349                          SDOperand Op4) {
350    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4);
351  }
352  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
353                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
354                          SDOperand Op4, SDOperand Op5) {
355    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4, Op5);
356  }
357  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
358                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
359                          SDOperand Op4, SDOperand Op5, SDOperand Op6) {
360    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4, Op5, Op6);
361  }
362  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
363                          std::vector<SDOperand> &Ops) {
364    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
365  }
366  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
367                          MVT::ValueType VT2, SDOperand Op1) {
368    std::vector<MVT::ValueType> ResultTys;
369    ResultTys.push_back(VT1);
370    ResultTys.push_back(VT2);
371    std::vector<SDOperand> Ops;
372    Ops.push_back(Op1);
373    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
374  }
375  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
376                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2) {
377    std::vector<MVT::ValueType> ResultTys;
378    ResultTys.push_back(VT1);
379    ResultTys.push_back(VT2);
380    std::vector<SDOperand> Ops;
381    Ops.push_back(Op1);
382    Ops.push_back(Op2);
383    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
384  }
385  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
386                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
387                          SDOperand Op3) {
388    std::vector<MVT::ValueType> ResultTys;
389    ResultTys.push_back(VT1);
390    ResultTys.push_back(VT2);
391    std::vector<SDOperand> Ops;
392    Ops.push_back(Op1);
393    Ops.push_back(Op2);
394    Ops.push_back(Op3);
395    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
396  }
397  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
398                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
399                          SDOperand Op3, SDOperand Op4) {
400    std::vector<MVT::ValueType> ResultTys;
401    ResultTys.push_back(VT1);
402    ResultTys.push_back(VT2);
403    std::vector<SDOperand> Ops;
404    Ops.push_back(Op1);
405    Ops.push_back(Op2);
406    Ops.push_back(Op3);
407    Ops.push_back(Op4);
408    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
409  }
410  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
411                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
412                          SDOperand Op3, SDOperand Op4, SDOperand Op5) {
413    std::vector<MVT::ValueType> ResultTys;
414    ResultTys.push_back(VT1);
415    ResultTys.push_back(VT2);
416    std::vector<SDOperand> Ops;
417    Ops.push_back(Op1);
418    Ops.push_back(Op2);
419    Ops.push_back(Op3);
420    Ops.push_back(Op4);
421    Ops.push_back(Op5);
422    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
423  }
424  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
425                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
426                          SDOperand Op3, SDOperand Op4, SDOperand Op5,
427                          SDOperand Op6) {
428    std::vector<MVT::ValueType> ResultTys;
429    ResultTys.push_back(VT1);
430    ResultTys.push_back(VT2);
431    std::vector<SDOperand> Ops;
432    Ops.push_back(Op1);
433    Ops.push_back(Op2);
434    Ops.push_back(Op3);
435    Ops.push_back(Op4);
436    Ops.push_back(Op5);
437    Ops.push_back(Op6);
438    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
439  }
440  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
441                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
442                          SDOperand Op3, SDOperand Op4, SDOperand Op5,
443                          SDOperand Op6, SDOperand Op7) {
444    std::vector<MVT::ValueType> ResultTys;
445    ResultTys.push_back(VT1);
446    ResultTys.push_back(VT2);
447    std::vector<SDOperand> Ops;
448    Ops.push_back(Op1);
449    Ops.push_back(Op2);
450    Ops.push_back(Op3);
451    Ops.push_back(Op4);
452    Ops.push_back(Op5);
453    Ops.push_back(Op6);
454    Ops.push_back(Op7);
455   return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
456  }
457  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
458                          MVT::ValueType VT2, std::vector<SDOperand> &Ops) {
459    std::vector<MVT::ValueType> ResultTys;
460    ResultTys.push_back(VT1);
461    ResultTys.push_back(VT2);
462    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
463  }
464
465  /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
466  /// This can cause recursive merging of nodes in the DAG.  Use the first
467  /// version if 'From' is known to have a single result, use the second
468  /// if you have two nodes with identical results, use the third otherwise.
469  ///
470  /// These methods all take an optional vector, which (if not null) is
471  /// populated with any nodes that are deleted from the SelectionDAG, due to
472  /// new equivalences that are discovered.
473  ///
474  void ReplaceAllUsesWith(SDOperand From, SDOperand Op,
475                          std::vector<SDNode*> *Deleted = 0);
476  void ReplaceAllUsesWith(SDNode *From, SDNode *To,
477                          std::vector<SDNode*> *Deleted = 0);
478  void ReplaceAllUsesWith(SDNode *From, const std::vector<SDOperand> &To,
479                          std::vector<SDNode*> *Deleted = 0);
480
481
482  /// DeleteNode - Remove the specified node from the system.  This node must
483  /// have no referrers.
484  void DeleteNode(SDNode *N);
485
486  void dump() const;
487
488private:
489  void RemoveNodeFromCSEMaps(SDNode *N);
490  SDNode *AddNonLeafNodeToCSEMaps(SDNode *N);
491  void DestroyDeadNode(SDNode *N);
492  void DeleteNodeNotInCSEMaps(SDNode *N);
493  void setNodeValueTypes(SDNode *N, std::vector<MVT::ValueType> &RetVals);
494  void setNodeValueTypes(SDNode *N, MVT::ValueType VT1, MVT::ValueType VT2);
495
496
497  /// SimplifySetCC - Try to simplify a setcc built with the specified operands
498  /// and cc.  If unable to simplify it, return a null SDOperand.
499  SDOperand SimplifySetCC(MVT::ValueType VT, SDOperand N1,
500                          SDOperand N2, ISD::CondCode Cond);
501
502  // List of non-single value types.
503  std::list<std::vector<MVT::ValueType> > VTList;
504
505  // Maps to auto-CSE operations.
506  std::map<std::pair<unsigned, MVT::ValueType>, SDNode *> NullaryOps;
507  std::map<std::pair<unsigned, std::pair<SDOperand, MVT::ValueType> >,
508           SDNode *> UnaryOps;
509  std::map<std::pair<unsigned, std::pair<SDOperand, SDOperand> >,
510           SDNode *> BinaryOps;
511
512  std::map<std::pair<unsigned, MVT::ValueType>, RegisterSDNode*> RegNodes;
513  std::vector<CondCodeSDNode*> CondCodeNodes;
514
515  std::map<std::pair<SDOperand, std::pair<SDOperand, MVT::ValueType> >,
516           SDNode *> Loads;
517
518  std::map<std::pair<const GlobalValue*, int>, SDNode*> GlobalValues;
519  std::map<std::pair<const GlobalValue*, int>, SDNode*> TargetGlobalValues;
520  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> Constants;
521  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstants;
522  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
523  std::map<int, SDNode*> FrameIndices, TargetFrameIndices;
524  std::map<Constant *, SDNode*> ConstantPoolIndices;
525  std::map<Constant *, SDNode*> TargetConstantPoolIndices;
526  std::map<MachineBasicBlock *, SDNode*> BBNodes;
527  std::vector<SDNode*> ValueTypeNodes;
528  std::map<std::string, SDNode*> ExternalSymbols;
529  std::map<std::string, SDNode*> TargetExternalSymbols;
530  std::map<std::string, StringSDNode*> StringNodes;
531  std::map<std::pair<unsigned,
532                     std::pair<MVT::ValueType, std::vector<SDOperand> > >,
533           SDNode*> OneResultNodes;
534  std::map<std::pair<unsigned,
535                     std::pair<std::vector<MVT::ValueType>,
536                               std::vector<SDOperand> > >,
537           SDNode*> ArbitraryNodes;
538};
539
540template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
541  typedef SelectionDAG::allnodes_iterator nodes_iterator;
542  static nodes_iterator nodes_begin(SelectionDAG *G) {
543    return G->allnodes_begin();
544  }
545  static nodes_iterator nodes_end(SelectionDAG *G) {
546    return G->allnodes_end();
547  }
548};
549
550}  // end namespace llvm
551
552#endif
553