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