LegalizeTypes.cpp revision 6b54ff33bcf5bdcc966f2f560c8f1daa44e263ba
1//===-- LegalizeTypes.cpp - Common code for DAG type legalizer ------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the SelectionDAG::LegalizeTypes method.  It transforms
11// an arbitrary well-formed SelectionDAG to only consist of legal types.  This
12// is common code shared among the LegalizeTypes*.cpp files.
13//
14//===----------------------------------------------------------------------===//
15
16#include "LegalizeTypes.h"
17#include "llvm/CallingConv.h"
18#include "llvm/Support/CommandLine.h"
19#include "llvm/Target/TargetData.h"
20using namespace llvm;
21
22/// run - This is the main entry point for the type legalizer.  This does a
23/// top-down traversal of the dag, legalizing types as it goes.
24void DAGTypeLegalizer::run() {
25  // Create a dummy node (which is not added to allnodes), that adds a reference
26  // to the root node, preventing it from being deleted, and tracking any
27  // changes of the root.
28  HandleSDNode Dummy(DAG.getRoot());
29
30  // The root of the dag may dangle to deleted nodes until the type legalizer is
31  // done.  Set it to null to avoid confusion.
32  DAG.setRoot(SDValue());
33
34  // Walk all nodes in the graph, assigning them a NodeID of 'ReadyToProcess'
35  // (and remembering them) if they are leaves and assigning 'NewNode' if
36  // non-leaves.
37  for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(),
38       E = DAG.allnodes_end(); I != E; ++I) {
39    if (I->getNumOperands() == 0) {
40      I->setNodeId(ReadyToProcess);
41      Worklist.push_back(I);
42    } else {
43      I->setNodeId(NewNode);
44    }
45  }
46
47  // Now that we have a set of nodes to process, handle them all.
48  while (!Worklist.empty()) {
49    SDNode *N = Worklist.back();
50    Worklist.pop_back();
51    assert(N->getNodeId() == ReadyToProcess &&
52           "Node should be ready if on worklist!");
53
54    if (IgnoreNodeResults(N))
55      goto ScanOperands;
56
57    // Scan the values produced by the node, checking to see if any result
58    // types are illegal.
59    for (unsigned i = 0, NumResults = N->getNumValues(); i < NumResults; ++i) {
60      MVT ResultVT = N->getValueType(i);
61      switch (getTypeAction(ResultVT)) {
62      default:
63        assert(false && "Unknown action!");
64      case Legal:
65        break;
66      case PromoteInteger:
67        PromoteIntegerResult(N, i);
68        goto NodeDone;
69      case ExpandInteger:
70        ExpandIntegerResult(N, i);
71        goto NodeDone;
72      case SoftenFloat:
73        SoftenFloatResult(N, i);
74        goto NodeDone;
75      case ExpandFloat:
76        ExpandFloatResult(N, i);
77        goto NodeDone;
78      case ScalarizeVector:
79        ScalarizeVectorResult(N, i);
80        goto NodeDone;
81      case SplitVector:
82        SplitVectorResult(N, i);
83        goto NodeDone;
84      }
85    }
86
87ScanOperands:
88    // Scan the operand list for the node, handling any nodes with operands that
89    // are illegal.
90    {
91    unsigned NumOperands = N->getNumOperands();
92    bool NeedsRevisit = false;
93    unsigned i;
94    for (i = 0; i != NumOperands; ++i) {
95      if (IgnoreNodeResults(N->getOperand(i).getNode()))
96        continue;
97
98      MVT OpVT = N->getOperand(i).getValueType();
99      switch (getTypeAction(OpVT)) {
100      default:
101        assert(false && "Unknown action!");
102      case Legal:
103        continue;
104      case PromoteInteger:
105        NeedsRevisit = PromoteIntegerOperand(N, i);
106        break;
107      case ExpandInteger:
108        NeedsRevisit = ExpandIntegerOperand(N, i);
109        break;
110      case SoftenFloat:
111        NeedsRevisit = SoftenFloatOperand(N, i);
112        break;
113      case ExpandFloat:
114        NeedsRevisit = ExpandFloatOperand(N, i);
115        break;
116      case ScalarizeVector:
117        NeedsRevisit = ScalarizeVectorOperand(N, i);
118        break;
119      case SplitVector:
120        NeedsRevisit = SplitVectorOperand(N, i);
121        break;
122      }
123      break;
124    }
125
126    // If the node needs revisiting, don't add all users to the worklist etc.
127    if (NeedsRevisit)
128      continue;
129
130    if (i == NumOperands) {
131      DEBUG(cerr << "Legally typed node: "; N->dump(&DAG); cerr << "\n");
132    }
133    }
134NodeDone:
135
136    // If we reach here, the node was processed, potentially creating new nodes.
137    // Mark it as processed and add its users to the worklist as appropriate.
138    N->setNodeId(Processed);
139
140    for (SDNode::use_iterator UI = N->use_begin(), E = N->use_end();
141         UI != E; ++UI) {
142      SDNode *User = *UI;
143      int NodeID = User->getNodeId();
144      assert(NodeID != ReadyToProcess && NodeID != Processed &&
145             "Invalid node id for user of unprocessed node!");
146
147      // This node has two options: it can either be a new node or its Node ID
148      // may be a count of the number of operands it has that are not ready.
149      if (NodeID > 0) {
150        User->setNodeId(NodeID-1);
151
152        // If this was the last use it was waiting on, add it to the ready list.
153        if (NodeID-1 == ReadyToProcess)
154          Worklist.push_back(User);
155        continue;
156      }
157
158      // Otherwise, this node is new: this is the first operand of it that
159      // became ready.  Its new NodeID is the number of operands it has minus 1
160      // (as this node is now processed).
161      assert(NodeID == NewNode && "Unknown node ID!");
162      User->setNodeId(User->getNumOperands()-1);
163
164      // If the node only has a single operand, it is now ready.
165      if (User->getNumOperands() == 1)
166        Worklist.push_back(User);
167    }
168  }
169
170  // If the root changed (e.g. it was a dead load, update the root).
171  DAG.setRoot(Dummy.getValue());
172
173  //DAG.viewGraph();
174
175  // Remove dead nodes.  This is important to do for cleanliness but also before
176  // the checking loop below.  Implicit folding by the DAG.getNode operators can
177  // cause unreachable nodes to be around with their flags set to new.
178  DAG.RemoveDeadNodes();
179
180  // In a debug build, scan all the nodes to make sure we found them all.  This
181  // ensures that there are no cycles and that everything got processed.
182#ifndef NDEBUG
183  for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(),
184       E = DAG.allnodes_end(); I != E; ++I) {
185    bool Failed = false;
186
187    // Check that all result types are legal.
188    if (!IgnoreNodeResults(I))
189      for (unsigned i = 0, NumVals = I->getNumValues(); i < NumVals; ++i)
190        if (!isTypeLegal(I->getValueType(i))) {
191          cerr << "Result type " << i << " illegal!\n";
192          Failed = true;
193        }
194
195    // Check that all operand types are legal.
196    for (unsigned i = 0, NumOps = I->getNumOperands(); i < NumOps; ++i)
197      if (!IgnoreNodeResults(I->getOperand(i).getNode()) &&
198          !isTypeLegal(I->getOperand(i).getValueType())) {
199        cerr << "Operand type " << i << " illegal!\n";
200        Failed = true;
201      }
202
203    if (I->getNodeId() != Processed) {
204       if (I->getNodeId() == NewNode)
205         cerr << "New node not 'noticed'?\n";
206       else if (I->getNodeId() > 0)
207         cerr << "Operand not processed?\n";
208       else if (I->getNodeId() == ReadyToProcess)
209         cerr << "Not added to worklist?\n";
210       Failed = true;
211    }
212
213    if (Failed) {
214      I->dump(&DAG); cerr << "\n";
215      abort();
216    }
217  }
218#endif
219}
220
221/// AnalyzeNewNode - The specified node is the root of a subtree of potentially
222/// new nodes.  Correct any processed operands (this may change the node) and
223/// calculate the NodeId.
224/// Returns the potentially changed node.
225SDNode *DAGTypeLegalizer::AnalyzeNewNode(SDNode *N) {
226  // If this was an existing node that is already done, we're done.
227  if (N->getNodeId() != NewNode)
228    return N;
229
230  // Remove any stale map entries.
231  ExpungeNode(N);
232
233  // Okay, we know that this node is new.  Recursively walk all of its operands
234  // to see if they are new also.  The depth of this walk is bounded by the size
235  // of the new tree that was constructed (usually 2-3 nodes), so we don't worry
236  // about revisiting of nodes.
237  //
238  // As we walk the operands, keep track of the number of nodes that are
239  // processed.  If non-zero, this will become the new nodeid of this node.
240  // Already processed operands may need to be remapped to the node that
241  // replaced them, which can result in our node changing.  Since remapping
242  // is rare, the code tries to minimize overhead in the non-remapping case.
243
244  SmallVector<SDValue, 8> NewOps;
245  unsigned NumProcessed = 0;
246  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
247    SDValue OrigOp = N->getOperand(i);
248    SDValue Op = OrigOp;
249
250    if (Op.getNode()->getNodeId() == Processed)
251      RemapNode(Op);
252
253    if (Op.getNode()->getNodeId() == NewNode)
254      AnalyzeNewNode(Op);
255    else if (Op.getNode()->getNodeId() == Processed)
256      ++NumProcessed;
257
258    if (!NewOps.empty()) {
259      // Some previous operand changed.  Add this one to the list.
260      NewOps.push_back(Op);
261    } else if (Op != OrigOp) {
262      // This is the first operand to change - add all operands so far.
263      for (unsigned j = 0; j < i; ++j)
264        NewOps.push_back(N->getOperand(j));
265      NewOps.push_back(Op);
266    }
267  }
268
269  // Some operands changed - update the node.
270  if (!NewOps.empty())
271    N = DAG.UpdateNodeOperands(SDValue(N, 0),
272                               &NewOps[0],
273                               NewOps.size()).getNode();
274
275  N->setNodeId(N->getNumOperands()-NumProcessed);
276  if (N->getNodeId() == ReadyToProcess)
277    Worklist.push_back(N);
278  return N;
279}
280
281/// AnalyzeNewNode - call AnalyzeNewNode(SDNode *N)
282/// and update the node in SDValue if necessary.
283void DAGTypeLegalizer::AnalyzeNewNode(SDValue &Val) {
284  SDNode *N(Val.getNode());
285  SDNode *M(AnalyzeNewNode(N));
286  if (N != M)
287    Val.setNode(M);
288}
289
290
291namespace {
292  /// NodeUpdateListener - This class is a DAGUpdateListener that listens for
293  /// updates to nodes and recomputes their ready state.
294  class VISIBILITY_HIDDEN NodeUpdateListener :
295    public SelectionDAG::DAGUpdateListener {
296    DAGTypeLegalizer &DTL;
297  public:
298    explicit NodeUpdateListener(DAGTypeLegalizer &dtl) : DTL(dtl) {}
299
300    virtual void NodeDeleted(SDNode *N, SDNode *E) {
301      assert(N->getNodeId() != DAGTypeLegalizer::Processed &&
302             N->getNodeId() != DAGTypeLegalizer::ReadyToProcess &&
303             "RAUW deleted processed node!");
304      // It is possible, though rare, for the deleted node N to occur as a
305      // target in a map, so note the replacement N -> E in ReplacedNodes.
306      assert(E && "Node not replaced?");
307      DTL.NoteDeletion(N, E);
308    }
309
310    virtual void NodeUpdated(SDNode *N) {
311      // Node updates can mean pretty much anything.  It is possible that an
312      // operand was set to something already processed (f.e.) in which case
313      // this node could become ready.  Recompute its flags.
314      assert(N->getNodeId() != DAGTypeLegalizer::Processed &&
315             N->getNodeId() != DAGTypeLegalizer::ReadyToProcess &&
316             "RAUW updated processed node!");
317      DTL.ReanalyzeNode(N);
318    }
319  };
320}
321
322
323/// ReplaceValueWith - The specified value was legalized to the specified other
324/// value.  If they are different, update the DAG and NodeIDs replacing any uses
325/// of From to use To instead.
326void DAGTypeLegalizer::ReplaceValueWith(SDValue From, SDValue To) {
327  if (From == To) return;
328
329  // If expansion produced new nodes, make sure they are properly marked.
330  ExpungeNode(From.getNode());
331  AnalyzeNewNode(To); // Expunges To.
332
333  // Anything that used the old node should now use the new one.  Note that this
334  // can potentially cause recursive merging.
335  NodeUpdateListener NUL(*this);
336  DAG.ReplaceAllUsesOfValueWith(From, To, &NUL);
337
338  // The old node may still be present in a map like ExpandedIntegers or
339  // PromotedIntegers.  Inform maps about the replacement.
340  ReplacedNodes[From] = To;
341}
342
343/// ReplaceNodeWith - Replace uses of the 'from' node's results with the 'to'
344/// node's results.  The from and to node must define identical result types.
345void DAGTypeLegalizer::ReplaceNodeWith(SDNode *From, SDNode *To) {
346  if (From == To) return;
347
348  // If expansion produced new nodes, make sure they are properly marked.
349  ExpungeNode(From);
350
351  To = AnalyzeNewNode(To); // Expunges To.
352
353  assert(From->getNumValues() == To->getNumValues() &&
354         "Node results don't match");
355
356  // Anything that used the old node should now use the new one.  Note that this
357  // can potentially cause recursive merging.
358  NodeUpdateListener NUL(*this);
359  DAG.ReplaceAllUsesWith(From, To, &NUL);
360
361  // The old node may still be present in a map like ExpandedIntegers or
362  // PromotedIntegers.  Inform maps about the replacement.
363  for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
364    assert(From->getValueType(i) == To->getValueType(i) &&
365           "Node results don't match");
366    ReplacedNodes[SDValue(From, i)] = SDValue(To, i);
367  }
368}
369
370/// RemapNode - If the specified value was already legalized to another value,
371/// replace it by that value.
372void DAGTypeLegalizer::RemapNode(SDValue &N) {
373  DenseMap<SDValue, SDValue>::iterator I = ReplacedNodes.find(N);
374  if (I != ReplacedNodes.end()) {
375    // Use path compression to speed up future lookups if values get multiply
376    // replaced with other values.
377    RemapNode(I->second);
378    N = I->second;
379  }
380}
381
382/// ExpungeNode - If N has a bogus mapping in ReplacedNodes, eliminate it.
383/// This can occur when a node is deleted then reallocated as a new node -
384/// the mapping in ReplacedNodes applies to the deleted node, not the new
385/// one.
386/// The only map that can have a deleted node as a source is ReplacedNodes.
387/// Other maps can have deleted nodes as targets, but since their looked-up
388/// values are always immediately remapped using RemapNode, resulting in a
389/// not-deleted node, this is harmless as long as ReplacedNodes/RemapNode
390/// always performs correct mappings.  In order to keep the mapping correct,
391/// ExpungeNode should be called on any new nodes *before* adding them as
392/// either source or target to ReplacedNodes (which typically means calling
393/// Expunge when a new node is first seen, since it may no longer be marked
394/// NewNode by the time it is added to ReplacedNodes).
395void DAGTypeLegalizer::ExpungeNode(SDNode *N) {
396  if (N->getNodeId() != NewNode)
397    return;
398
399  // If N is not remapped by ReplacedNodes then there is nothing to do.
400  unsigned i, e;
401  for (i = 0, e = N->getNumValues(); i != e; ++i)
402    if (ReplacedNodes.find(SDValue(N, i)) != ReplacedNodes.end())
403      break;
404
405  if (i == e)
406    return;
407
408  // Remove N from all maps - this is expensive but rare.
409
410  for (DenseMap<SDValue, SDValue>::iterator I = PromotedIntegers.begin(),
411       E = PromotedIntegers.end(); I != E; ++I) {
412    assert(I->first.getNode() != N);
413    RemapNode(I->second);
414  }
415
416  for (DenseMap<SDValue, SDValue>::iterator I = SoftenedFloats.begin(),
417       E = SoftenedFloats.end(); I != E; ++I) {
418    assert(I->first.getNode() != N);
419    RemapNode(I->second);
420  }
421
422  for (DenseMap<SDValue, SDValue>::iterator I = ScalarizedVectors.begin(),
423       E = ScalarizedVectors.end(); I != E; ++I) {
424    assert(I->first.getNode() != N);
425    RemapNode(I->second);
426  }
427
428  for (DenseMap<SDValue, std::pair<SDValue, SDValue> >::iterator
429       I = ExpandedIntegers.begin(), E = ExpandedIntegers.end(); I != E; ++I){
430    assert(I->first.getNode() != N);
431    RemapNode(I->second.first);
432    RemapNode(I->second.second);
433  }
434
435  for (DenseMap<SDValue, std::pair<SDValue, SDValue> >::iterator
436       I = ExpandedFloats.begin(), E = ExpandedFloats.end(); I != E; ++I) {
437    assert(I->first.getNode() != N);
438    RemapNode(I->second.first);
439    RemapNode(I->second.second);
440  }
441
442  for (DenseMap<SDValue, std::pair<SDValue, SDValue> >::iterator
443       I = SplitVectors.begin(), E = SplitVectors.end(); I != E; ++I) {
444    assert(I->first.getNode() != N);
445    RemapNode(I->second.first);
446    RemapNode(I->second.second);
447  }
448
449  for (DenseMap<SDValue, SDValue>::iterator I = ReplacedNodes.begin(),
450       E = ReplacedNodes.end(); I != E; ++I)
451    RemapNode(I->second);
452
453  for (unsigned i = 0, e = N->getNumValues(); i != e; ++i)
454    ReplacedNodes.erase(SDValue(N, i));
455}
456
457void DAGTypeLegalizer::SetPromotedInteger(SDValue Op, SDValue Result) {
458  AnalyzeNewNode(Result);
459
460  SDValue &OpEntry = PromotedIntegers[Op];
461  assert(OpEntry.getNode() == 0 && "Node is already promoted!");
462  OpEntry = Result;
463}
464
465void DAGTypeLegalizer::SetSoftenedFloat(SDValue Op, SDValue Result) {
466  AnalyzeNewNode(Result);
467
468  SDValue &OpEntry = SoftenedFloats[Op];
469  assert(OpEntry.getNode() == 0 && "Node is already converted to integer!");
470  OpEntry = Result;
471}
472
473void DAGTypeLegalizer::SetScalarizedVector(SDValue Op, SDValue Result) {
474  AnalyzeNewNode(Result);
475
476  SDValue &OpEntry = ScalarizedVectors[Op];
477  assert(OpEntry.getNode() == 0 && "Node is already scalarized!");
478  OpEntry = Result;
479}
480
481void DAGTypeLegalizer::GetExpandedInteger(SDValue Op, SDValue &Lo,
482                                          SDValue &Hi) {
483  std::pair<SDValue, SDValue> &Entry = ExpandedIntegers[Op];
484  RemapNode(Entry.first);
485  RemapNode(Entry.second);
486  assert(Entry.first.getNode() && "Operand isn't expanded");
487  Lo = Entry.first;
488  Hi = Entry.second;
489}
490
491void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo,
492                                          SDValue Hi) {
493  // Lo/Hi may have been newly allocated, if so, add nodeid's as relevant.
494  AnalyzeNewNode(Lo);
495  AnalyzeNewNode(Hi);
496
497  // Remember that this is the result of the node.
498  std::pair<SDValue, SDValue> &Entry = ExpandedIntegers[Op];
499  assert(Entry.first.getNode() == 0 && "Node already expanded");
500  Entry.first = Lo;
501  Entry.second = Hi;
502}
503
504void DAGTypeLegalizer::GetExpandedFloat(SDValue Op, SDValue &Lo,
505                                        SDValue &Hi) {
506  std::pair<SDValue, SDValue> &Entry = ExpandedFloats[Op];
507  RemapNode(Entry.first);
508  RemapNode(Entry.second);
509  assert(Entry.first.getNode() && "Operand isn't expanded");
510  Lo = Entry.first;
511  Hi = Entry.second;
512}
513
514void DAGTypeLegalizer::SetExpandedFloat(SDValue Op, SDValue Lo,
515                                        SDValue Hi) {
516  // Lo/Hi may have been newly allocated, if so, add nodeid's as relevant.
517  AnalyzeNewNode(Lo);
518  AnalyzeNewNode(Hi);
519
520  // Remember that this is the result of the node.
521  std::pair<SDValue, SDValue> &Entry = ExpandedFloats[Op];
522  assert(Entry.first.getNode() == 0 && "Node already expanded");
523  Entry.first = Lo;
524  Entry.second = Hi;
525}
526
527void DAGTypeLegalizer::GetSplitVector(SDValue Op, SDValue &Lo,
528                                      SDValue &Hi) {
529  std::pair<SDValue, SDValue> &Entry = SplitVectors[Op];
530  RemapNode(Entry.first);
531  RemapNode(Entry.second);
532  assert(Entry.first.getNode() && "Operand isn't split");
533  Lo = Entry.first;
534  Hi = Entry.second;
535}
536
537void DAGTypeLegalizer::SetSplitVector(SDValue Op, SDValue Lo,
538                                      SDValue Hi) {
539  // Lo/Hi may have been newly allocated, if so, add nodeid's as relevant.
540  AnalyzeNewNode(Lo);
541  AnalyzeNewNode(Hi);
542
543  // Remember that this is the result of the node.
544  std::pair<SDValue, SDValue> &Entry = SplitVectors[Op];
545  assert(Entry.first.getNode() == 0 && "Node already split");
546  Entry.first = Lo;
547  Entry.second = Hi;
548}
549
550
551//===----------------------------------------------------------------------===//
552// Utilities.
553//===----------------------------------------------------------------------===//
554
555/// BitConvertToInteger - Convert to an integer of the same size.
556SDValue DAGTypeLegalizer::BitConvertToInteger(SDValue Op) {
557  unsigned BitWidth = Op.getValueType().getSizeInBits();
558  return DAG.getNode(ISD::BIT_CONVERT, MVT::getIntegerVT(BitWidth), Op);
559}
560
561SDValue DAGTypeLegalizer::CreateStackStoreLoad(SDValue Op,
562                                               MVT DestVT) {
563  // Create the stack frame object.  Make sure it is aligned for both
564  // the source and destination types.
565  unsigned SrcAlign =
566   TLI.getTargetData()->getPrefTypeAlignment(Op.getValueType().getTypeForMVT());
567  SDValue FIPtr = DAG.CreateStackTemporary(DestVT, SrcAlign);
568
569  // Emit a store to the stack slot.
570  SDValue Store = DAG.getStore(DAG.getEntryNode(), Op, FIPtr, NULL, 0);
571  // Result is a load from the stack slot.
572  return DAG.getLoad(DestVT, Store, FIPtr, NULL, 0);
573}
574
575/// JoinIntegers - Build an integer with low bits Lo and high bits Hi.
576SDValue DAGTypeLegalizer::JoinIntegers(SDValue Lo, SDValue Hi) {
577  MVT LVT = Lo.getValueType();
578  MVT HVT = Hi.getValueType();
579  MVT NVT = MVT::getIntegerVT(LVT.getSizeInBits() + HVT.getSizeInBits());
580
581  Lo = DAG.getNode(ISD::ZERO_EXTEND, NVT, Lo);
582  Hi = DAG.getNode(ISD::ANY_EXTEND, NVT, Hi);
583  Hi = DAG.getNode(ISD::SHL, NVT, Hi, DAG.getConstant(LVT.getSizeInBits(),
584                                                      TLI.getShiftAmountTy()));
585  return DAG.getNode(ISD::OR, NVT, Lo, Hi);
586}
587
588/// SplitInteger - Return the lower LoVT bits of Op in Lo and the upper HiVT
589/// bits in Hi.
590void DAGTypeLegalizer::SplitInteger(SDValue Op,
591                                    MVT LoVT, MVT HiVT,
592                                    SDValue &Lo, SDValue &Hi) {
593  assert(LoVT.getSizeInBits() + HiVT.getSizeInBits() ==
594         Op.getValueType().getSizeInBits() && "Invalid integer splitting!");
595  Lo = DAG.getNode(ISD::TRUNCATE, LoVT, Op);
596  Hi = DAG.getNode(ISD::SRL, Op.getValueType(), Op,
597                   DAG.getConstant(LoVT.getSizeInBits(),
598                                   TLI.getShiftAmountTy()));
599  Hi = DAG.getNode(ISD::TRUNCATE, HiVT, Hi);
600}
601
602/// SplitInteger - Return the lower and upper halves of Op's bits in a value type
603/// half the size of Op's.
604void DAGTypeLegalizer::SplitInteger(SDValue Op,
605                                    SDValue &Lo, SDValue &Hi) {
606  MVT HalfVT = MVT::getIntegerVT(Op.getValueType().getSizeInBits()/2);
607  SplitInteger(Op, HalfVT, HalfVT, Lo, Hi);
608}
609
610/// MakeLibCall - Generate a libcall taking the given operands as arguments and
611/// returning a result of type RetVT.
612SDValue DAGTypeLegalizer::MakeLibCall(RTLIB::Libcall LC, MVT RetVT,
613                                      const SDValue *Ops, unsigned NumOps,
614                                      bool isSigned) {
615  TargetLowering::ArgListTy Args;
616  Args.reserve(NumOps);
617
618  TargetLowering::ArgListEntry Entry;
619  for (unsigned i = 0; i != NumOps; ++i) {
620    Entry.Node = Ops[i];
621    Entry.Ty = Entry.Node.getValueType().getTypeForMVT();
622    Entry.isSExt = isSigned;
623    Entry.isZExt = !isSigned;
624    Args.push_back(Entry);
625  }
626  SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
627                                           TLI.getPointerTy());
628
629  const Type *RetTy = RetVT.getTypeForMVT();
630  std::pair<SDValue,SDValue> CallInfo =
631    TLI.LowerCallTo(DAG.getEntryNode(), RetTy, isSigned, !isSigned, false,
632                    CallingConv::C, false, Callee, Args, DAG);
633  return CallInfo.first;
634}
635
636SDValue DAGTypeLegalizer::GetVectorElementPointer(SDValue VecPtr, MVT EltVT,
637                                                  SDValue Index) {
638  // Make sure the index type is big enough to compute in.
639  if (Index.getValueType().bitsGT(TLI.getPointerTy()))
640    Index = DAG.getNode(ISD::TRUNCATE, TLI.getPointerTy(), Index);
641  else
642    Index = DAG.getNode(ISD::ZERO_EXTEND, TLI.getPointerTy(), Index);
643
644  // Calculate the element offset and add it to the pointer.
645  unsigned EltSize = EltVT.getSizeInBits() / 8; // FIXME: should be ABI size.
646
647  Index = DAG.getNode(ISD::MUL, Index.getValueType(), Index,
648                      DAG.getConstant(EltSize, Index.getValueType()));
649  return DAG.getNode(ISD::ADD, Index.getValueType(), Index, VecPtr);
650}
651
652/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
653/// which is split into two not necessarily identical pieces.
654void DAGTypeLegalizer::GetSplitDestVTs(MVT InVT, MVT &LoVT, MVT &HiVT) {
655  if (!InVT.isVector()) {
656    LoVT = HiVT = TLI.getTypeToTransformTo(InVT);
657  } else {
658    MVT NewEltVT = InVT.getVectorElementType();
659    unsigned NumElements = InVT.getVectorNumElements();
660    if ((NumElements & (NumElements-1)) == 0) {  // Simple power of two vector.
661      NumElements >>= 1;
662      LoVT = HiVT =  MVT::getVectorVT(NewEltVT, NumElements);
663    } else {                                     // Non-power-of-two vectors.
664      unsigned NewNumElts_Lo = 1 << Log2_32(NumElements);
665      unsigned NewNumElts_Hi = NumElements - NewNumElts_Lo;
666      LoVT = MVT::getVectorVT(NewEltVT, NewNumElts_Lo);
667      HiVT = MVT::getVectorVT(NewEltVT, NewNumElts_Hi);
668    }
669  }
670}
671
672
673//===----------------------------------------------------------------------===//
674//  Entry Point
675//===----------------------------------------------------------------------===//
676
677/// LegalizeTypes - This transforms the SelectionDAG into a SelectionDAG that
678/// only uses types natively supported by the target.
679///
680/// Note that this is an involved process that may invalidate pointers into
681/// the graph.
682void SelectionDAG::LegalizeTypes() {
683  DAGTypeLegalizer(*this).run();
684}
685