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