SelectionDAG.cpp revision fea997aac5773e936754de5436029c2a4fa1e930
1//===-- SelectionDAG.cpp - Implement the SelectionDAG data structures -----===//
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 implements the SelectionDAG class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/CodeGen/SelectionDAG.h"
15#include "llvm/Constants.h"
16#include "llvm/GlobalValue.h"
17#include "llvm/Intrinsics.h"
18#include "llvm/Assembly/Writer.h"
19#include "llvm/CodeGen/MachineBasicBlock.h"
20#include "llvm/CodeGen/MachineConstantPool.h"
21#include "llvm/Support/MathExtras.h"
22#include "llvm/Target/MRegisterInfo.h"
23#include "llvm/Target/TargetLowering.h"
24#include "llvm/Target/TargetInstrInfo.h"
25#include "llvm/Target/TargetMachine.h"
26#include "llvm/ADT/SetVector.h"
27#include "llvm/ADT/SmallVector.h"
28#include "llvm/ADT/StringExtras.h"
29#include <set>
30#include <algorithm>
31#include <cmath>
32using namespace llvm;
33
34/// makeVTList - Return an instance of the SDVTList struct initialized with the
35/// specified members.
36static SDVTList makeVTList(const MVT::ValueType *VTs, unsigned NumVTs) {
37  SDVTList Res = {VTs, NumVTs};
38  return Res;
39}
40
41//===----------------------------------------------------------------------===//
42//                              ConstantFPSDNode Class
43//===----------------------------------------------------------------------===//
44
45/// isExactlyValue - We don't rely on operator== working on double values, as
46/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
47/// As such, this method can be used to do an exact bit-for-bit comparison of
48/// two floating point values.
49bool ConstantFPSDNode::isExactlyValue(double V) const {
50  return DoubleToBits(V) == DoubleToBits(Value);
51}
52
53//===----------------------------------------------------------------------===//
54//                              ISD Namespace
55//===----------------------------------------------------------------------===//
56
57/// isBuildVectorAllOnes - Return true if the specified node is a
58/// BUILD_VECTOR where all of the elements are ~0 or undef.
59bool ISD::isBuildVectorAllOnes(const SDNode *N) {
60  // Look through a bit convert.
61  if (N->getOpcode() == ISD::BIT_CONVERT)
62    N = N->getOperand(0).Val;
63
64  if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
65
66  unsigned i = 0, e = N->getNumOperands();
67
68  // Skip over all of the undef values.
69  while (i != e && N->getOperand(i).getOpcode() == ISD::UNDEF)
70    ++i;
71
72  // Do not accept an all-undef vector.
73  if (i == e) return false;
74
75  // Do not accept build_vectors that aren't all constants or which have non-~0
76  // elements.
77  SDOperand NotZero = N->getOperand(i);
78  if (isa<ConstantSDNode>(NotZero)) {
79    if (!cast<ConstantSDNode>(NotZero)->isAllOnesValue())
80      return false;
81  } else if (isa<ConstantFPSDNode>(NotZero)) {
82    MVT::ValueType VT = NotZero.getValueType();
83    if (VT== MVT::f64) {
84      if (DoubleToBits(cast<ConstantFPSDNode>(NotZero)->getValue()) !=
85          (uint64_t)-1)
86        return false;
87    } else {
88      if (FloatToBits(cast<ConstantFPSDNode>(NotZero)->getValue()) !=
89          (uint32_t)-1)
90        return false;
91    }
92  } else
93    return false;
94
95  // Okay, we have at least one ~0 value, check to see if the rest match or are
96  // undefs.
97  for (++i; i != e; ++i)
98    if (N->getOperand(i) != NotZero &&
99        N->getOperand(i).getOpcode() != ISD::UNDEF)
100      return false;
101  return true;
102}
103
104
105/// isBuildVectorAllZeros - Return true if the specified node is a
106/// BUILD_VECTOR where all of the elements are 0 or undef.
107bool ISD::isBuildVectorAllZeros(const SDNode *N) {
108  // Look through a bit convert.
109  if (N->getOpcode() == ISD::BIT_CONVERT)
110    N = N->getOperand(0).Val;
111
112  if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
113
114  unsigned i = 0, e = N->getNumOperands();
115
116  // Skip over all of the undef values.
117  while (i != e && N->getOperand(i).getOpcode() == ISD::UNDEF)
118    ++i;
119
120  // Do not accept an all-undef vector.
121  if (i == e) return false;
122
123  // Do not accept build_vectors that aren't all constants or which have non-~0
124  // elements.
125  SDOperand Zero = N->getOperand(i);
126  if (isa<ConstantSDNode>(Zero)) {
127    if (!cast<ConstantSDNode>(Zero)->isNullValue())
128      return false;
129  } else if (isa<ConstantFPSDNode>(Zero)) {
130    if (!cast<ConstantFPSDNode>(Zero)->isExactlyValue(0.0))
131      return false;
132  } else
133    return false;
134
135  // Okay, we have at least one ~0 value, check to see if the rest match or are
136  // undefs.
137  for (++i; i != e; ++i)
138    if (N->getOperand(i) != Zero &&
139        N->getOperand(i).getOpcode() != ISD::UNDEF)
140      return false;
141  return true;
142}
143
144/// getSetCCSwappedOperands - Return the operation corresponding to (Y op X)
145/// when given the operation for (X op Y).
146ISD::CondCode ISD::getSetCCSwappedOperands(ISD::CondCode Operation) {
147  // To perform this operation, we just need to swap the L and G bits of the
148  // operation.
149  unsigned OldL = (Operation >> 2) & 1;
150  unsigned OldG = (Operation >> 1) & 1;
151  return ISD::CondCode((Operation & ~6) |  // Keep the N, U, E bits
152                       (OldL << 1) |       // New G bit
153                       (OldG << 2));        // New L bit.
154}
155
156/// getSetCCInverse - Return the operation corresponding to !(X op Y), where
157/// 'op' is a valid SetCC operation.
158ISD::CondCode ISD::getSetCCInverse(ISD::CondCode Op, bool isInteger) {
159  unsigned Operation = Op;
160  if (isInteger)
161    Operation ^= 7;   // Flip L, G, E bits, but not U.
162  else
163    Operation ^= 15;  // Flip all of the condition bits.
164  if (Operation > ISD::SETTRUE2)
165    Operation &= ~8;     // Don't let N and U bits get set.
166  return ISD::CondCode(Operation);
167}
168
169
170/// isSignedOp - For an integer comparison, return 1 if the comparison is a
171/// signed operation and 2 if the result is an unsigned comparison.  Return zero
172/// if the operation does not depend on the sign of the input (setne and seteq).
173static int isSignedOp(ISD::CondCode Opcode) {
174  switch (Opcode) {
175  default: assert(0 && "Illegal integer setcc operation!");
176  case ISD::SETEQ:
177  case ISD::SETNE: return 0;
178  case ISD::SETLT:
179  case ISD::SETLE:
180  case ISD::SETGT:
181  case ISD::SETGE: return 1;
182  case ISD::SETULT:
183  case ISD::SETULE:
184  case ISD::SETUGT:
185  case ISD::SETUGE: return 2;
186  }
187}
188
189/// getSetCCOrOperation - Return the result of a logical OR between different
190/// comparisons of identical values: ((X op1 Y) | (X op2 Y)).  This function
191/// returns SETCC_INVALID if it is not possible to represent the resultant
192/// comparison.
193ISD::CondCode ISD::getSetCCOrOperation(ISD::CondCode Op1, ISD::CondCode Op2,
194                                       bool isInteger) {
195  if (isInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
196    // Cannot fold a signed integer setcc with an unsigned integer setcc.
197    return ISD::SETCC_INVALID;
198
199  unsigned Op = Op1 | Op2;  // Combine all of the condition bits.
200
201  // If the N and U bits get set then the resultant comparison DOES suddenly
202  // care about orderedness, and is true when ordered.
203  if (Op > ISD::SETTRUE2)
204    Op &= ~16;     // Clear the U bit if the N bit is set.
205
206  // Canonicalize illegal integer setcc's.
207  if (isInteger && Op == ISD::SETUNE)  // e.g. SETUGT | SETULT
208    Op = ISD::SETNE;
209
210  return ISD::CondCode(Op);
211}
212
213/// getSetCCAndOperation - Return the result of a logical AND between different
214/// comparisons of identical values: ((X op1 Y) & (X op2 Y)).  This
215/// function returns zero if it is not possible to represent the resultant
216/// comparison.
217ISD::CondCode ISD::getSetCCAndOperation(ISD::CondCode Op1, ISD::CondCode Op2,
218                                        bool isInteger) {
219  if (isInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
220    // Cannot fold a signed setcc with an unsigned setcc.
221    return ISD::SETCC_INVALID;
222
223  // Combine all of the condition bits.
224  ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
225
226  // Canonicalize illegal integer setcc's.
227  if (isInteger) {
228    switch (Result) {
229    default: break;
230    case ISD::SETUO : Result = ISD::SETFALSE; break;  // SETUGT & SETULT
231    case ISD::SETUEQ: Result = ISD::SETEQ   ; break;  // SETUGE & SETULE
232    case ISD::SETOLT: Result = ISD::SETULT  ; break;  // SETULT & SETNE
233    case ISD::SETOGT: Result = ISD::SETUGT  ; break;  // SETUGT & SETNE
234    }
235  }
236
237  return Result;
238}
239
240const TargetMachine &SelectionDAG::getTarget() const {
241  return TLI.getTargetMachine();
242}
243
244//===----------------------------------------------------------------------===//
245//                           SDNode Profile Support
246//===----------------------------------------------------------------------===//
247
248/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
249///
250static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)  {
251  ID.AddInteger(OpC);
252}
253
254/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
255/// solely with their pointer.
256void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList) {
257  ID.AddPointer(VTList.VTs);
258}
259
260/// AddNodeIDOperand - Add an operands data to the NodeID data.
261///
262static void AddNodeIDOperand(FoldingSetNodeID &ID, SDOperand Op) {
263  ID.AddPointer(Op.Val);
264  ID.AddInteger(Op.ResNo);
265}
266
267/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
268///
269static void AddNodeIDOperands(FoldingSetNodeID &ID) {
270}
271static void AddNodeIDOperands(FoldingSetNodeID &ID, SDOperand Op) {
272  AddNodeIDOperand(ID, Op);
273}
274static void AddNodeIDOperands(FoldingSetNodeID &ID,
275                             SDOperand Op1, SDOperand Op2) {
276  AddNodeIDOperand(ID, Op1);
277  AddNodeIDOperand(ID, Op2);
278}
279static void AddNodeIDOperands(FoldingSetNodeID &ID,
280                              SDOperand Op1, SDOperand Op2, SDOperand Op3) {
281  AddNodeIDOperand(ID, Op1);
282  AddNodeIDOperand(ID, Op2);
283  AddNodeIDOperand(ID, Op3);
284}
285static void AddNodeIDOperands(FoldingSetNodeID &ID,
286                              const SDOperand *Ops, unsigned NumOps) {
287  for (; NumOps; --NumOps, ++Ops)
288    AddNodeIDOperand(ID, *Ops);
289}
290
291/// AddNodeIDOperands - Various routines for adding node info to the NodeID
292/// data.
293static void AddNodeIDNode(FoldingSetNodeID &ID,
294                          unsigned short OpC, SDVTList VTList) {
295  AddNodeIDOpcode(ID, OpC);
296  AddNodeIDValueTypes(ID, VTList);
297  AddNodeIDOperands(ID);
298}
299static void AddNodeIDNode(FoldingSetNodeID &ID,
300                          unsigned short OpC, SDVTList VTList,
301                          SDOperand Op) {
302  AddNodeIDOpcode(ID, OpC);
303  AddNodeIDValueTypes(ID, VTList);
304  AddNodeIDOperands(ID, Op);
305}
306static void AddNodeIDNode(FoldingSetNodeID &ID,
307                          unsigned short OpC, SDVTList VTList,
308                          SDOperand Op1, SDOperand Op2) {
309  AddNodeIDOpcode(ID, OpC);
310  AddNodeIDValueTypes(ID, VTList);
311  AddNodeIDOperands(ID, Op1, Op2);
312}
313static void AddNodeIDNode(FoldingSetNodeID &ID,
314                          unsigned short OpC, SDVTList VTList,
315                          SDOperand Op1, SDOperand Op2, SDOperand Op3) {
316  AddNodeIDOpcode(ID, OpC);
317  AddNodeIDValueTypes(ID, VTList);
318  AddNodeIDOperands(ID, Op1, Op2, Op3);
319}
320static void AddNodeIDNode(FoldingSetNodeID &ID,
321                          unsigned short OpC, SDVTList VTList,
322                          const SDOperand *OpList, unsigned N) {
323  AddNodeIDOpcode(ID, OpC);
324  AddNodeIDValueTypes(ID, VTList);
325  AddNodeIDOperands(ID, OpList, N);
326}
327
328/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
329/// data.
330static void AddNodeIDNode(FoldingSetNodeID &ID, SDNode *N) {
331  AddNodeIDOpcode(ID, N->getOpcode());
332  // Add the return value info.
333  AddNodeIDValueTypes(ID, N->getVTList());
334  // Add the operand info.
335  AddNodeIDOperands(ID, N->op_begin(), N->getNumOperands());
336
337  // Handle SDNode leafs with special info.
338  if (N->getNumOperands() == 0) {
339    switch (N->getOpcode()) {
340    default: break;  // Normal nodes don't need extra info.
341    case ISD::TargetConstant:
342    case ISD::Constant:
343      ID.AddInteger(cast<ConstantSDNode>(N)->getValue());
344      break;
345    case ISD::TargetConstantFP:
346    case ISD::ConstantFP:
347      ID.AddDouble(cast<ConstantFPSDNode>(N)->getValue());
348      break;
349    case ISD::TargetGlobalAddress:
350    case ISD::GlobalAddress: {
351      GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(N);
352      ID.AddPointer(GA->getGlobal());
353      ID.AddInteger(GA->getOffset());
354      break;
355    }
356    case ISD::BasicBlock:
357      ID.AddPointer(cast<BasicBlockSDNode>(N)->getBasicBlock());
358      break;
359    case ISD::Register:
360      ID.AddInteger(cast<RegisterSDNode>(N)->getReg());
361      break;
362    case ISD::SRCVALUE: {
363      SrcValueSDNode *SV = cast<SrcValueSDNode>(N);
364      ID.AddPointer(SV->getValue());
365      ID.AddInteger(SV->getOffset());
366      break;
367    }
368    case ISD::FrameIndex:
369    case ISD::TargetFrameIndex:
370      ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
371      break;
372    case ISD::JumpTable:
373    case ISD::TargetJumpTable:
374      ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
375      break;
376    case ISD::ConstantPool:
377    case ISD::TargetConstantPool: {
378      ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(N);
379      ID.AddInteger(CP->getAlignment());
380      ID.AddInteger(CP->getOffset());
381      if (CP->isMachineConstantPoolEntry())
382        CP->getMachineCPVal()->AddSelectionDAGCSEId(ID);
383      else
384        ID.AddPointer(CP->getConstVal());
385      break;
386    }
387    case ISD::LOAD: {
388      LoadSDNode *LD = cast<LoadSDNode>(N);
389      ID.AddInteger(LD->getAddressingMode());
390      ID.AddInteger(LD->getExtensionType());
391      ID.AddInteger(LD->getLoadedVT());
392      ID.AddPointer(LD->getSrcValue());
393      ID.AddInteger(LD->getSrcValueOffset());
394      ID.AddInteger(LD->getAlignment());
395      ID.AddInteger(LD->isVolatile());
396      break;
397    }
398    case ISD::STORE: {
399      StoreSDNode *ST = cast<StoreSDNode>(N);
400      ID.AddInteger(ST->getAddressingMode());
401      ID.AddInteger(ST->isTruncatingStore());
402      ID.AddInteger(ST->getStoredVT());
403      ID.AddPointer(ST->getSrcValue());
404      ID.AddInteger(ST->getSrcValueOffset());
405      ID.AddInteger(ST->getAlignment());
406      ID.AddInteger(ST->isVolatile());
407      break;
408    }
409    }
410  }
411}
412
413//===----------------------------------------------------------------------===//
414//                              SelectionDAG Class
415//===----------------------------------------------------------------------===//
416
417/// RemoveDeadNodes - This method deletes all unreachable nodes in the
418/// SelectionDAG.
419void SelectionDAG::RemoveDeadNodes() {
420  // Create a dummy node (which is not added to allnodes), that adds a reference
421  // to the root node, preventing it from being deleted.
422  HandleSDNode Dummy(getRoot());
423
424  SmallVector<SDNode*, 128> DeadNodes;
425
426  // Add all obviously-dead nodes to the DeadNodes worklist.
427  for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ++I)
428    if (I->use_empty())
429      DeadNodes.push_back(I);
430
431  // Process the worklist, deleting the nodes and adding their uses to the
432  // worklist.
433  while (!DeadNodes.empty()) {
434    SDNode *N = DeadNodes.back();
435    DeadNodes.pop_back();
436
437    // Take the node out of the appropriate CSE map.
438    RemoveNodeFromCSEMaps(N);
439
440    // Next, brutally remove the operand list.  This is safe to do, as there are
441    // no cycles in the graph.
442    for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I) {
443      SDNode *Operand = I->Val;
444      Operand->removeUser(N);
445
446      // Now that we removed this operand, see if there are no uses of it left.
447      if (Operand->use_empty())
448        DeadNodes.push_back(Operand);
449    }
450    delete[] N->OperandList;
451    N->OperandList = 0;
452    N->NumOperands = 0;
453
454    // Finally, remove N itself.
455    AllNodes.erase(N);
456  }
457
458  // If the root changed (e.g. it was a dead load, update the root).
459  setRoot(Dummy.getValue());
460}
461
462void SelectionDAG::RemoveDeadNode(SDNode *N, std::vector<SDNode*> &Deleted) {
463  SmallVector<SDNode*, 16> DeadNodes;
464  DeadNodes.push_back(N);
465
466  // Process the worklist, deleting the nodes and adding their uses to the
467  // worklist.
468  while (!DeadNodes.empty()) {
469    SDNode *N = DeadNodes.back();
470    DeadNodes.pop_back();
471
472    // Take the node out of the appropriate CSE map.
473    RemoveNodeFromCSEMaps(N);
474
475    // Next, brutally remove the operand list.  This is safe to do, as there are
476    // no cycles in the graph.
477    for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I) {
478      SDNode *Operand = I->Val;
479      Operand->removeUser(N);
480
481      // Now that we removed this operand, see if there are no uses of it left.
482      if (Operand->use_empty())
483        DeadNodes.push_back(Operand);
484    }
485    delete[] N->OperandList;
486    N->OperandList = 0;
487    N->NumOperands = 0;
488
489    // Finally, remove N itself.
490    Deleted.push_back(N);
491    AllNodes.erase(N);
492  }
493}
494
495void SelectionDAG::DeleteNode(SDNode *N) {
496  assert(N->use_empty() && "Cannot delete a node that is not dead!");
497
498  // First take this out of the appropriate CSE map.
499  RemoveNodeFromCSEMaps(N);
500
501  // Finally, remove uses due to operands of this node, remove from the
502  // AllNodes list, and delete the node.
503  DeleteNodeNotInCSEMaps(N);
504}
505
506void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
507
508  // Remove it from the AllNodes list.
509  AllNodes.remove(N);
510
511  // Drop all of the operands and decrement used nodes use counts.
512  for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I)
513    I->Val->removeUser(N);
514  delete[] N->OperandList;
515  N->OperandList = 0;
516  N->NumOperands = 0;
517
518  delete N;
519}
520
521/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
522/// correspond to it.  This is useful when we're about to delete or repurpose
523/// the node.  We don't want future request for structurally identical nodes
524/// to return N anymore.
525void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
526  bool Erased = false;
527  switch (N->getOpcode()) {
528  case ISD::HANDLENODE: return;  // noop.
529  case ISD::STRING:
530    Erased = StringNodes.erase(cast<StringSDNode>(N)->getValue());
531    break;
532  case ISD::CONDCODE:
533    assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
534           "Cond code doesn't exist!");
535    Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != 0;
536    CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = 0;
537    break;
538  case ISD::ExternalSymbol:
539    Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
540    break;
541  case ISD::TargetExternalSymbol:
542    Erased =
543      TargetExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
544    break;
545  case ISD::VALUETYPE:
546    Erased = ValueTypeNodes[cast<VTSDNode>(N)->getVT()] != 0;
547    ValueTypeNodes[cast<VTSDNode>(N)->getVT()] = 0;
548    break;
549  default:
550    // Remove it from the CSE Map.
551    Erased = CSEMap.RemoveNode(N);
552    break;
553  }
554#ifndef NDEBUG
555  // Verify that the node was actually in one of the CSE maps, unless it has a
556  // flag result (which cannot be CSE'd) or is one of the special cases that are
557  // not subject to CSE.
558  if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Flag &&
559      !N->isTargetOpcode()) {
560    N->dump();
561    cerr << "\n";
562    assert(0 && "Node is not in map!");
563  }
564#endif
565}
566
567/// AddNonLeafNodeToCSEMaps - Add the specified node back to the CSE maps.  It
568/// has been taken out and modified in some way.  If the specified node already
569/// exists in the CSE maps, do not modify the maps, but return the existing node
570/// instead.  If it doesn't exist, add it and return null.
571///
572SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
573  assert(N->getNumOperands() && "This is a leaf node!");
574  if (N->getOpcode() == ISD::HANDLENODE || N->getValueType(0) == MVT::Flag)
575    return 0;    // Never add these nodes.
576
577  // Check that remaining values produced are not flags.
578  for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
579    if (N->getValueType(i) == MVT::Flag)
580      return 0;   // Never CSE anything that produces a flag.
581
582  SDNode *New = CSEMap.GetOrInsertNode(N);
583  if (New != N) return New;  // Node already existed.
584  return 0;
585}
586
587/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
588/// were replaced with those specified.  If this node is never memoized,
589/// return null, otherwise return a pointer to the slot it would take.  If a
590/// node already exists with these operands, the slot will be non-null.
591SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDOperand Op,
592                                           void *&InsertPos) {
593  if (N->getOpcode() == ISD::HANDLENODE || N->getValueType(0) == MVT::Flag)
594    return 0;    // Never add these nodes.
595
596  // Check that remaining values produced are not flags.
597  for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
598    if (N->getValueType(i) == MVT::Flag)
599      return 0;   // Never CSE anything that produces a flag.
600
601  FoldingSetNodeID ID;
602  AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Op);
603  return CSEMap.FindNodeOrInsertPos(ID, InsertPos);
604}
605
606/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
607/// were replaced with those specified.  If this node is never memoized,
608/// return null, otherwise return a pointer to the slot it would take.  If a
609/// node already exists with these operands, the slot will be non-null.
610SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
611                                           SDOperand Op1, SDOperand Op2,
612                                           void *&InsertPos) {
613  if (N->getOpcode() == ISD::HANDLENODE || N->getValueType(0) == MVT::Flag)
614    return 0;    // Never add these nodes.
615
616  // Check that remaining values produced are not flags.
617  for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
618    if (N->getValueType(i) == MVT::Flag)
619      return 0;   // Never CSE anything that produces a flag.
620
621  FoldingSetNodeID ID;
622  AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Op1, Op2);
623  return CSEMap.FindNodeOrInsertPos(ID, InsertPos);
624}
625
626
627/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
628/// were replaced with those specified.  If this node is never memoized,
629/// return null, otherwise return a pointer to the slot it would take.  If a
630/// node already exists with these operands, the slot will be non-null.
631SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
632                                           const SDOperand *Ops,unsigned NumOps,
633                                           void *&InsertPos) {
634  if (N->getOpcode() == ISD::HANDLENODE || N->getValueType(0) == MVT::Flag)
635    return 0;    // Never add these nodes.
636
637  // Check that remaining values produced are not flags.
638  for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
639    if (N->getValueType(i) == MVT::Flag)
640      return 0;   // Never CSE anything that produces a flag.
641
642  FoldingSetNodeID ID;
643  AddNodeIDNode(ID, N->getOpcode(), N->getVTList());
644
645  if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(N)) {
646    ID.AddInteger(LD->getAddressingMode());
647    ID.AddInteger(LD->getExtensionType());
648    ID.AddInteger(LD->getLoadedVT());
649    ID.AddPointer(LD->getSrcValue());
650    ID.AddInteger(LD->getSrcValueOffset());
651    ID.AddInteger(LD->getAlignment());
652    ID.AddInteger(LD->isVolatile());
653  } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) {
654    ID.AddInteger(ST->getAddressingMode());
655    ID.AddInteger(ST->isTruncatingStore());
656    ID.AddInteger(ST->getStoredVT());
657    ID.AddPointer(ST->getSrcValue());
658    ID.AddInteger(ST->getSrcValueOffset());
659    ID.AddInteger(ST->getAlignment());
660    ID.AddInteger(ST->isVolatile());
661  }
662
663  AddNodeIDOperands(ID, Ops, NumOps);
664  return CSEMap.FindNodeOrInsertPos(ID, InsertPos);
665}
666
667
668SelectionDAG::~SelectionDAG() {
669  while (!AllNodes.empty()) {
670    SDNode *N = AllNodes.begin();
671    N->SetNextInBucket(0);
672    delete [] N->OperandList;
673    N->OperandList = 0;
674    N->NumOperands = 0;
675    AllNodes.pop_front();
676  }
677}
678
679SDOperand SelectionDAG::getZeroExtendInReg(SDOperand Op, MVT::ValueType VT) {
680  if (Op.getValueType() == VT) return Op;
681  int64_t Imm = ~0ULL >> (64-MVT::getSizeInBits(VT));
682  return getNode(ISD::AND, Op.getValueType(), Op,
683                 getConstant(Imm, Op.getValueType()));
684}
685
686SDOperand SelectionDAG::getString(const std::string &Val) {
687  StringSDNode *&N = StringNodes[Val];
688  if (!N) {
689    N = new StringSDNode(Val);
690    AllNodes.push_back(N);
691  }
692  return SDOperand(N, 0);
693}
694
695SDOperand SelectionDAG::getConstant(uint64_t Val, MVT::ValueType VT, bool isT) {
696  assert(MVT::isInteger(VT) && "Cannot create FP integer constant!");
697  assert(!MVT::isVector(VT) && "Cannot create Vector ConstantSDNodes!");
698
699  // Mask out any bits that are not valid for this constant.
700  Val &= MVT::getIntVTBitMask(VT);
701
702  unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
703  FoldingSetNodeID ID;
704  AddNodeIDNode(ID, Opc, getVTList(VT));
705  ID.AddInteger(Val);
706  void *IP = 0;
707  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
708    return SDOperand(E, 0);
709  SDNode *N = new ConstantSDNode(isT, Val, VT);
710  CSEMap.InsertNode(N, IP);
711  AllNodes.push_back(N);
712  return SDOperand(N, 0);
713}
714
715
716SDOperand SelectionDAG::getConstantFP(double Val, MVT::ValueType VT,
717                                      bool isTarget) {
718  assert(MVT::isFloatingPoint(VT) && "Cannot create integer FP constant!");
719  if (VT == MVT::f32)
720    Val = (float)Val;  // Mask out extra precision.
721
722  // Do the map lookup using the actual bit pattern for the floating point
723  // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
724  // we don't have issues with SNANs.
725  unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
726  FoldingSetNodeID ID;
727  AddNodeIDNode(ID, Opc, getVTList(VT));
728  ID.AddDouble(Val);
729  void *IP = 0;
730  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
731    return SDOperand(E, 0);
732  SDNode *N = new ConstantFPSDNode(isTarget, Val, VT);
733  CSEMap.InsertNode(N, IP);
734  AllNodes.push_back(N);
735  return SDOperand(N, 0);
736}
737
738SDOperand SelectionDAG::getGlobalAddress(const GlobalValue *GV,
739                                         MVT::ValueType VT, int Offset,
740                                         bool isTargetGA) {
741  unsigned Opc = isTargetGA ? ISD::TargetGlobalAddress : ISD::GlobalAddress;
742  FoldingSetNodeID ID;
743  AddNodeIDNode(ID, Opc, getVTList(VT));
744  ID.AddPointer(GV);
745  ID.AddInteger(Offset);
746  void *IP = 0;
747  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
748   return SDOperand(E, 0);
749  SDNode *N = new GlobalAddressSDNode(isTargetGA, GV, VT, Offset);
750  CSEMap.InsertNode(N, IP);
751  AllNodes.push_back(N);
752  return SDOperand(N, 0);
753}
754
755SDOperand SelectionDAG::getFrameIndex(int FI, MVT::ValueType VT,
756                                      bool isTarget) {
757  unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
758  FoldingSetNodeID ID;
759  AddNodeIDNode(ID, Opc, getVTList(VT));
760  ID.AddInteger(FI);
761  void *IP = 0;
762  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
763    return SDOperand(E, 0);
764  SDNode *N = new FrameIndexSDNode(FI, VT, isTarget);
765  CSEMap.InsertNode(N, IP);
766  AllNodes.push_back(N);
767  return SDOperand(N, 0);
768}
769
770SDOperand SelectionDAG::getJumpTable(int JTI, MVT::ValueType VT, bool isTarget){
771  unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
772  FoldingSetNodeID ID;
773  AddNodeIDNode(ID, Opc, getVTList(VT));
774  ID.AddInteger(JTI);
775  void *IP = 0;
776  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
777    return SDOperand(E, 0);
778  SDNode *N = new JumpTableSDNode(JTI, VT, isTarget);
779  CSEMap.InsertNode(N, IP);
780  AllNodes.push_back(N);
781  return SDOperand(N, 0);
782}
783
784SDOperand SelectionDAG::getConstantPool(Constant *C, MVT::ValueType VT,
785                                        unsigned Alignment, int Offset,
786                                        bool isTarget) {
787  unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
788  FoldingSetNodeID ID;
789  AddNodeIDNode(ID, Opc, getVTList(VT));
790  ID.AddInteger(Alignment);
791  ID.AddInteger(Offset);
792  ID.AddPointer(C);
793  void *IP = 0;
794  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
795    return SDOperand(E, 0);
796  SDNode *N = new ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment);
797  CSEMap.InsertNode(N, IP);
798  AllNodes.push_back(N);
799  return SDOperand(N, 0);
800}
801
802
803SDOperand SelectionDAG::getConstantPool(MachineConstantPoolValue *C,
804                                        MVT::ValueType VT,
805                                        unsigned Alignment, int Offset,
806                                        bool isTarget) {
807  unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
808  FoldingSetNodeID ID;
809  AddNodeIDNode(ID, Opc, getVTList(VT));
810  ID.AddInteger(Alignment);
811  ID.AddInteger(Offset);
812  C->AddSelectionDAGCSEId(ID);
813  void *IP = 0;
814  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
815    return SDOperand(E, 0);
816  SDNode *N = new ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment);
817  CSEMap.InsertNode(N, IP);
818  AllNodes.push_back(N);
819  return SDOperand(N, 0);
820}
821
822
823SDOperand SelectionDAG::getBasicBlock(MachineBasicBlock *MBB) {
824  FoldingSetNodeID ID;
825  AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other));
826  ID.AddPointer(MBB);
827  void *IP = 0;
828  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
829    return SDOperand(E, 0);
830  SDNode *N = new BasicBlockSDNode(MBB);
831  CSEMap.InsertNode(N, IP);
832  AllNodes.push_back(N);
833  return SDOperand(N, 0);
834}
835
836SDOperand SelectionDAG::getValueType(MVT::ValueType VT) {
837  if ((unsigned)VT >= ValueTypeNodes.size())
838    ValueTypeNodes.resize(VT+1);
839  if (ValueTypeNodes[VT] == 0) {
840    ValueTypeNodes[VT] = new VTSDNode(VT);
841    AllNodes.push_back(ValueTypeNodes[VT]);
842  }
843
844  return SDOperand(ValueTypeNodes[VT], 0);
845}
846
847SDOperand SelectionDAG::getExternalSymbol(const char *Sym, MVT::ValueType VT) {
848  SDNode *&N = ExternalSymbols[Sym];
849  if (N) return SDOperand(N, 0);
850  N = new ExternalSymbolSDNode(false, Sym, VT);
851  AllNodes.push_back(N);
852  return SDOperand(N, 0);
853}
854
855SDOperand SelectionDAG::getTargetExternalSymbol(const char *Sym,
856                                                MVT::ValueType VT) {
857  SDNode *&N = TargetExternalSymbols[Sym];
858  if (N) return SDOperand(N, 0);
859  N = new ExternalSymbolSDNode(true, Sym, VT);
860  AllNodes.push_back(N);
861  return SDOperand(N, 0);
862}
863
864SDOperand SelectionDAG::getCondCode(ISD::CondCode Cond) {
865  if ((unsigned)Cond >= CondCodeNodes.size())
866    CondCodeNodes.resize(Cond+1);
867
868  if (CondCodeNodes[Cond] == 0) {
869    CondCodeNodes[Cond] = new CondCodeSDNode(Cond);
870    AllNodes.push_back(CondCodeNodes[Cond]);
871  }
872  return SDOperand(CondCodeNodes[Cond], 0);
873}
874
875SDOperand SelectionDAG::getRegister(unsigned RegNo, MVT::ValueType VT) {
876  FoldingSetNodeID ID;
877  AddNodeIDNode(ID, ISD::Register, getVTList(VT));
878  ID.AddInteger(RegNo);
879  void *IP = 0;
880  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
881    return SDOperand(E, 0);
882  SDNode *N = new RegisterSDNode(RegNo, VT);
883  CSEMap.InsertNode(N, IP);
884  AllNodes.push_back(N);
885  return SDOperand(N, 0);
886}
887
888SDOperand SelectionDAG::getSrcValue(const Value *V, int Offset) {
889  assert((!V || isa<PointerType>(V->getType())) &&
890         "SrcValue is not a pointer?");
891
892  FoldingSetNodeID ID;
893  AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other));
894  ID.AddPointer(V);
895  ID.AddInteger(Offset);
896  void *IP = 0;
897  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
898    return SDOperand(E, 0);
899  SDNode *N = new SrcValueSDNode(V, Offset);
900  CSEMap.InsertNode(N, IP);
901  AllNodes.push_back(N);
902  return SDOperand(N, 0);
903}
904
905SDOperand SelectionDAG::FoldSetCC(MVT::ValueType VT, SDOperand N1,
906                                  SDOperand N2, ISD::CondCode Cond) {
907  // These setcc operations always fold.
908  switch (Cond) {
909  default: break;
910  case ISD::SETFALSE:
911  case ISD::SETFALSE2: return getConstant(0, VT);
912  case ISD::SETTRUE:
913  case ISD::SETTRUE2:  return getConstant(1, VT);
914
915  case ISD::SETOEQ:
916  case ISD::SETOGT:
917  case ISD::SETOGE:
918  case ISD::SETOLT:
919  case ISD::SETOLE:
920  case ISD::SETONE:
921  case ISD::SETO:
922  case ISD::SETUO:
923  case ISD::SETUEQ:
924  case ISD::SETUNE:
925    assert(!MVT::isInteger(N1.getValueType()) && "Illegal setcc for integer!");
926    break;
927  }
928
929  if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.Val)) {
930    uint64_t C2 = N2C->getValue();
931    if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.Val)) {
932      uint64_t C1 = N1C->getValue();
933
934      // Sign extend the operands if required
935      if (ISD::isSignedIntSetCC(Cond)) {
936        C1 = N1C->getSignExtended();
937        C2 = N2C->getSignExtended();
938      }
939
940      switch (Cond) {
941      default: assert(0 && "Unknown integer setcc!");
942      case ISD::SETEQ:  return getConstant(C1 == C2, VT);
943      case ISD::SETNE:  return getConstant(C1 != C2, VT);
944      case ISD::SETULT: return getConstant(C1 <  C2, VT);
945      case ISD::SETUGT: return getConstant(C1 >  C2, VT);
946      case ISD::SETULE: return getConstant(C1 <= C2, VT);
947      case ISD::SETUGE: return getConstant(C1 >= C2, VT);
948      case ISD::SETLT:  return getConstant((int64_t)C1 <  (int64_t)C2, VT);
949      case ISD::SETGT:  return getConstant((int64_t)C1 >  (int64_t)C2, VT);
950      case ISD::SETLE:  return getConstant((int64_t)C1 <= (int64_t)C2, VT);
951      case ISD::SETGE:  return getConstant((int64_t)C1 >= (int64_t)C2, VT);
952      }
953    }
954  }
955  if (ConstantFPSDNode *N1C = dyn_cast<ConstantFPSDNode>(N1.Val))
956    if (ConstantFPSDNode *N2C = dyn_cast<ConstantFPSDNode>(N2.Val)) {
957      double C1 = N1C->getValue(), C2 = N2C->getValue();
958
959      switch (Cond) {
960      default: break; // FIXME: Implement the rest of these!
961      case ISD::SETEQ:  return getConstant(C1 == C2, VT);
962      case ISD::SETNE:  return getConstant(C1 != C2, VT);
963      case ISD::SETLT:  return getConstant(C1 < C2, VT);
964      case ISD::SETGT:  return getConstant(C1 > C2, VT);
965      case ISD::SETLE:  return getConstant(C1 <= C2, VT);
966      case ISD::SETGE:  return getConstant(C1 >= C2, VT);
967      }
968    } else {
969      // Ensure that the constant occurs on the RHS.
970      return getSetCC(VT, N2, N1, ISD::getSetCCSwappedOperands(Cond));
971    }
972
973  // Could not fold it.
974  return SDOperand();
975}
976
977
978/// getNode - Gets or creates the specified node.
979///
980SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT) {
981  FoldingSetNodeID ID;
982  AddNodeIDNode(ID, Opcode, getVTList(VT));
983  void *IP = 0;
984  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
985    return SDOperand(E, 0);
986  SDNode *N = new SDNode(Opcode, VT);
987  CSEMap.InsertNode(N, IP);
988
989  AllNodes.push_back(N);
990  return SDOperand(N, 0);
991}
992
993SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
994                                SDOperand Operand) {
995  unsigned Tmp1;
996  // Constant fold unary operations with an integer constant operand.
997  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Operand.Val)) {
998    uint64_t Val = C->getValue();
999    switch (Opcode) {
1000    default: break;
1001    case ISD::SIGN_EXTEND: return getConstant(C->getSignExtended(), VT);
1002    case ISD::ANY_EXTEND:
1003    case ISD::ZERO_EXTEND: return getConstant(Val, VT);
1004    case ISD::TRUNCATE:    return getConstant(Val, VT);
1005    case ISD::SINT_TO_FP:  return getConstantFP(C->getSignExtended(), VT);
1006    case ISD::UINT_TO_FP:  return getConstantFP(C->getValue(), VT);
1007    case ISD::BIT_CONVERT:
1008      if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
1009        return getConstantFP(BitsToFloat(Val), VT);
1010      else if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
1011        return getConstantFP(BitsToDouble(Val), VT);
1012      break;
1013    case ISD::BSWAP:
1014      switch(VT) {
1015      default: assert(0 && "Invalid bswap!"); break;
1016      case MVT::i16: return getConstant(ByteSwap_16((unsigned short)Val), VT);
1017      case MVT::i32: return getConstant(ByteSwap_32((unsigned)Val), VT);
1018      case MVT::i64: return getConstant(ByteSwap_64(Val), VT);
1019      }
1020      break;
1021    case ISD::CTPOP:
1022      switch(VT) {
1023      default: assert(0 && "Invalid ctpop!"); break;
1024      case MVT::i1: return getConstant(Val != 0, VT);
1025      case MVT::i8:
1026        Tmp1 = (unsigned)Val & 0xFF;
1027        return getConstant(CountPopulation_32(Tmp1), VT);
1028      case MVT::i16:
1029        Tmp1 = (unsigned)Val & 0xFFFF;
1030        return getConstant(CountPopulation_32(Tmp1), VT);
1031      case MVT::i32:
1032        return getConstant(CountPopulation_32((unsigned)Val), VT);
1033      case MVT::i64:
1034        return getConstant(CountPopulation_64(Val), VT);
1035      }
1036    case ISD::CTLZ:
1037      switch(VT) {
1038      default: assert(0 && "Invalid ctlz!"); break;
1039      case MVT::i1: return getConstant(Val == 0, VT);
1040      case MVT::i8:
1041        Tmp1 = (unsigned)Val & 0xFF;
1042        return getConstant(CountLeadingZeros_32(Tmp1)-24, VT);
1043      case MVT::i16:
1044        Tmp1 = (unsigned)Val & 0xFFFF;
1045        return getConstant(CountLeadingZeros_32(Tmp1)-16, VT);
1046      case MVT::i32:
1047        return getConstant(CountLeadingZeros_32((unsigned)Val), VT);
1048      case MVT::i64:
1049        return getConstant(CountLeadingZeros_64(Val), VT);
1050      }
1051    case ISD::CTTZ:
1052      switch(VT) {
1053      default: assert(0 && "Invalid cttz!"); break;
1054      case MVT::i1: return getConstant(Val == 0, VT);
1055      case MVT::i8:
1056        Tmp1 = (unsigned)Val | 0x100;
1057        return getConstant(CountTrailingZeros_32(Tmp1), VT);
1058      case MVT::i16:
1059        Tmp1 = (unsigned)Val | 0x10000;
1060        return getConstant(CountTrailingZeros_32(Tmp1), VT);
1061      case MVT::i32:
1062        return getConstant(CountTrailingZeros_32((unsigned)Val), VT);
1063      case MVT::i64:
1064        return getConstant(CountTrailingZeros_64(Val), VT);
1065      }
1066    }
1067  }
1068
1069  // Constant fold unary operations with an floating point constant operand.
1070  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Operand.Val))
1071    switch (Opcode) {
1072    case ISD::FNEG:
1073      return getConstantFP(-C->getValue(), VT);
1074    case ISD::FABS:
1075      return getConstantFP(fabs(C->getValue()), VT);
1076    case ISD::FP_ROUND:
1077    case ISD::FP_EXTEND:
1078      return getConstantFP(C->getValue(), VT);
1079    case ISD::FP_TO_SINT:
1080      return getConstant((int64_t)C->getValue(), VT);
1081    case ISD::FP_TO_UINT:
1082      return getConstant((uint64_t)C->getValue(), VT);
1083    case ISD::BIT_CONVERT:
1084      if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
1085        return getConstant(FloatToBits(C->getValue()), VT);
1086      else if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
1087        return getConstant(DoubleToBits(C->getValue()), VT);
1088      break;
1089    }
1090
1091  unsigned OpOpcode = Operand.Val->getOpcode();
1092  switch (Opcode) {
1093  case ISD::TokenFactor:
1094    return Operand;         // Factor of one node?  No factor.
1095  case ISD::SIGN_EXTEND:
1096    if (Operand.getValueType() == VT) return Operand;   // noop extension
1097    assert(Operand.getValueType() < VT && "Invalid sext node, dst < src!");
1098    if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND)
1099      return getNode(OpOpcode, VT, Operand.Val->getOperand(0));
1100    break;
1101  case ISD::ZERO_EXTEND:
1102    if (Operand.getValueType() == VT) return Operand;   // noop extension
1103    assert(Operand.getValueType() < VT && "Invalid zext node, dst < src!");
1104    if (OpOpcode == ISD::ZERO_EXTEND)   // (zext (zext x)) -> (zext x)
1105      return getNode(ISD::ZERO_EXTEND, VT, Operand.Val->getOperand(0));
1106    break;
1107  case ISD::ANY_EXTEND:
1108    if (Operand.getValueType() == VT) return Operand;   // noop extension
1109    assert(Operand.getValueType() < VT && "Invalid anyext node, dst < src!");
1110    if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND)
1111      // (ext (zext x)) -> (zext x)  and  (ext (sext x)) -> (sext x)
1112      return getNode(OpOpcode, VT, Operand.Val->getOperand(0));
1113    break;
1114  case ISD::TRUNCATE:
1115    if (Operand.getValueType() == VT) return Operand;   // noop truncate
1116    assert(Operand.getValueType() > VT && "Invalid truncate node, src < dst!");
1117    if (OpOpcode == ISD::TRUNCATE)
1118      return getNode(ISD::TRUNCATE, VT, Operand.Val->getOperand(0));
1119    else if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
1120             OpOpcode == ISD::ANY_EXTEND) {
1121      // If the source is smaller than the dest, we still need an extend.
1122      if (Operand.Val->getOperand(0).getValueType() < VT)
1123        return getNode(OpOpcode, VT, Operand.Val->getOperand(0));
1124      else if (Operand.Val->getOperand(0).getValueType() > VT)
1125        return getNode(ISD::TRUNCATE, VT, Operand.Val->getOperand(0));
1126      else
1127        return Operand.Val->getOperand(0);
1128    }
1129    break;
1130  case ISD::BIT_CONVERT:
1131    // Basic sanity checking.
1132    assert(MVT::getSizeInBits(VT) == MVT::getSizeInBits(Operand.getValueType())
1133           && "Cannot BIT_CONVERT between types of different sizes!");
1134    if (VT == Operand.getValueType()) return Operand;  // noop conversion.
1135    if (OpOpcode == ISD::BIT_CONVERT)  // bitconv(bitconv(x)) -> bitconv(x)
1136      return getNode(ISD::BIT_CONVERT, VT, Operand.getOperand(0));
1137    if (OpOpcode == ISD::UNDEF)
1138      return getNode(ISD::UNDEF, VT);
1139    break;
1140  case ISD::SCALAR_TO_VECTOR:
1141    assert(MVT::isVector(VT) && !MVT::isVector(Operand.getValueType()) &&
1142           MVT::getVectorBaseType(VT) == Operand.getValueType() &&
1143           "Illegal SCALAR_TO_VECTOR node!");
1144    break;
1145  case ISD::FNEG:
1146    if (OpOpcode == ISD::FSUB)   // -(X-Y) -> (Y-X)
1147      return getNode(ISD::FSUB, VT, Operand.Val->getOperand(1),
1148                     Operand.Val->getOperand(0));
1149    if (OpOpcode == ISD::FNEG)  // --X -> X
1150      return Operand.Val->getOperand(0);
1151    break;
1152  case ISD::FABS:
1153    if (OpOpcode == ISD::FNEG)  // abs(-X) -> abs(X)
1154      return getNode(ISD::FABS, VT, Operand.Val->getOperand(0));
1155    break;
1156  }
1157
1158  SDNode *N;
1159  SDVTList VTs = getVTList(VT);
1160  if (VT != MVT::Flag) { // Don't CSE flag producing nodes
1161    FoldingSetNodeID ID;
1162    AddNodeIDNode(ID, Opcode, VTs, Operand);
1163    void *IP = 0;
1164    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1165      return SDOperand(E, 0);
1166    N = new SDNode(Opcode, Operand);
1167    N->setValueTypes(VTs);
1168    CSEMap.InsertNode(N, IP);
1169  } else {
1170    N = new SDNode(Opcode, Operand);
1171    N->setValueTypes(VTs);
1172  }
1173  AllNodes.push_back(N);
1174  return SDOperand(N, 0);
1175}
1176
1177
1178
1179SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
1180                                SDOperand N1, SDOperand N2) {
1181#ifndef NDEBUG
1182  switch (Opcode) {
1183  case ISD::TokenFactor:
1184    assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
1185           N2.getValueType() == MVT::Other && "Invalid token factor!");
1186    break;
1187  case ISD::AND:
1188  case ISD::OR:
1189  case ISD::XOR:
1190  case ISD::UDIV:
1191  case ISD::UREM:
1192  case ISD::MULHU:
1193  case ISD::MULHS:
1194    assert(MVT::isInteger(VT) && "This operator does not apply to FP types!");
1195    // fall through
1196  case ISD::ADD:
1197  case ISD::SUB:
1198  case ISD::MUL:
1199  case ISD::SDIV:
1200  case ISD::SREM:
1201    assert(MVT::isInteger(N1.getValueType()) && "Should use F* for FP ops");
1202    // fall through.
1203  case ISD::FADD:
1204  case ISD::FSUB:
1205  case ISD::FMUL:
1206  case ISD::FDIV:
1207  case ISD::FREM:
1208    assert(N1.getValueType() == N2.getValueType() &&
1209           N1.getValueType() == VT && "Binary operator types must match!");
1210    break;
1211  case ISD::FCOPYSIGN:   // N1 and result must match.  N1/N2 need not match.
1212    assert(N1.getValueType() == VT &&
1213           MVT::isFloatingPoint(N1.getValueType()) &&
1214           MVT::isFloatingPoint(N2.getValueType()) &&
1215           "Invalid FCOPYSIGN!");
1216    break;
1217  case ISD::SHL:
1218  case ISD::SRA:
1219  case ISD::SRL:
1220  case ISD::ROTL:
1221  case ISD::ROTR:
1222    assert(VT == N1.getValueType() &&
1223           "Shift operators return type must be the same as their first arg");
1224    assert(MVT::isInteger(VT) && MVT::isInteger(N2.getValueType()) &&
1225           VT != MVT::i1 && "Shifts only work on integers");
1226    break;
1227  case ISD::FP_ROUND_INREG: {
1228    MVT::ValueType EVT = cast<VTSDNode>(N2)->getVT();
1229    assert(VT == N1.getValueType() && "Not an inreg round!");
1230    assert(MVT::isFloatingPoint(VT) && MVT::isFloatingPoint(EVT) &&
1231           "Cannot FP_ROUND_INREG integer types");
1232    assert(EVT <= VT && "Not rounding down!");
1233    break;
1234  }
1235  case ISD::AssertSext:
1236  case ISD::AssertZext:
1237  case ISD::SIGN_EXTEND_INREG: {
1238    MVT::ValueType EVT = cast<VTSDNode>(N2)->getVT();
1239    assert(VT == N1.getValueType() && "Not an inreg extend!");
1240    assert(MVT::isInteger(VT) && MVT::isInteger(EVT) &&
1241           "Cannot *_EXTEND_INREG FP types");
1242    assert(EVT <= VT && "Not extending!");
1243  }
1244
1245  default: break;
1246  }
1247#endif
1248
1249  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.Val);
1250  ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.Val);
1251  if (N1C) {
1252    if (Opcode == ISD::SIGN_EXTEND_INREG) {
1253      int64_t Val = N1C->getValue();
1254      unsigned FromBits = MVT::getSizeInBits(cast<VTSDNode>(N2)->getVT());
1255      Val <<= 64-FromBits;
1256      Val >>= 64-FromBits;
1257      return getConstant(Val, VT);
1258    }
1259
1260    if (N2C) {
1261      uint64_t C1 = N1C->getValue(), C2 = N2C->getValue();
1262      switch (Opcode) {
1263      case ISD::ADD: return getConstant(C1 + C2, VT);
1264      case ISD::SUB: return getConstant(C1 - C2, VT);
1265      case ISD::MUL: return getConstant(C1 * C2, VT);
1266      case ISD::UDIV:
1267        if (C2) return getConstant(C1 / C2, VT);
1268        break;
1269      case ISD::UREM :
1270        if (C2) return getConstant(C1 % C2, VT);
1271        break;
1272      case ISD::SDIV :
1273        if (C2) return getConstant(N1C->getSignExtended() /
1274                                   N2C->getSignExtended(), VT);
1275        break;
1276      case ISD::SREM :
1277        if (C2) return getConstant(N1C->getSignExtended() %
1278                                   N2C->getSignExtended(), VT);
1279        break;
1280      case ISD::AND  : return getConstant(C1 & C2, VT);
1281      case ISD::OR   : return getConstant(C1 | C2, VT);
1282      case ISD::XOR  : return getConstant(C1 ^ C2, VT);
1283      case ISD::SHL  : return getConstant(C1 << C2, VT);
1284      case ISD::SRL  : return getConstant(C1 >> C2, VT);
1285      case ISD::SRA  : return getConstant(N1C->getSignExtended() >>(int)C2, VT);
1286      case ISD::ROTL :
1287        return getConstant((C1 << C2) | (C1 >> (MVT::getSizeInBits(VT) - C2)),
1288                           VT);
1289      case ISD::ROTR :
1290        return getConstant((C1 >> C2) | (C1 << (MVT::getSizeInBits(VT) - C2)),
1291                           VT);
1292      default: break;
1293      }
1294    } else {      // Cannonicalize constant to RHS if commutative
1295      if (isCommutativeBinOp(Opcode)) {
1296        std::swap(N1C, N2C);
1297        std::swap(N1, N2);
1298      }
1299    }
1300  }
1301
1302  ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1.Val);
1303  ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2.Val);
1304  if (N1CFP) {
1305    if (N2CFP) {
1306      double C1 = N1CFP->getValue(), C2 = N2CFP->getValue();
1307      switch (Opcode) {
1308      case ISD::FADD: return getConstantFP(C1 + C2, VT);
1309      case ISD::FSUB: return getConstantFP(C1 - C2, VT);
1310      case ISD::FMUL: return getConstantFP(C1 * C2, VT);
1311      case ISD::FDIV:
1312        if (C2) return getConstantFP(C1 / C2, VT);
1313        break;
1314      case ISD::FREM :
1315        if (C2) return getConstantFP(fmod(C1, C2), VT);
1316        break;
1317      case ISD::FCOPYSIGN: {
1318        union {
1319          double   F;
1320          uint64_t I;
1321        } u1;
1322        union {
1323          double  F;
1324          int64_t I;
1325        } u2;
1326        u1.F = C1;
1327        u2.F = C2;
1328        if (u2.I < 0)  // Sign bit of RHS set?
1329          u1.I |= 1ULL << 63;      // Set the sign bit of the LHS.
1330        else
1331          u1.I &= (1ULL << 63)-1;  // Clear the sign bit of the LHS.
1332        return getConstantFP(u1.F, VT);
1333      }
1334      default: break;
1335      }
1336    } else {      // Cannonicalize constant to RHS if commutative
1337      if (isCommutativeBinOp(Opcode)) {
1338        std::swap(N1CFP, N2CFP);
1339        std::swap(N1, N2);
1340      }
1341    }
1342  }
1343
1344  // Canonicalize an UNDEF to the RHS, even over a constant.
1345  if (N1.getOpcode() == ISD::UNDEF) {
1346    if (isCommutativeBinOp(Opcode)) {
1347      std::swap(N1, N2);
1348    } else {
1349      switch (Opcode) {
1350      case ISD::FP_ROUND_INREG:
1351      case ISD::SIGN_EXTEND_INREG:
1352      case ISD::SUB:
1353      case ISD::FSUB:
1354      case ISD::FDIV:
1355      case ISD::FREM:
1356      case ISD::SRA:
1357        return N1;     // fold op(undef, arg2) -> undef
1358      case ISD::UDIV:
1359      case ISD::SDIV:
1360      case ISD::UREM:
1361      case ISD::SREM:
1362      case ISD::SRL:
1363      case ISD::SHL:
1364        return getConstant(0, VT);    // fold op(undef, arg2) -> 0
1365      }
1366    }
1367  }
1368
1369  // Fold a bunch of operators when the RHS is undef.
1370  if (N2.getOpcode() == ISD::UNDEF) {
1371    switch (Opcode) {
1372    case ISD::ADD:
1373    case ISD::SUB:
1374    case ISD::FADD:
1375    case ISD::FSUB:
1376    case ISD::FMUL:
1377    case ISD::FDIV:
1378    case ISD::FREM:
1379    case ISD::UDIV:
1380    case ISD::SDIV:
1381    case ISD::UREM:
1382    case ISD::SREM:
1383    case ISD::XOR:
1384      return N2;       // fold op(arg1, undef) -> undef
1385    case ISD::MUL:
1386    case ISD::AND:
1387    case ISD::SRL:
1388    case ISD::SHL:
1389      return getConstant(0, VT);  // fold op(arg1, undef) -> 0
1390    case ISD::OR:
1391      return getConstant(MVT::getIntVTBitMask(VT), VT);
1392    case ISD::SRA:
1393      return N1;
1394    }
1395  }
1396
1397  // Fold operations.
1398  switch (Opcode) {
1399  case ISD::AND:
1400    // (X & 0) -> 0.  This commonly occurs when legalizing i64 values, so it's
1401    // worth handling here.
1402    if (N2C && N2C->getValue() == 0)
1403      return N2;
1404    break;
1405  case ISD::OR:
1406  case ISD::XOR:
1407    // (X ^| 0) -> X.  This commonly occurs when legalizing i64 values, so it's
1408    // worth handling here.
1409    if (N2C && N2C->getValue() == 0)
1410      return N1;
1411    break;
1412  case ISD::FP_ROUND_INREG:
1413    if (cast<VTSDNode>(N2)->getVT() == VT) return N1;  // Not actually rounding.
1414    break;
1415  case ISD::SIGN_EXTEND_INREG: {
1416    MVT::ValueType EVT = cast<VTSDNode>(N2)->getVT();
1417    if (EVT == VT) return N1;  // Not actually extending
1418    break;
1419  }
1420  case ISD::EXTRACT_ELEMENT:
1421    assert(N2C && (unsigned)N2C->getValue() < 2 && "Bad EXTRACT_ELEMENT!");
1422
1423    // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
1424    // 64-bit integers into 32-bit parts.  Instead of building the extract of
1425    // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
1426    if (N1.getOpcode() == ISD::BUILD_PAIR)
1427      return N1.getOperand(N2C->getValue());
1428
1429    // EXTRACT_ELEMENT of a constant int is also very common.
1430    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N1)) {
1431      unsigned Shift = MVT::getSizeInBits(VT) * N2C->getValue();
1432      return getConstant(C->getValue() >> Shift, VT);
1433    }
1434    break;
1435
1436  // FIXME: figure out how to safely handle things like
1437  // int foo(int x) { return 1 << (x & 255); }
1438  // int bar() { return foo(256); }
1439#if 0
1440  case ISD::SHL:
1441  case ISD::SRL:
1442  case ISD::SRA:
1443    if (N2.getOpcode() == ISD::SIGN_EXTEND_INREG &&
1444        cast<VTSDNode>(N2.getOperand(1))->getVT() != MVT::i1)
1445      return getNode(Opcode, VT, N1, N2.getOperand(0));
1446    else if (N2.getOpcode() == ISD::AND)
1447      if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N2.getOperand(1))) {
1448        // If the and is only masking out bits that cannot effect the shift,
1449        // eliminate the and.
1450        unsigned NumBits = MVT::getSizeInBits(VT);
1451        if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1)
1452          return getNode(Opcode, VT, N1, N2.getOperand(0));
1453      }
1454    break;
1455#endif
1456  }
1457
1458  // Memoize this node if possible.
1459  SDNode *N;
1460  SDVTList VTs = getVTList(VT);
1461  if (VT != MVT::Flag) {
1462    FoldingSetNodeID ID;
1463    AddNodeIDNode(ID, Opcode, VTs, N1, N2);
1464    void *IP = 0;
1465    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1466      return SDOperand(E, 0);
1467    N = new SDNode(Opcode, N1, N2);
1468    N->setValueTypes(VTs);
1469    CSEMap.InsertNode(N, IP);
1470  } else {
1471    N = new SDNode(Opcode, N1, N2);
1472    N->setValueTypes(VTs);
1473  }
1474
1475  AllNodes.push_back(N);
1476  return SDOperand(N, 0);
1477}
1478
1479SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
1480                                SDOperand N1, SDOperand N2, SDOperand N3) {
1481  // Perform various simplifications.
1482  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.Val);
1483  ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.Val);
1484  switch (Opcode) {
1485  case ISD::SETCC: {
1486    // Use FoldSetCC to simplify SETCC's.
1487    SDOperand Simp = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get());
1488    if (Simp.Val) return Simp;
1489    break;
1490  }
1491  case ISD::SELECT:
1492    if (N1C)
1493      if (N1C->getValue())
1494        return N2;             // select true, X, Y -> X
1495      else
1496        return N3;             // select false, X, Y -> Y
1497
1498    if (N2 == N3) return N2;   // select C, X, X -> X
1499    break;
1500  case ISD::BRCOND:
1501    if (N2C)
1502      if (N2C->getValue()) // Unconditional branch
1503        return getNode(ISD::BR, MVT::Other, N1, N3);
1504      else
1505        return N1;         // Never-taken branch
1506    break;
1507  case ISD::VECTOR_SHUFFLE:
1508    assert(VT == N1.getValueType() && VT == N2.getValueType() &&
1509           MVT::isVector(VT) && MVT::isVector(N3.getValueType()) &&
1510           N3.getOpcode() == ISD::BUILD_VECTOR &&
1511           MVT::getVectorNumElements(VT) == N3.getNumOperands() &&
1512           "Illegal VECTOR_SHUFFLE node!");
1513    break;
1514  }
1515
1516  // Memoize node if it doesn't produce a flag.
1517  SDNode *N;
1518  SDVTList VTs = getVTList(VT);
1519  if (VT != MVT::Flag) {
1520    FoldingSetNodeID ID;
1521    AddNodeIDNode(ID, Opcode, VTs, N1, N2, N3);
1522    void *IP = 0;
1523    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1524      return SDOperand(E, 0);
1525    N = new SDNode(Opcode, N1, N2, N3);
1526    N->setValueTypes(VTs);
1527    CSEMap.InsertNode(N, IP);
1528  } else {
1529    N = new SDNode(Opcode, N1, N2, N3);
1530    N->setValueTypes(VTs);
1531  }
1532  AllNodes.push_back(N);
1533  return SDOperand(N, 0);
1534}
1535
1536SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
1537                                SDOperand N1, SDOperand N2, SDOperand N3,
1538                                SDOperand N4) {
1539  SDOperand Ops[] = { N1, N2, N3, N4 };
1540  return getNode(Opcode, VT, Ops, 4);
1541}
1542
1543SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
1544                                SDOperand N1, SDOperand N2, SDOperand N3,
1545                                SDOperand N4, SDOperand N5) {
1546  SDOperand Ops[] = { N1, N2, N3, N4, N5 };
1547  return getNode(Opcode, VT, Ops, 5);
1548}
1549
1550SDOperand SelectionDAG::getLoad(MVT::ValueType VT,
1551                                SDOperand Chain, SDOperand Ptr,
1552                                const Value *SV, int SVOffset,
1553                                bool isVolatile) {
1554  // FIXME: Alignment == 1 for now.
1555  unsigned Alignment = 1;
1556  SDVTList VTs = getVTList(VT, MVT::Other);
1557  SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType());
1558  FoldingSetNodeID ID;
1559  AddNodeIDNode(ID, ISD::LOAD, VTs, Chain, Ptr, Undef);
1560  ID.AddInteger(ISD::UNINDEXED);
1561  ID.AddInteger(ISD::NON_EXTLOAD);
1562  ID.AddInteger(VT);
1563  ID.AddPointer(SV);
1564  ID.AddInteger(SVOffset);
1565  ID.AddInteger(Alignment);
1566  ID.AddInteger(isVolatile);
1567  void *IP = 0;
1568  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1569    return SDOperand(E, 0);
1570  SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ISD::UNINDEXED,
1571                             ISD::NON_EXTLOAD, VT, SV, SVOffset, Alignment,
1572                             isVolatile);
1573  N->setValueTypes(VTs);
1574  CSEMap.InsertNode(N, IP);
1575  AllNodes.push_back(N);
1576  return SDOperand(N, 0);
1577}
1578
1579SDOperand SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, MVT::ValueType VT,
1580                                   SDOperand Chain, SDOperand Ptr,
1581                                   const Value *SV,
1582                                   int SVOffset, MVT::ValueType EVT,
1583                                   bool isVolatile) {
1584  // If they are asking for an extending load from/to the same thing, return a
1585  // normal load.
1586  if (VT == EVT)
1587    ExtType = ISD::NON_EXTLOAD;
1588
1589  if (MVT::isVector(VT))
1590    assert(EVT == MVT::getVectorBaseType(VT) && "Invalid vector extload!");
1591  else
1592    assert(EVT < VT && "Should only be an extending load, not truncating!");
1593  assert((ExtType == ISD::EXTLOAD || MVT::isInteger(VT)) &&
1594         "Cannot sign/zero extend a FP/Vector load!");
1595  assert(MVT::isInteger(VT) == MVT::isInteger(EVT) &&
1596         "Cannot convert from FP to Int or Int -> FP!");
1597
1598  // FIXME: Alignment == 1 for now.
1599  unsigned Alignment = 1;
1600  SDVTList VTs = getVTList(VT, MVT::Other);
1601  SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType());
1602  FoldingSetNodeID ID;
1603  AddNodeIDNode(ID, ISD::LOAD, VTs, Chain, Ptr, Undef);
1604  ID.AddInteger(ISD::UNINDEXED);
1605  ID.AddInteger(ExtType);
1606  ID.AddInteger(EVT);
1607  ID.AddPointer(SV);
1608  ID.AddInteger(SVOffset);
1609  ID.AddInteger(Alignment);
1610  ID.AddInteger(isVolatile);
1611  void *IP = 0;
1612  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1613    return SDOperand(E, 0);
1614  SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ISD::UNINDEXED, ExtType, EVT,
1615                             SV, SVOffset, Alignment, isVolatile);
1616  N->setValueTypes(VTs);
1617  CSEMap.InsertNode(N, IP);
1618  AllNodes.push_back(N);
1619  return SDOperand(N, 0);
1620}
1621
1622SDOperand
1623SelectionDAG::getIndexedLoad(SDOperand OrigLoad, SDOperand Base,
1624                             SDOperand Offset, ISD::MemIndexedMode AM) {
1625  LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
1626  assert(LD->getOffset().getOpcode() == ISD::UNDEF &&
1627         "Load is already a indexed load!");
1628  MVT::ValueType VT = OrigLoad.getValueType();
1629  SDVTList VTs = getVTList(VT, Base.getValueType(), MVT::Other);
1630  FoldingSetNodeID ID;
1631  AddNodeIDNode(ID, ISD::LOAD, VTs, LD->getChain(), Base, Offset);
1632  ID.AddInteger(AM);
1633  ID.AddInteger(LD->getExtensionType());
1634  ID.AddInteger(LD->getLoadedVT());
1635  ID.AddPointer(LD->getSrcValue());
1636  ID.AddInteger(LD->getSrcValueOffset());
1637  ID.AddInteger(LD->getAlignment());
1638  ID.AddInteger(LD->isVolatile());
1639  void *IP = 0;
1640  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1641    return SDOperand(E, 0);
1642  SDNode *N = new LoadSDNode(LD->getChain(), Base, Offset, AM,
1643                             LD->getExtensionType(), LD->getLoadedVT(),
1644                             LD->getSrcValue(), LD->getSrcValueOffset(),
1645                             LD->getAlignment(), LD->isVolatile());
1646  N->setValueTypes(VTs);
1647  CSEMap.InsertNode(N, IP);
1648  AllNodes.push_back(N);
1649  return SDOperand(N, 0);
1650}
1651
1652SDOperand SelectionDAG::getVecLoad(unsigned Count, MVT::ValueType EVT,
1653                                   SDOperand Chain, SDOperand Ptr,
1654                                   SDOperand SV) {
1655  SDOperand Ops[] = { Chain, Ptr, SV, getConstant(Count, MVT::i32),
1656                      getValueType(EVT) };
1657  return getNode(ISD::VLOAD, getVTList(MVT::Vector, MVT::Other), Ops, 5);
1658}
1659
1660SDOperand SelectionDAG::getStore(SDOperand Chain, SDOperand Val,
1661                                 SDOperand Ptr, const Value *SV, int SVOffset,
1662                                 bool isVolatile) {
1663  MVT::ValueType VT = Val.getValueType();
1664
1665  // FIXME: Alignment == 1 for now.
1666  unsigned Alignment = 1;
1667  SDVTList VTs = getVTList(MVT::Other);
1668  SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType());
1669  SDOperand Ops[] = { Chain, Val, Ptr, Undef };
1670  FoldingSetNodeID ID;
1671  AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
1672  ID.AddInteger(ISD::UNINDEXED);
1673  ID.AddInteger(false);
1674  ID.AddInteger(VT);
1675  ID.AddPointer(SV);
1676  ID.AddInteger(SVOffset);
1677  ID.AddInteger(Alignment);
1678  ID.AddInteger(isVolatile);
1679  void *IP = 0;
1680  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1681    return SDOperand(E, 0);
1682  SDNode *N = new StoreSDNode(Chain, Val, Ptr, Undef, ISD::UNINDEXED, false,
1683                              VT, SV, SVOffset, Alignment, isVolatile);
1684  N->setValueTypes(VTs);
1685  CSEMap.InsertNode(N, IP);
1686  AllNodes.push_back(N);
1687  return SDOperand(N, 0);
1688}
1689
1690SDOperand SelectionDAG::getTruncStore(SDOperand Chain, SDOperand Val,
1691                                      SDOperand Ptr, const Value *SV,
1692                                      int SVOffset, MVT::ValueType SVT,
1693                                      bool isVolatile) {
1694  MVT::ValueType VT = Val.getValueType();
1695  bool isTrunc = VT != SVT;
1696
1697  assert(VT > SVT && "Not a truncation?");
1698  assert(MVT::isInteger(VT) == MVT::isInteger(SVT) &&
1699         "Can't do FP-INT conversion!");
1700
1701  // FIXME: Alignment == 1 for now.
1702  unsigned Alignment = 1;
1703  SDVTList VTs = getVTList(MVT::Other);
1704  SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType());
1705  SDOperand Ops[] = { Chain, Val, Ptr, Undef };
1706  FoldingSetNodeID ID;
1707  AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
1708  ID.AddInteger(ISD::UNINDEXED);
1709  ID.AddInteger(isTrunc);
1710  ID.AddInteger(SVT);
1711  ID.AddPointer(SV);
1712  ID.AddInteger(SVOffset);
1713  ID.AddInteger(Alignment);
1714  ID.AddInteger(isVolatile);
1715  void *IP = 0;
1716  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1717    return SDOperand(E, 0);
1718  SDNode *N = new StoreSDNode(Chain, Val, Ptr, Undef, ISD::UNINDEXED, isTrunc,
1719                              SVT, SV, SVOffset, Alignment, isVolatile);
1720  N->setValueTypes(VTs);
1721  CSEMap.InsertNode(N, IP);
1722  AllNodes.push_back(N);
1723  return SDOperand(N, 0);
1724}
1725
1726SDOperand
1727SelectionDAG::getIndexedStore(SDOperand OrigStore, SDOperand Base,
1728                              SDOperand Offset, ISD::MemIndexedMode AM) {
1729  StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
1730  assert(ST->getOffset().getOpcode() == ISD::UNDEF &&
1731         "Store is already a indexed store!");
1732  SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
1733  SDOperand Ops[] = { ST->getChain(), ST->getValue(), Base, Offset };
1734  FoldingSetNodeID ID;
1735  AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
1736  ID.AddInteger(AM);
1737  ID.AddInteger(ST->isTruncatingStore());
1738  ID.AddInteger(ST->getStoredVT());
1739  ID.AddPointer(ST->getSrcValue());
1740  ID.AddInteger(ST->getSrcValueOffset());
1741  ID.AddInteger(ST->getAlignment());
1742  ID.AddInteger(ST->isVolatile());
1743  void *IP = 0;
1744  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1745    return SDOperand(E, 0);
1746  SDNode *N = new StoreSDNode(ST->getChain(), ST->getValue(),
1747                              Base, Offset, AM,
1748                              ST->isTruncatingStore(), ST->getStoredVT(),
1749                              ST->getSrcValue(), ST->getSrcValueOffset(),
1750                              ST->getAlignment(), ST->isVolatile());
1751  N->setValueTypes(VTs);
1752  CSEMap.InsertNode(N, IP);
1753  AllNodes.push_back(N);
1754  return SDOperand(N, 0);
1755}
1756
1757SDOperand SelectionDAG::getVAArg(MVT::ValueType VT,
1758                                 SDOperand Chain, SDOperand Ptr,
1759                                 SDOperand SV) {
1760  SDOperand Ops[] = { Chain, Ptr, SV };
1761  return getNode(ISD::VAARG, getVTList(VT, MVT::Other), Ops, 3);
1762}
1763
1764SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
1765                                const SDOperand *Ops, unsigned NumOps) {
1766  switch (NumOps) {
1767  case 0: return getNode(Opcode, VT);
1768  case 1: return getNode(Opcode, VT, Ops[0]);
1769  case 2: return getNode(Opcode, VT, Ops[0], Ops[1]);
1770  case 3: return getNode(Opcode, VT, Ops[0], Ops[1], Ops[2]);
1771  default: break;
1772  }
1773
1774  switch (Opcode) {
1775  default: break;
1776  case ISD::SELECT_CC: {
1777    assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
1778    assert(Ops[0].getValueType() == Ops[1].getValueType() &&
1779           "LHS and RHS of condition must have same type!");
1780    assert(Ops[2].getValueType() == Ops[3].getValueType() &&
1781           "True and False arms of SelectCC must have same type!");
1782    assert(Ops[2].getValueType() == VT &&
1783           "select_cc node must be of same type as true and false value!");
1784    break;
1785  }
1786  case ISD::BR_CC: {
1787    assert(NumOps == 5 && "BR_CC takes 5 operands!");
1788    assert(Ops[2].getValueType() == Ops[3].getValueType() &&
1789           "LHS/RHS of comparison should match types!");
1790    break;
1791  }
1792  }
1793
1794  // Memoize nodes.
1795  SDNode *N;
1796  SDVTList VTs = getVTList(VT);
1797  if (VT != MVT::Flag) {
1798    FoldingSetNodeID ID;
1799    AddNodeIDNode(ID, Opcode, VTs, Ops, NumOps);
1800    void *IP = 0;
1801    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1802      return SDOperand(E, 0);
1803    N = new SDNode(Opcode, Ops, NumOps);
1804    N->setValueTypes(VTs);
1805    CSEMap.InsertNode(N, IP);
1806  } else {
1807    N = new SDNode(Opcode, Ops, NumOps);
1808    N->setValueTypes(VTs);
1809  }
1810  AllNodes.push_back(N);
1811  return SDOperand(N, 0);
1812}
1813
1814SDOperand SelectionDAG::getNode(unsigned Opcode,
1815                                std::vector<MVT::ValueType> &ResultTys,
1816                                const SDOperand *Ops, unsigned NumOps) {
1817  return getNode(Opcode, getNodeValueTypes(ResultTys), ResultTys.size(),
1818                 Ops, NumOps);
1819}
1820
1821SDOperand SelectionDAG::getNode(unsigned Opcode,
1822                                const MVT::ValueType *VTs, unsigned NumVTs,
1823                                const SDOperand *Ops, unsigned NumOps) {
1824  if (NumVTs == 1)
1825    return getNode(Opcode, VTs[0], Ops, NumOps);
1826  return getNode(Opcode, makeVTList(VTs, NumVTs), Ops, NumOps);
1827}
1828
1829SDOperand SelectionDAG::getNode(unsigned Opcode, SDVTList VTList,
1830                                const SDOperand *Ops, unsigned NumOps) {
1831  if (VTList.NumVTs == 1)
1832    return getNode(Opcode, VTList.VTs[0], Ops, NumOps);
1833
1834  switch (Opcode) {
1835  // FIXME: figure out how to safely handle things like
1836  // int foo(int x) { return 1 << (x & 255); }
1837  // int bar() { return foo(256); }
1838#if 0
1839  case ISD::SRA_PARTS:
1840  case ISD::SRL_PARTS:
1841  case ISD::SHL_PARTS:
1842    if (N3.getOpcode() == ISD::SIGN_EXTEND_INREG &&
1843        cast<VTSDNode>(N3.getOperand(1))->getVT() != MVT::i1)
1844      return getNode(Opcode, VT, N1, N2, N3.getOperand(0));
1845    else if (N3.getOpcode() == ISD::AND)
1846      if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N3.getOperand(1))) {
1847        // If the and is only masking out bits that cannot effect the shift,
1848        // eliminate the and.
1849        unsigned NumBits = MVT::getSizeInBits(VT)*2;
1850        if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1)
1851          return getNode(Opcode, VT, N1, N2, N3.getOperand(0));
1852      }
1853    break;
1854#endif
1855  }
1856
1857  // Memoize the node unless it returns a flag.
1858  SDNode *N;
1859  if (VTList.VTs[VTList.NumVTs-1] != MVT::Flag) {
1860    FoldingSetNodeID ID;
1861    AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);
1862    void *IP = 0;
1863    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1864      return SDOperand(E, 0);
1865    N = new SDNode(Opcode, Ops, NumOps);
1866    N->setValueTypes(VTList);
1867    CSEMap.InsertNode(N, IP);
1868  } else {
1869    N = new SDNode(Opcode, Ops, NumOps);
1870    N->setValueTypes(VTList);
1871  }
1872  AllNodes.push_back(N);
1873  return SDOperand(N, 0);
1874}
1875
1876SDVTList SelectionDAG::getVTList(MVT::ValueType VT) {
1877  return makeVTList(SDNode::getValueTypeList(VT), 1);
1878}
1879
1880SDVTList SelectionDAG::getVTList(MVT::ValueType VT1, MVT::ValueType VT2) {
1881  for (std::list<std::vector<MVT::ValueType> >::iterator I = VTList.begin(),
1882       E = VTList.end(); I != E; ++I) {
1883    if (I->size() == 2 && (*I)[0] == VT1 && (*I)[1] == VT2)
1884      return makeVTList(&(*I)[0], 2);
1885  }
1886  std::vector<MVT::ValueType> V;
1887  V.push_back(VT1);
1888  V.push_back(VT2);
1889  VTList.push_front(V);
1890  return makeVTList(&(*VTList.begin())[0], 2);
1891}
1892SDVTList SelectionDAG::getVTList(MVT::ValueType VT1, MVT::ValueType VT2,
1893                                 MVT::ValueType VT3) {
1894  for (std::list<std::vector<MVT::ValueType> >::iterator I = VTList.begin(),
1895       E = VTList.end(); I != E; ++I) {
1896    if (I->size() == 3 && (*I)[0] == VT1 && (*I)[1] == VT2 &&
1897        (*I)[2] == VT3)
1898      return makeVTList(&(*I)[0], 3);
1899  }
1900  std::vector<MVT::ValueType> V;
1901  V.push_back(VT1);
1902  V.push_back(VT2);
1903  V.push_back(VT3);
1904  VTList.push_front(V);
1905  return makeVTList(&(*VTList.begin())[0], 3);
1906}
1907
1908SDVTList SelectionDAG::getVTList(const MVT::ValueType *VTs, unsigned NumVTs) {
1909  switch (NumVTs) {
1910    case 0: assert(0 && "Cannot have nodes without results!");
1911    case 1: return makeVTList(SDNode::getValueTypeList(VTs[0]), 1);
1912    case 2: return getVTList(VTs[0], VTs[1]);
1913    case 3: return getVTList(VTs[0], VTs[1], VTs[2]);
1914    default: break;
1915  }
1916
1917  for (std::list<std::vector<MVT::ValueType> >::iterator I = VTList.begin(),
1918       E = VTList.end(); I != E; ++I) {
1919    if (I->size() != NumVTs || VTs[0] != (*I)[0] || VTs[1] != (*I)[1]) continue;
1920
1921    bool NoMatch = false;
1922    for (unsigned i = 2; i != NumVTs; ++i)
1923      if (VTs[i] != (*I)[i]) {
1924        NoMatch = true;
1925        break;
1926      }
1927    if (!NoMatch)
1928      return makeVTList(&*I->begin(), NumVTs);
1929  }
1930
1931  VTList.push_front(std::vector<MVT::ValueType>(VTs, VTs+NumVTs));
1932  return makeVTList(&*VTList.begin()->begin(), NumVTs);
1933}
1934
1935
1936/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
1937/// specified operands.  If the resultant node already exists in the DAG,
1938/// this does not modify the specified node, instead it returns the node that
1939/// already exists.  If the resultant node does not exist in the DAG, the
1940/// input node is returned.  As a degenerate case, if you specify the same
1941/// input operands as the node already has, the input node is returned.
1942SDOperand SelectionDAG::
1943UpdateNodeOperands(SDOperand InN, SDOperand Op) {
1944  SDNode *N = InN.Val;
1945  assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
1946
1947  // Check to see if there is no change.
1948  if (Op == N->getOperand(0)) return InN;
1949
1950  // See if the modified node already exists.
1951  void *InsertPos = 0;
1952  if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
1953    return SDOperand(Existing, InN.ResNo);
1954
1955  // Nope it doesn't.  Remove the node from it's current place in the maps.
1956  if (InsertPos)
1957    RemoveNodeFromCSEMaps(N);
1958
1959  // Now we update the operands.
1960  N->OperandList[0].Val->removeUser(N);
1961  Op.Val->addUser(N);
1962  N->OperandList[0] = Op;
1963
1964  // If this gets put into a CSE map, add it.
1965  if (InsertPos) CSEMap.InsertNode(N, InsertPos);
1966  return InN;
1967}
1968
1969SDOperand SelectionDAG::
1970UpdateNodeOperands(SDOperand InN, SDOperand Op1, SDOperand Op2) {
1971  SDNode *N = InN.Val;
1972  assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
1973
1974  // Check to see if there is no change.
1975  if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
1976    return InN;   // No operands changed, just return the input node.
1977
1978  // See if the modified node already exists.
1979  void *InsertPos = 0;
1980  if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
1981    return SDOperand(Existing, InN.ResNo);
1982
1983  // Nope it doesn't.  Remove the node from it's current place in the maps.
1984  if (InsertPos)
1985    RemoveNodeFromCSEMaps(N);
1986
1987  // Now we update the operands.
1988  if (N->OperandList[0] != Op1) {
1989    N->OperandList[0].Val->removeUser(N);
1990    Op1.Val->addUser(N);
1991    N->OperandList[0] = Op1;
1992  }
1993  if (N->OperandList[1] != Op2) {
1994    N->OperandList[1].Val->removeUser(N);
1995    Op2.Val->addUser(N);
1996    N->OperandList[1] = Op2;
1997  }
1998
1999  // If this gets put into a CSE map, add it.
2000  if (InsertPos) CSEMap.InsertNode(N, InsertPos);
2001  return InN;
2002}
2003
2004SDOperand SelectionDAG::
2005UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2, SDOperand Op3) {
2006  SDOperand Ops[] = { Op1, Op2, Op3 };
2007  return UpdateNodeOperands(N, Ops, 3);
2008}
2009
2010SDOperand SelectionDAG::
2011UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
2012                   SDOperand Op3, SDOperand Op4) {
2013  SDOperand Ops[] = { Op1, Op2, Op3, Op4 };
2014  return UpdateNodeOperands(N, Ops, 4);
2015}
2016
2017SDOperand SelectionDAG::
2018UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
2019                   SDOperand Op3, SDOperand Op4, SDOperand Op5) {
2020  SDOperand Ops[] = { Op1, Op2, Op3, Op4, Op5 };
2021  return UpdateNodeOperands(N, Ops, 5);
2022}
2023
2024
2025SDOperand SelectionDAG::
2026UpdateNodeOperands(SDOperand InN, SDOperand *Ops, unsigned NumOps) {
2027  SDNode *N = InN.Val;
2028  assert(N->getNumOperands() == NumOps &&
2029         "Update with wrong number of operands");
2030
2031  // Check to see if there is no change.
2032  bool AnyChange = false;
2033  for (unsigned i = 0; i != NumOps; ++i) {
2034    if (Ops[i] != N->getOperand(i)) {
2035      AnyChange = true;
2036      break;
2037    }
2038  }
2039
2040  // No operands changed, just return the input node.
2041  if (!AnyChange) return InN;
2042
2043  // See if the modified node already exists.
2044  void *InsertPos = 0;
2045  if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, NumOps, InsertPos))
2046    return SDOperand(Existing, InN.ResNo);
2047
2048  // Nope it doesn't.  Remove the node from it's current place in the maps.
2049  if (InsertPos)
2050    RemoveNodeFromCSEMaps(N);
2051
2052  // Now we update the operands.
2053  for (unsigned i = 0; i != NumOps; ++i) {
2054    if (N->OperandList[i] != Ops[i]) {
2055      N->OperandList[i].Val->removeUser(N);
2056      Ops[i].Val->addUser(N);
2057      N->OperandList[i] = Ops[i];
2058    }
2059  }
2060
2061  // If this gets put into a CSE map, add it.
2062  if (InsertPos) CSEMap.InsertNode(N, InsertPos);
2063  return InN;
2064}
2065
2066
2067
2068
2069/// SelectNodeTo - These are used for target selectors to *mutate* the
2070/// specified node to have the specified return type, Target opcode, and
2071/// operands.  Note that target opcodes are stored as
2072/// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field.
2073///
2074/// Note that SelectNodeTo returns the resultant node.  If there is already a
2075/// node of the specified opcode and operands, it returns that node instead of
2076/// the current one.
2077SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
2078                                   MVT::ValueType VT) {
2079  SDVTList VTs = getVTList(VT);
2080  FoldingSetNodeID ID;
2081  AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs);
2082  void *IP = 0;
2083  if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
2084    return ON;
2085
2086  RemoveNodeFromCSEMaps(N);
2087
2088  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
2089  N->setValueTypes(VTs);
2090
2091  CSEMap.InsertNode(N, IP);
2092  return N;
2093}
2094
2095SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
2096                                   MVT::ValueType VT, SDOperand Op1) {
2097  // If an identical node already exists, use it.
2098  SDVTList VTs = getVTList(VT);
2099  FoldingSetNodeID ID;
2100  AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Op1);
2101  void *IP = 0;
2102  if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
2103    return ON;
2104
2105  RemoveNodeFromCSEMaps(N);
2106  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
2107  N->setValueTypes(VTs);
2108  N->setOperands(Op1);
2109  CSEMap.InsertNode(N, IP);
2110  return N;
2111}
2112
2113SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
2114                                   MVT::ValueType VT, SDOperand Op1,
2115                                   SDOperand Op2) {
2116  // If an identical node already exists, use it.
2117  SDVTList VTs = getVTList(VT);
2118  FoldingSetNodeID ID;
2119  AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs,  Op1, Op2);
2120  void *IP = 0;
2121  if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
2122    return ON;
2123
2124  RemoveNodeFromCSEMaps(N);
2125  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
2126  N->setValueTypes(VTs);
2127  N->setOperands(Op1, Op2);
2128
2129  CSEMap.InsertNode(N, IP);   // Memoize the new node.
2130  return N;
2131}
2132
2133SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
2134                                   MVT::ValueType VT, SDOperand Op1,
2135                                   SDOperand Op2, SDOperand Op3) {
2136  // If an identical node already exists, use it.
2137  SDVTList VTs = getVTList(VT);
2138  FoldingSetNodeID ID;
2139  AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs,  Op1, Op2, Op3);
2140  void *IP = 0;
2141  if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
2142    return ON;
2143
2144  RemoveNodeFromCSEMaps(N);
2145  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
2146  N->setValueTypes(VTs);
2147  N->setOperands(Op1, Op2, Op3);
2148
2149  CSEMap.InsertNode(N, IP);   // Memoize the new node.
2150  return N;
2151}
2152
2153SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
2154                                   MVT::ValueType VT, const SDOperand *Ops,
2155                                   unsigned NumOps) {
2156  // If an identical node already exists, use it.
2157  SDVTList VTs = getVTList(VT);
2158  FoldingSetNodeID ID;
2159  AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, NumOps);
2160  void *IP = 0;
2161  if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
2162    return ON;
2163
2164  RemoveNodeFromCSEMaps(N);
2165  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
2166  N->setValueTypes(VTs);
2167  N->setOperands(Ops, NumOps);
2168
2169  CSEMap.InsertNode(N, IP);   // Memoize the new node.
2170  return N;
2171}
2172
2173SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
2174                                   MVT::ValueType VT1, MVT::ValueType VT2,
2175                                   SDOperand Op1, SDOperand Op2) {
2176  SDVTList VTs = getVTList(VT1, VT2);
2177  FoldingSetNodeID ID;
2178  AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Op1, Op2);
2179  void *IP = 0;
2180  if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
2181    return ON;
2182
2183  RemoveNodeFromCSEMaps(N);
2184  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
2185  N->setValueTypes(VTs);
2186  N->setOperands(Op1, Op2);
2187
2188  CSEMap.InsertNode(N, IP);   // Memoize the new node.
2189  return N;
2190}
2191
2192SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
2193                                   MVT::ValueType VT1, MVT::ValueType VT2,
2194                                   SDOperand Op1, SDOperand Op2,
2195                                   SDOperand Op3) {
2196  // If an identical node already exists, use it.
2197  SDVTList VTs = getVTList(VT1, VT2);
2198  FoldingSetNodeID ID;
2199  AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Op1, Op2, Op3);
2200  void *IP = 0;
2201  if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
2202    return ON;
2203
2204  RemoveNodeFromCSEMaps(N);
2205  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
2206  N->setValueTypes(VTs);
2207  N->setOperands(Op1, Op2, Op3);
2208
2209  CSEMap.InsertNode(N, IP);   // Memoize the new node.
2210  return N;
2211}
2212
2213
2214/// getTargetNode - These are used for target selectors to create a new node
2215/// with specified return type(s), target opcode, and operands.
2216///
2217/// Note that getTargetNode returns the resultant node.  If there is already a
2218/// node of the specified opcode and operands, it returns that node instead of
2219/// the current one.
2220SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT) {
2221  return getNode(ISD::BUILTIN_OP_END+Opcode, VT).Val;
2222}
2223SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT,
2224                                    SDOperand Op1) {
2225  return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1).Val;
2226}
2227SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT,
2228                                    SDOperand Op1, SDOperand Op2) {
2229  return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2).Val;
2230}
2231SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT,
2232                                    SDOperand Op1, SDOperand Op2,
2233                                    SDOperand Op3) {
2234  return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3).Val;
2235}
2236SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT,
2237                                    const SDOperand *Ops, unsigned NumOps) {
2238  return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops, NumOps).Val;
2239}
2240SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT1,
2241                                    MVT::ValueType VT2, SDOperand Op1) {
2242  const MVT::ValueType *VTs = getNodeValueTypes(VT1, VT2);
2243  return getNode(ISD::BUILTIN_OP_END+Opcode, VTs, 2, &Op1, 1).Val;
2244}
2245SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT1,
2246                                    MVT::ValueType VT2, SDOperand Op1,
2247                                    SDOperand Op2) {
2248  const MVT::ValueType *VTs = getNodeValueTypes(VT1, VT2);
2249  SDOperand Ops[] = { Op1, Op2 };
2250  return getNode(ISD::BUILTIN_OP_END+Opcode, VTs, 2, Ops, 2).Val;
2251}
2252SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT1,
2253                                    MVT::ValueType VT2, SDOperand Op1,
2254                                    SDOperand Op2, SDOperand Op3) {
2255  const MVT::ValueType *VTs = getNodeValueTypes(VT1, VT2);
2256  SDOperand Ops[] = { Op1, Op2, Op3 };
2257  return getNode(ISD::BUILTIN_OP_END+Opcode, VTs, 2, Ops, 3).Val;
2258}
2259SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT1,
2260                                    MVT::ValueType VT2,
2261                                    const SDOperand *Ops, unsigned NumOps) {
2262  const MVT::ValueType *VTs = getNodeValueTypes(VT1, VT2);
2263  return getNode(ISD::BUILTIN_OP_END+Opcode, VTs, 2, Ops, NumOps).Val;
2264}
2265SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT1,
2266                                    MVT::ValueType VT2, MVT::ValueType VT3,
2267                                    SDOperand Op1, SDOperand Op2) {
2268  const MVT::ValueType *VTs = getNodeValueTypes(VT1, VT2, VT3);
2269  SDOperand Ops[] = { Op1, Op2 };
2270  return getNode(ISD::BUILTIN_OP_END+Opcode, VTs, 3, Ops, 2).Val;
2271}
2272SDNode *SelectionDAG::getTargetNode(unsigned Opcode, MVT::ValueType VT1,
2273                                    MVT::ValueType VT2, MVT::ValueType VT3,
2274                                    const SDOperand *Ops, unsigned NumOps) {
2275  const MVT::ValueType *VTs = getNodeValueTypes(VT1, VT2, VT3);
2276  return getNode(ISD::BUILTIN_OP_END+Opcode, VTs, 3, Ops, NumOps).Val;
2277}
2278
2279/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
2280/// This can cause recursive merging of nodes in the DAG.
2281///
2282/// This version assumes From/To have a single result value.
2283///
2284void SelectionDAG::ReplaceAllUsesWith(SDOperand FromN, SDOperand ToN,
2285                                      std::vector<SDNode*> *Deleted) {
2286  SDNode *From = FromN.Val, *To = ToN.Val;
2287  assert(From->getNumValues() == 1 && To->getNumValues() == 1 &&
2288         "Cannot replace with this method!");
2289  assert(From != To && "Cannot replace uses of with self");
2290
2291  while (!From->use_empty()) {
2292    // Process users until they are all gone.
2293    SDNode *U = *From->use_begin();
2294
2295    // This node is about to morph, remove its old self from the CSE maps.
2296    RemoveNodeFromCSEMaps(U);
2297
2298    for (SDOperand *I = U->OperandList, *E = U->OperandList+U->NumOperands;
2299         I != E; ++I)
2300      if (I->Val == From) {
2301        From->removeUser(U);
2302        I->Val = To;
2303        To->addUser(U);
2304      }
2305
2306    // Now that we have modified U, add it back to the CSE maps.  If it already
2307    // exists there, recursively merge the results together.
2308    if (SDNode *Existing = AddNonLeafNodeToCSEMaps(U)) {
2309      ReplaceAllUsesWith(U, Existing, Deleted);
2310      // U is now dead.
2311      if (Deleted) Deleted->push_back(U);
2312      DeleteNodeNotInCSEMaps(U);
2313    }
2314  }
2315}
2316
2317/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
2318/// This can cause recursive merging of nodes in the DAG.
2319///
2320/// This version assumes From/To have matching types and numbers of result
2321/// values.
2322///
2323void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To,
2324                                      std::vector<SDNode*> *Deleted) {
2325  assert(From != To && "Cannot replace uses of with self");
2326  assert(From->getNumValues() == To->getNumValues() &&
2327         "Cannot use this version of ReplaceAllUsesWith!");
2328  if (From->getNumValues() == 1) {  // If possible, use the faster version.
2329    ReplaceAllUsesWith(SDOperand(From, 0), SDOperand(To, 0), Deleted);
2330    return;
2331  }
2332
2333  while (!From->use_empty()) {
2334    // Process users until they are all gone.
2335    SDNode *U = *From->use_begin();
2336
2337    // This node is about to morph, remove its old self from the CSE maps.
2338    RemoveNodeFromCSEMaps(U);
2339
2340    for (SDOperand *I = U->OperandList, *E = U->OperandList+U->NumOperands;
2341         I != E; ++I)
2342      if (I->Val == From) {
2343        From->removeUser(U);
2344        I->Val = To;
2345        To->addUser(U);
2346      }
2347
2348    // Now that we have modified U, add it back to the CSE maps.  If it already
2349    // exists there, recursively merge the results together.
2350    if (SDNode *Existing = AddNonLeafNodeToCSEMaps(U)) {
2351      ReplaceAllUsesWith(U, Existing, Deleted);
2352      // U is now dead.
2353      if (Deleted) Deleted->push_back(U);
2354      DeleteNodeNotInCSEMaps(U);
2355    }
2356  }
2357}
2358
2359/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
2360/// This can cause recursive merging of nodes in the DAG.
2361///
2362/// This version can replace From with any result values.  To must match the
2363/// number and types of values returned by From.
2364void SelectionDAG::ReplaceAllUsesWith(SDNode *From,
2365                                      const SDOperand *To,
2366                                      std::vector<SDNode*> *Deleted) {
2367  if (From->getNumValues() == 1 && To[0].Val->getNumValues() == 1) {
2368    // Degenerate case handled above.
2369    ReplaceAllUsesWith(SDOperand(From, 0), To[0], Deleted);
2370    return;
2371  }
2372
2373  while (!From->use_empty()) {
2374    // Process users until they are all gone.
2375    SDNode *U = *From->use_begin();
2376
2377    // This node is about to morph, remove its old self from the CSE maps.
2378    RemoveNodeFromCSEMaps(U);
2379
2380    for (SDOperand *I = U->OperandList, *E = U->OperandList+U->NumOperands;
2381         I != E; ++I)
2382      if (I->Val == From) {
2383        const SDOperand &ToOp = To[I->ResNo];
2384        From->removeUser(U);
2385        *I = ToOp;
2386        ToOp.Val->addUser(U);
2387      }
2388
2389    // Now that we have modified U, add it back to the CSE maps.  If it already
2390    // exists there, recursively merge the results together.
2391    if (SDNode *Existing = AddNonLeafNodeToCSEMaps(U)) {
2392      ReplaceAllUsesWith(U, Existing, Deleted);
2393      // U is now dead.
2394      if (Deleted) Deleted->push_back(U);
2395      DeleteNodeNotInCSEMaps(U);
2396    }
2397  }
2398}
2399
2400/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
2401/// uses of other values produced by From.Val alone.  The Deleted vector is
2402/// handled the same was as for ReplaceAllUsesWith.
2403void SelectionDAG::ReplaceAllUsesOfValueWith(SDOperand From, SDOperand To,
2404                                             std::vector<SDNode*> &Deleted) {
2405  assert(From != To && "Cannot replace a value with itself");
2406  // Handle the simple, trivial, case efficiently.
2407  if (From.Val->getNumValues() == 1 && To.Val->getNumValues() == 1) {
2408    ReplaceAllUsesWith(From, To, &Deleted);
2409    return;
2410  }
2411
2412  // Get all of the users in a nice, deterministically ordered, uniqued set.
2413  SetVector<SDNode*> Users(From.Val->use_begin(), From.Val->use_end());
2414
2415  while (!Users.empty()) {
2416    // We know that this user uses some value of From.  If it is the right
2417    // value, update it.
2418    SDNode *User = Users.back();
2419    Users.pop_back();
2420
2421    for (SDOperand *Op = User->OperandList,
2422         *E = User->OperandList+User->NumOperands; Op != E; ++Op) {
2423      if (*Op == From) {
2424        // Okay, we know this user needs to be updated.  Remove its old self
2425        // from the CSE maps.
2426        RemoveNodeFromCSEMaps(User);
2427
2428        // Update all operands that match "From".
2429        for (; Op != E; ++Op) {
2430          if (*Op == From) {
2431            From.Val->removeUser(User);
2432            *Op = To;
2433            To.Val->addUser(User);
2434          }
2435        }
2436
2437        // Now that we have modified User, add it back to the CSE maps.  If it
2438        // already exists there, recursively merge the results together.
2439        if (SDNode *Existing = AddNonLeafNodeToCSEMaps(User)) {
2440          unsigned NumDeleted = Deleted.size();
2441          ReplaceAllUsesWith(User, Existing, &Deleted);
2442
2443          // User is now dead.
2444          Deleted.push_back(User);
2445          DeleteNodeNotInCSEMaps(User);
2446
2447          // We have to be careful here, because ReplaceAllUsesWith could have
2448          // deleted a user of From, which means there may be dangling pointers
2449          // in the "Users" setvector.  Scan over the deleted node pointers and
2450          // remove them from the setvector.
2451          for (unsigned i = NumDeleted, e = Deleted.size(); i != e; ++i)
2452            Users.remove(Deleted[i]);
2453        }
2454        break;   // Exit the operand scanning loop.
2455      }
2456    }
2457  }
2458}
2459
2460
2461/// AssignNodeIds - Assign a unique node id for each node in the DAG based on
2462/// their allnodes order. It returns the maximum id.
2463unsigned SelectionDAG::AssignNodeIds() {
2464  unsigned Id = 0;
2465  for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ++I){
2466    SDNode *N = I;
2467    N->setNodeId(Id++);
2468  }
2469  return Id;
2470}
2471
2472/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
2473/// based on their topological order. It returns the maximum id and a vector
2474/// of the SDNodes* in assigned order by reference.
2475unsigned SelectionDAG::AssignTopologicalOrder(std::vector<SDNode*> &TopOrder) {
2476  unsigned DAGSize = AllNodes.size();
2477  std::vector<unsigned> InDegree(DAGSize);
2478  std::vector<SDNode*> Sources;
2479
2480  // Use a two pass approach to avoid using a std::map which is slow.
2481  unsigned Id = 0;
2482  for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ++I){
2483    SDNode *N = I;
2484    N->setNodeId(Id++);
2485    unsigned Degree = N->use_size();
2486    InDegree[N->getNodeId()] = Degree;
2487    if (Degree == 0)
2488      Sources.push_back(N);
2489  }
2490
2491  TopOrder.clear();
2492  while (!Sources.empty()) {
2493    SDNode *N = Sources.back();
2494    Sources.pop_back();
2495    TopOrder.push_back(N);
2496    for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I) {
2497      SDNode *P = I->Val;
2498      unsigned Degree = --InDegree[P->getNodeId()];
2499      if (Degree == 0)
2500        Sources.push_back(P);
2501    }
2502  }
2503
2504  // Second pass, assign the actual topological order as node ids.
2505  Id = 0;
2506  for (std::vector<SDNode*>::iterator TI = TopOrder.begin(),TE = TopOrder.end();
2507       TI != TE; ++TI)
2508    (*TI)->setNodeId(Id++);
2509
2510  return Id;
2511}
2512
2513
2514
2515//===----------------------------------------------------------------------===//
2516//                              SDNode Class
2517//===----------------------------------------------------------------------===//
2518
2519// Out-of-line virtual method to give class a home.
2520void SDNode::ANCHOR() {
2521}
2522
2523/// Profile - Gather unique data for the node.
2524///
2525void SDNode::Profile(FoldingSetNodeID &ID) {
2526  AddNodeIDNode(ID, this);
2527}
2528
2529/// getValueTypeList - Return a pointer to the specified value type.
2530///
2531MVT::ValueType *SDNode::getValueTypeList(MVT::ValueType VT) {
2532  static MVT::ValueType VTs[MVT::LAST_VALUETYPE];
2533  VTs[VT] = VT;
2534  return &VTs[VT];
2535}
2536
2537/// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
2538/// indicated value.  This method ignores uses of other values defined by this
2539/// operation.
2540bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const {
2541  assert(Value < getNumValues() && "Bad value!");
2542
2543  // If there is only one value, this is easy.
2544  if (getNumValues() == 1)
2545    return use_size() == NUses;
2546  if (Uses.size() < NUses) return false;
2547
2548  SDOperand TheValue(const_cast<SDNode *>(this), Value);
2549
2550  std::set<SDNode*> UsersHandled;
2551
2552  for (SDNode::use_iterator UI = Uses.begin(), E = Uses.end(); UI != E; ++UI) {
2553    SDNode *User = *UI;
2554    if (User->getNumOperands() == 1 ||
2555        UsersHandled.insert(User).second)     // First time we've seen this?
2556      for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i)
2557        if (User->getOperand(i) == TheValue) {
2558          if (NUses == 0)
2559            return false;   // too many uses
2560          --NUses;
2561        }
2562  }
2563
2564  // Found exactly the right number of uses?
2565  return NUses == 0;
2566}
2567
2568
2569/// isOnlyUse - Return true if this node is the only use of N.
2570///
2571bool SDNode::isOnlyUse(SDNode *N) const {
2572  bool Seen = false;
2573  for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) {
2574    SDNode *User = *I;
2575    if (User == this)
2576      Seen = true;
2577    else
2578      return false;
2579  }
2580
2581  return Seen;
2582}
2583
2584/// isOperand - Return true if this node is an operand of N.
2585///
2586bool SDOperand::isOperand(SDNode *N) const {
2587  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
2588    if (*this == N->getOperand(i))
2589      return true;
2590  return false;
2591}
2592
2593bool SDNode::isOperand(SDNode *N) const {
2594  for (unsigned i = 0, e = N->NumOperands; i != e; ++i)
2595    if (this == N->OperandList[i].Val)
2596      return true;
2597  return false;
2598}
2599
2600static void findPredecessor(SDNode *N, const SDNode *P, bool &found,
2601                            std::set<SDNode *> &Visited) {
2602  if (found || !Visited.insert(N).second)
2603    return;
2604
2605  for (unsigned i = 0, e = N->getNumOperands(); !found && i != e; ++i) {
2606    SDNode *Op = N->getOperand(i).Val;
2607    if (Op == P) {
2608      found = true;
2609      return;
2610    }
2611    findPredecessor(Op, P, found, Visited);
2612  }
2613}
2614
2615/// isPredecessor - Return true if this node is a predecessor of N. This node
2616/// is either an operand of N or it can be reached by recursively traversing
2617/// up the operands.
2618/// NOTE: this is an expensive method. Use it carefully.
2619bool SDNode::isPredecessor(SDNode *N) const {
2620  std::set<SDNode *> Visited;
2621  bool found = false;
2622  findPredecessor(N, this, found, Visited);
2623  return found;
2624}
2625
2626uint64_t SDNode::getConstantOperandVal(unsigned Num) const {
2627  assert(Num < NumOperands && "Invalid child # of SDNode!");
2628  return cast<ConstantSDNode>(OperandList[Num])->getValue();
2629}
2630
2631const char *SDNode::getOperationName(const SelectionDAG *G) const {
2632  switch (getOpcode()) {
2633  default:
2634    if (getOpcode() < ISD::BUILTIN_OP_END)
2635      return "<<Unknown DAG Node>>";
2636    else {
2637      if (G) {
2638        if (const TargetInstrInfo *TII = G->getTarget().getInstrInfo())
2639          if (getOpcode()-ISD::BUILTIN_OP_END < TII->getNumOpcodes())
2640            return TII->getName(getOpcode()-ISD::BUILTIN_OP_END);
2641
2642        TargetLowering &TLI = G->getTargetLoweringInfo();
2643        const char *Name =
2644          TLI.getTargetNodeName(getOpcode());
2645        if (Name) return Name;
2646      }
2647
2648      return "<<Unknown Target Node>>";
2649    }
2650
2651  case ISD::PCMARKER:      return "PCMarker";
2652  case ISD::READCYCLECOUNTER: return "ReadCycleCounter";
2653  case ISD::SRCVALUE:      return "SrcValue";
2654  case ISD::EntryToken:    return "EntryToken";
2655  case ISD::TokenFactor:   return "TokenFactor";
2656  case ISD::AssertSext:    return "AssertSext";
2657  case ISD::AssertZext:    return "AssertZext";
2658
2659  case ISD::STRING:        return "String";
2660  case ISD::BasicBlock:    return "BasicBlock";
2661  case ISD::VALUETYPE:     return "ValueType";
2662  case ISD::Register:      return "Register";
2663
2664  case ISD::Constant:      return "Constant";
2665  case ISD::ConstantFP:    return "ConstantFP";
2666  case ISD::GlobalAddress: return "GlobalAddress";
2667  case ISD::FrameIndex:    return "FrameIndex";
2668  case ISD::JumpTable:     return "JumpTable";
2669  case ISD::GLOBAL_OFFSET_TABLE: return "GLOBAL_OFFSET_TABLE";
2670  case ISD::RETURNADDR: return "RETURNADDR";
2671  case ISD::FRAMEADDR: return "FRAMEADDR";
2672  case ISD::ConstantPool:  return "ConstantPool";
2673  case ISD::ExternalSymbol: return "ExternalSymbol";
2674  case ISD::INTRINSIC_WO_CHAIN: {
2675    unsigned IID = cast<ConstantSDNode>(getOperand(0))->getValue();
2676    return Intrinsic::getName((Intrinsic::ID)IID);
2677  }
2678  case ISD::INTRINSIC_VOID:
2679  case ISD::INTRINSIC_W_CHAIN: {
2680    unsigned IID = cast<ConstantSDNode>(getOperand(1))->getValue();
2681    return Intrinsic::getName((Intrinsic::ID)IID);
2682  }
2683
2684  case ISD::BUILD_VECTOR:   return "BUILD_VECTOR";
2685  case ISD::TargetConstant: return "TargetConstant";
2686  case ISD::TargetConstantFP:return "TargetConstantFP";
2687  case ISD::TargetGlobalAddress: return "TargetGlobalAddress";
2688  case ISD::TargetFrameIndex: return "TargetFrameIndex";
2689  case ISD::TargetJumpTable:  return "TargetJumpTable";
2690  case ISD::TargetConstantPool:  return "TargetConstantPool";
2691  case ISD::TargetExternalSymbol: return "TargetExternalSymbol";
2692
2693  case ISD::CopyToReg:     return "CopyToReg";
2694  case ISD::CopyFromReg:   return "CopyFromReg";
2695  case ISD::UNDEF:         return "undef";
2696  case ISD::MERGE_VALUES:  return "mergevalues";
2697  case ISD::INLINEASM:     return "inlineasm";
2698  case ISD::LABEL:         return "label";
2699  case ISD::HANDLENODE:    return "handlenode";
2700  case ISD::FORMAL_ARGUMENTS: return "formal_arguments";
2701  case ISD::CALL:          return "call";
2702
2703  // Unary operators
2704  case ISD::FABS:   return "fabs";
2705  case ISD::FNEG:   return "fneg";
2706  case ISD::FSQRT:  return "fsqrt";
2707  case ISD::FSIN:   return "fsin";
2708  case ISD::FCOS:   return "fcos";
2709  case ISD::FPOWI:  return "fpowi";
2710
2711  // Binary operators
2712  case ISD::ADD:    return "add";
2713  case ISD::SUB:    return "sub";
2714  case ISD::MUL:    return "mul";
2715  case ISD::MULHU:  return "mulhu";
2716  case ISD::MULHS:  return "mulhs";
2717  case ISD::SDIV:   return "sdiv";
2718  case ISD::UDIV:   return "udiv";
2719  case ISD::SREM:   return "srem";
2720  case ISD::UREM:   return "urem";
2721  case ISD::AND:    return "and";
2722  case ISD::OR:     return "or";
2723  case ISD::XOR:    return "xor";
2724  case ISD::SHL:    return "shl";
2725  case ISD::SRA:    return "sra";
2726  case ISD::SRL:    return "srl";
2727  case ISD::ROTL:   return "rotl";
2728  case ISD::ROTR:   return "rotr";
2729  case ISD::FADD:   return "fadd";
2730  case ISD::FSUB:   return "fsub";
2731  case ISD::FMUL:   return "fmul";
2732  case ISD::FDIV:   return "fdiv";
2733  case ISD::FREM:   return "frem";
2734  case ISD::FCOPYSIGN: return "fcopysign";
2735  case ISD::VADD:   return "vadd";
2736  case ISD::VSUB:   return "vsub";
2737  case ISD::VMUL:   return "vmul";
2738  case ISD::VSDIV:  return "vsdiv";
2739  case ISD::VUDIV:  return "vudiv";
2740  case ISD::VAND:   return "vand";
2741  case ISD::VOR:    return "vor";
2742  case ISD::VXOR:   return "vxor";
2743
2744  case ISD::SETCC:       return "setcc";
2745  case ISD::SELECT:      return "select";
2746  case ISD::SELECT_CC:   return "select_cc";
2747  case ISD::VSELECT:     return "vselect";
2748  case ISD::INSERT_VECTOR_ELT:   return "insert_vector_elt";
2749  case ISD::VINSERT_VECTOR_ELT:  return "vinsert_vector_elt";
2750  case ISD::EXTRACT_VECTOR_ELT:  return "extract_vector_elt";
2751  case ISD::VEXTRACT_VECTOR_ELT: return "vextract_vector_elt";
2752  case ISD::SCALAR_TO_VECTOR:    return "scalar_to_vector";
2753  case ISD::VBUILD_VECTOR:       return "vbuild_vector";
2754  case ISD::VECTOR_SHUFFLE:      return "vector_shuffle";
2755  case ISD::VVECTOR_SHUFFLE:     return "vvector_shuffle";
2756  case ISD::VBIT_CONVERT:        return "vbit_convert";
2757  case ISD::ADDC:        return "addc";
2758  case ISD::ADDE:        return "adde";
2759  case ISD::SUBC:        return "subc";
2760  case ISD::SUBE:        return "sube";
2761  case ISD::SHL_PARTS:   return "shl_parts";
2762  case ISD::SRA_PARTS:   return "sra_parts";
2763  case ISD::SRL_PARTS:   return "srl_parts";
2764
2765  // Conversion operators.
2766  case ISD::SIGN_EXTEND: return "sign_extend";
2767  case ISD::ZERO_EXTEND: return "zero_extend";
2768  case ISD::ANY_EXTEND:  return "any_extend";
2769  case ISD::SIGN_EXTEND_INREG: return "sign_extend_inreg";
2770  case ISD::TRUNCATE:    return "truncate";
2771  case ISD::FP_ROUND:    return "fp_round";
2772  case ISD::FP_ROUND_INREG: return "fp_round_inreg";
2773  case ISD::FP_EXTEND:   return "fp_extend";
2774
2775  case ISD::SINT_TO_FP:  return "sint_to_fp";
2776  case ISD::UINT_TO_FP:  return "uint_to_fp";
2777  case ISD::FP_TO_SINT:  return "fp_to_sint";
2778  case ISD::FP_TO_UINT:  return "fp_to_uint";
2779  case ISD::BIT_CONVERT: return "bit_convert";
2780
2781    // Control flow instructions
2782  case ISD::BR:      return "br";
2783  case ISD::BRIND:   return "brind";
2784  case ISD::BR_JT:   return "br_jt";
2785  case ISD::BRCOND:  return "brcond";
2786  case ISD::BR_CC:   return "br_cc";
2787  case ISD::RET:     return "ret";
2788  case ISD::CALLSEQ_START:  return "callseq_start";
2789  case ISD::CALLSEQ_END:    return "callseq_end";
2790
2791    // Other operators
2792  case ISD::LOAD:               return "load";
2793  case ISD::STORE:              return "store";
2794  case ISD::VLOAD:              return "vload";
2795  case ISD::VAARG:              return "vaarg";
2796  case ISD::VACOPY:             return "vacopy";
2797  case ISD::VAEND:              return "vaend";
2798  case ISD::VASTART:            return "vastart";
2799  case ISD::DYNAMIC_STACKALLOC: return "dynamic_stackalloc";
2800  case ISD::EXTRACT_ELEMENT:    return "extract_element";
2801  case ISD::BUILD_PAIR:         return "build_pair";
2802  case ISD::STACKSAVE:          return "stacksave";
2803  case ISD::STACKRESTORE:       return "stackrestore";
2804
2805  // Block memory operations.
2806  case ISD::MEMSET:  return "memset";
2807  case ISD::MEMCPY:  return "memcpy";
2808  case ISD::MEMMOVE: return "memmove";
2809
2810  // Bit manipulation
2811  case ISD::BSWAP:   return "bswap";
2812  case ISD::CTPOP:   return "ctpop";
2813  case ISD::CTTZ:    return "cttz";
2814  case ISD::CTLZ:    return "ctlz";
2815
2816  // Debug info
2817  case ISD::LOCATION: return "location";
2818  case ISD::DEBUG_LOC: return "debug_loc";
2819
2820  case ISD::CONDCODE:
2821    switch (cast<CondCodeSDNode>(this)->get()) {
2822    default: assert(0 && "Unknown setcc condition!");
2823    case ISD::SETOEQ:  return "setoeq";
2824    case ISD::SETOGT:  return "setogt";
2825    case ISD::SETOGE:  return "setoge";
2826    case ISD::SETOLT:  return "setolt";
2827    case ISD::SETOLE:  return "setole";
2828    case ISD::SETONE:  return "setone";
2829
2830    case ISD::SETO:    return "seto";
2831    case ISD::SETUO:   return "setuo";
2832    case ISD::SETUEQ:  return "setue";
2833    case ISD::SETUGT:  return "setugt";
2834    case ISD::SETUGE:  return "setuge";
2835    case ISD::SETULT:  return "setult";
2836    case ISD::SETULE:  return "setule";
2837    case ISD::SETUNE:  return "setune";
2838
2839    case ISD::SETEQ:   return "seteq";
2840    case ISD::SETGT:   return "setgt";
2841    case ISD::SETGE:   return "setge";
2842    case ISD::SETLT:   return "setlt";
2843    case ISD::SETLE:   return "setle";
2844    case ISD::SETNE:   return "setne";
2845    }
2846  }
2847}
2848
2849const char *SDNode::getIndexedModeName(ISD::MemIndexedMode AM) {
2850  switch (AM) {
2851  default:
2852    return "";
2853  case ISD::PRE_INC:
2854    return "<pre-inc>";
2855  case ISD::PRE_DEC:
2856    return "<pre-dec>";
2857  case ISD::POST_INC:
2858    return "<post-inc>";
2859  case ISD::POST_DEC:
2860    return "<post-dec>";
2861  }
2862}
2863
2864void SDNode::dump() const { dump(0); }
2865void SDNode::dump(const SelectionDAG *G) const {
2866  cerr << (void*)this << ": ";
2867
2868  for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
2869    if (i) cerr << ",";
2870    if (getValueType(i) == MVT::Other)
2871      cerr << "ch";
2872    else
2873      cerr << MVT::getValueTypeString(getValueType(i));
2874  }
2875  cerr << " = " << getOperationName(G);
2876
2877  cerr << " ";
2878  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2879    if (i) cerr << ", ";
2880    cerr << (void*)getOperand(i).Val;
2881    if (unsigned RN = getOperand(i).ResNo)
2882      cerr << ":" << RN;
2883  }
2884
2885  if (const ConstantSDNode *CSDN = dyn_cast<ConstantSDNode>(this)) {
2886    cerr << "<" << CSDN->getValue() << ">";
2887  } else if (const ConstantFPSDNode *CSDN = dyn_cast<ConstantFPSDNode>(this)) {
2888    cerr << "<" << CSDN->getValue() << ">";
2889  } else if (const GlobalAddressSDNode *GADN =
2890             dyn_cast<GlobalAddressSDNode>(this)) {
2891    int offset = GADN->getOffset();
2892    cerr << "<";
2893    WriteAsOperand(*cerr.stream(), GADN->getGlobal()) << ">";
2894    if (offset > 0)
2895      cerr << " + " << offset;
2896    else
2897      cerr << " " << offset;
2898  } else if (const FrameIndexSDNode *FIDN = dyn_cast<FrameIndexSDNode>(this)) {
2899    cerr << "<" << FIDN->getIndex() << ">";
2900  } else if (const JumpTableSDNode *JTDN = dyn_cast<JumpTableSDNode>(this)) {
2901    cerr << "<" << JTDN->getIndex() << ">";
2902  } else if (const ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(this)){
2903    int offset = CP->getOffset();
2904    if (CP->isMachineConstantPoolEntry())
2905      cerr << "<" << *CP->getMachineCPVal() << ">";
2906    else
2907      cerr << "<" << *CP->getConstVal() << ">";
2908    if (offset > 0)
2909      cerr << " + " << offset;
2910    else
2911      cerr << " " << offset;
2912  } else if (const BasicBlockSDNode *BBDN = dyn_cast<BasicBlockSDNode>(this)) {
2913    cerr << "<";
2914    const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock();
2915    if (LBB)
2916      cerr << LBB->getName() << " ";
2917    cerr << (const void*)BBDN->getBasicBlock() << ">";
2918  } else if (const RegisterSDNode *R = dyn_cast<RegisterSDNode>(this)) {
2919    if (G && R->getReg() && MRegisterInfo::isPhysicalRegister(R->getReg())) {
2920      cerr << " " <<G->getTarget().getRegisterInfo()->getName(R->getReg());
2921    } else {
2922      cerr << " #" << R->getReg();
2923    }
2924  } else if (const ExternalSymbolSDNode *ES =
2925             dyn_cast<ExternalSymbolSDNode>(this)) {
2926    cerr << "'" << ES->getSymbol() << "'";
2927  } else if (const SrcValueSDNode *M = dyn_cast<SrcValueSDNode>(this)) {
2928    if (M->getValue())
2929      cerr << "<" << M->getValue() << ":" << M->getOffset() << ">";
2930    else
2931      cerr << "<null:" << M->getOffset() << ">";
2932  } else if (const VTSDNode *N = dyn_cast<VTSDNode>(this)) {
2933    cerr << ":" << getValueTypeString(N->getVT());
2934  } else if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(this)) {
2935    bool doExt = true;
2936    switch (LD->getExtensionType()) {
2937    default: doExt = false; break;
2938    case ISD::EXTLOAD:
2939      cerr << " <anyext ";
2940      break;
2941    case ISD::SEXTLOAD:
2942      cerr << " <sext ";
2943      break;
2944    case ISD::ZEXTLOAD:
2945      cerr << " <zext ";
2946      break;
2947    }
2948    if (doExt)
2949      cerr << MVT::getValueTypeString(LD->getLoadedVT()) << ">";
2950
2951    const char *AM = getIndexedModeName(LD->getAddressingMode());
2952    if (AM != "")
2953      cerr << " " << AM;
2954  } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(this)) {
2955    if (ST->isTruncatingStore())
2956      cerr << " <trunc "
2957           << MVT::getValueTypeString(ST->getStoredVT()) << ">";
2958
2959    const char *AM = getIndexedModeName(ST->getAddressingMode());
2960    if (AM != "")
2961      cerr << " " << AM;
2962  }
2963}
2964
2965static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) {
2966  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
2967    if (N->getOperand(i).Val->hasOneUse())
2968      DumpNodes(N->getOperand(i).Val, indent+2, G);
2969    else
2970      cerr << "\n" << std::string(indent+2, ' ')
2971           << (void*)N->getOperand(i).Val << ": <multiple use>";
2972
2973
2974  cerr << "\n" << std::string(indent, ' ');
2975  N->dump(G);
2976}
2977
2978void SelectionDAG::dump() const {
2979  cerr << "SelectionDAG has " << AllNodes.size() << " nodes:";
2980  std::vector<const SDNode*> Nodes;
2981  for (allnodes_const_iterator I = allnodes_begin(), E = allnodes_end();
2982       I != E; ++I)
2983    Nodes.push_back(I);
2984
2985  std::sort(Nodes.begin(), Nodes.end());
2986
2987  for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
2988    if (!Nodes[i]->hasOneUse() && Nodes[i] != getRoot().Val)
2989      DumpNodes(Nodes[i], 2, this);
2990  }
2991
2992  if (getRoot().Val) DumpNodes(getRoot().Val, 2, this);
2993
2994  cerr << "\n\n";
2995}
2996
2997const Type *ConstantPoolSDNode::getType() const {
2998  if (isMachineConstantPoolEntry())
2999    return Val.MachineCPVal->getType();
3000  return Val.ConstVal->getType();
3001}
3002