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