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 "SDNodeDbgValue.h"
18 #include "llvm/ADT/SetVector.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/IR/CallingConv.h"
21 #include "llvm/IR/DataLayout.h"
22 #include "llvm/Support/CommandLine.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/raw_ostream.h"
25 using namespace llvm;
26
27 #define DEBUG_TYPE "legalize-types"
28
29 static cl::opt<bool>
30 EnableExpensiveChecks("enable-legalize-types-checking", cl::Hidden);
31
32 /// Do extensive, expensive, sanity checking.
PerformExpensiveChecks()33 void DAGTypeLegalizer::PerformExpensiveChecks() {
34 // If a node is not processed, then none of its values should be mapped by any
35 // of PromotedIntegers, ExpandedIntegers, ..., ReplacedValues.
36
37 // If a node is processed, then each value with an illegal type must be mapped
38 // by exactly one of PromotedIntegers, ExpandedIntegers, ..., ReplacedValues.
39 // Values with a legal type may be mapped by ReplacedValues, but not by any of
40 // the other maps.
41
42 // Note that these invariants may not hold momentarily when processing a node:
43 // the node being processed may be put in a map before being marked Processed.
44
45 // Note that it is possible to have nodes marked NewNode in the DAG. This can
46 // occur in two ways. Firstly, a node may be created during legalization but
47 // never passed to the legalization core. This is usually due to the implicit
48 // folding that occurs when using the DAG.getNode operators. Secondly, a new
49 // node may be passed to the legalization core, but when analyzed may morph
50 // into a different node, leaving the original node as a NewNode in the DAG.
51 // A node may morph if one of its operands changes during analysis. Whether
52 // it actually morphs or not depends on whether, after updating its operands,
53 // it is equivalent to an existing node: if so, it morphs into that existing
54 // node (CSE). An operand can change during analysis if the operand is a new
55 // node that morphs, or it is a processed value that was mapped to some other
56 // value (as recorded in ReplacedValues) in which case the operand is turned
57 // into that other value. If a node morphs then the node it morphed into will
58 // be used instead of it for legalization, however the original node continues
59 // to live on in the DAG.
60 // The conclusion is that though there may be nodes marked NewNode in the DAG,
61 // all uses of such nodes are also marked NewNode: the result is a fungus of
62 // NewNodes growing on top of the useful nodes, and perhaps using them, but
63 // not used by them.
64
65 // If a value is mapped by ReplacedValues, then it must have no uses, except
66 // by nodes marked NewNode (see above).
67
68 // The final node obtained by mapping by ReplacedValues is not marked NewNode.
69 // Note that ReplacedValues should be applied iteratively.
70
71 // Note that the ReplacedValues map may also map deleted nodes (by iterating
72 // over the DAG we never dereference deleted nodes). This means that it may
73 // also map nodes marked NewNode if the deallocated memory was reallocated as
74 // another node, and that new node was not seen by the LegalizeTypes machinery
75 // (for example because it was created but not used). In general, we cannot
76 // distinguish between new nodes and deleted nodes.
77 SmallVector<SDNode*, 16> NewNodes;
78 for (SDNode &Node : DAG.allnodes()) {
79 // Remember nodes marked NewNode - they are subject to extra checking below.
80 if (Node.getNodeId() == NewNode)
81 NewNodes.push_back(&Node);
82
83 for (unsigned i = 0, e = Node.getNumValues(); i != e; ++i) {
84 SDValue Res(&Node, i);
85 EVT VT = Res.getValueType();
86 bool Failed = false;
87 // Don't create a value in map.
88 auto ResId = (ValueToIdMap.count(Res)) ? ValueToIdMap[Res] : 0;
89
90 unsigned Mapped = 0;
91 if (ResId && (ReplacedValues.find(ResId) != ReplacedValues.end())) {
92 Mapped |= 1;
93 // Check that remapped values are only used by nodes marked NewNode.
94 for (SDNode::use_iterator UI = Node.use_begin(), UE = Node.use_end();
95 UI != UE; ++UI)
96 if (UI.getUse().getResNo() == i)
97 assert(UI->getNodeId() == NewNode &&
98 "Remapped value has non-trivial use!");
99
100 // Check that the final result of applying ReplacedValues is not
101 // marked NewNode.
102 auto NewValId = ReplacedValues[ResId];
103 auto I = ReplacedValues.find(NewValId);
104 while (I != ReplacedValues.end()) {
105 NewValId = I->second;
106 I = ReplacedValues.find(NewValId);
107 }
108 SDValue NewVal = getSDValue(NewValId);
109 (void)NewVal;
110 assert(NewVal.getNode()->getNodeId() != NewNode &&
111 "ReplacedValues maps to a new node!");
112 }
113 if (ResId && PromotedIntegers.find(ResId) != PromotedIntegers.end())
114 Mapped |= 2;
115 if (ResId && SoftenedFloats.find(ResId) != SoftenedFloats.end())
116 Mapped |= 4;
117 if (ResId && ScalarizedVectors.find(ResId) != ScalarizedVectors.end())
118 Mapped |= 8;
119 if (ResId && ExpandedIntegers.find(ResId) != ExpandedIntegers.end())
120 Mapped |= 16;
121 if (ResId && ExpandedFloats.find(ResId) != ExpandedFloats.end())
122 Mapped |= 32;
123 if (ResId && SplitVectors.find(ResId) != SplitVectors.end())
124 Mapped |= 64;
125 if (ResId && WidenedVectors.find(ResId) != WidenedVectors.end())
126 Mapped |= 128;
127 if (ResId && PromotedFloats.find(ResId) != PromotedFloats.end())
128 Mapped |= 256;
129
130 if (Node.getNodeId() != Processed) {
131 // Since we allow ReplacedValues to map deleted nodes, it may map nodes
132 // marked NewNode too, since a deleted node may have been reallocated as
133 // another node that has not been seen by the LegalizeTypes machinery.
134 if ((Node.getNodeId() == NewNode && Mapped > 1) ||
135 (Node.getNodeId() != NewNode && Mapped != 0)) {
136 dbgs() << "Unprocessed value in a map!";
137 Failed = true;
138 }
139 } else if (isTypeLegal(VT) || IgnoreNodeResults(&Node)) {
140 if (Mapped > 1) {
141 dbgs() << "Value with legal type was transformed!";
142 Failed = true;
143 }
144 } else {
145 // If the value can be kept in HW registers, softening machinery can
146 // leave it unchanged and don't put it to any map.
147 if (Mapped == 0 &&
148 !(getTypeAction(VT) == TargetLowering::TypeSoftenFloat &&
149 isLegalInHWReg(VT))) {
150 dbgs() << "Processed value not in any map!";
151 Failed = true;
152 } else if (Mapped & (Mapped - 1)) {
153 dbgs() << "Value in multiple maps!";
154 Failed = true;
155 }
156 }
157
158 if (Failed) {
159 if (Mapped & 1)
160 dbgs() << " ReplacedValues";
161 if (Mapped & 2)
162 dbgs() << " PromotedIntegers";
163 if (Mapped & 4)
164 dbgs() << " SoftenedFloats";
165 if (Mapped & 8)
166 dbgs() << " ScalarizedVectors";
167 if (Mapped & 16)
168 dbgs() << " ExpandedIntegers";
169 if (Mapped & 32)
170 dbgs() << " ExpandedFloats";
171 if (Mapped & 64)
172 dbgs() << " SplitVectors";
173 if (Mapped & 128)
174 dbgs() << " WidenedVectors";
175 if (Mapped & 256)
176 dbgs() << " PromotedFloats";
177 dbgs() << "\n";
178 llvm_unreachable(nullptr);
179 }
180 }
181 }
182
183 // Checked that NewNodes are only used by other NewNodes.
184 for (unsigned i = 0, e = NewNodes.size(); i != e; ++i) {
185 SDNode *N = NewNodes[i];
186 for (SDNode::use_iterator UI = N->use_begin(), UE = N->use_end();
187 UI != UE; ++UI)
188 assert(UI->getNodeId() == NewNode && "NewNode used by non-NewNode!");
189 }
190 }
191
192 /// This is the main entry point for the type legalizer. This does a top-down
193 /// traversal of the dag, legalizing types as it goes. Returns "true" if it made
194 /// any changes.
run()195 bool DAGTypeLegalizer::run() {
196 bool Changed = false;
197
198 // Create a dummy node (which is not added to allnodes), that adds a reference
199 // to the root node, preventing it from being deleted, and tracking any
200 // changes of the root.
201 HandleSDNode Dummy(DAG.getRoot());
202 Dummy.setNodeId(Unanalyzed);
203
204 // The root of the dag may dangle to deleted nodes until the type legalizer is
205 // done. Set it to null to avoid confusion.
206 DAG.setRoot(SDValue());
207
208 // Walk all nodes in the graph, assigning them a NodeId of 'ReadyToProcess'
209 // (and remembering them) if they are leaves and assigning 'Unanalyzed' if
210 // non-leaves.
211 for (SDNode &Node : DAG.allnodes()) {
212 if (Node.getNumOperands() == 0) {
213 AddToWorklist(&Node);
214 } else {
215 Node.setNodeId(Unanalyzed);
216 }
217 }
218
219 // Now that we have a set of nodes to process, handle them all.
220 while (!Worklist.empty()) {
221 #ifndef EXPENSIVE_CHECKS
222 if (EnableExpensiveChecks)
223 #endif
224 PerformExpensiveChecks();
225
226 SDNode *N = Worklist.back();
227 Worklist.pop_back();
228 assert(N->getNodeId() == ReadyToProcess &&
229 "Node should be ready if on worklist!");
230
231 LLVM_DEBUG(dbgs() << "Legalizing node: "; N->dump(&DAG));
232 if (IgnoreNodeResults(N)) {
233 LLVM_DEBUG(dbgs() << "Ignoring node results\n");
234 goto ScanOperands;
235 }
236
237 // Scan the values produced by the node, checking to see if any result
238 // types are illegal.
239 for (unsigned i = 0, NumResults = N->getNumValues(); i < NumResults; ++i) {
240 EVT ResultVT = N->getValueType(i);
241 LLVM_DEBUG(dbgs() << "Analyzing result type: " << ResultVT.getEVTString()
242 << "\n");
243 switch (getTypeAction(ResultVT)) {
244 case TargetLowering::TypeLegal:
245 LLVM_DEBUG(dbgs() << "Legal result type\n");
246 break;
247 // The following calls must take care of *all* of the node's results,
248 // not just the illegal result they were passed (this includes results
249 // with a legal type). Results can be remapped using ReplaceValueWith,
250 // or their promoted/expanded/etc values registered in PromotedIntegers,
251 // ExpandedIntegers etc.
252 case TargetLowering::TypePromoteInteger:
253 PromoteIntegerResult(N, i);
254 Changed = true;
255 goto NodeDone;
256 case TargetLowering::TypeExpandInteger:
257 ExpandIntegerResult(N, i);
258 Changed = true;
259 goto NodeDone;
260 case TargetLowering::TypeSoftenFloat:
261 Changed = SoftenFloatResult(N, i);
262 if (Changed)
263 goto NodeDone;
264 // If not changed, the result type should be legally in register.
265 assert(isLegalInHWReg(ResultVT) &&
266 "Unchanged SoftenFloatResult should be legal in register!");
267 goto ScanOperands;
268 case TargetLowering::TypeExpandFloat:
269 ExpandFloatResult(N, i);
270 Changed = true;
271 goto NodeDone;
272 case TargetLowering::TypeScalarizeVector:
273 ScalarizeVectorResult(N, i);
274 Changed = true;
275 goto NodeDone;
276 case TargetLowering::TypeSplitVector:
277 SplitVectorResult(N, i);
278 Changed = true;
279 goto NodeDone;
280 case TargetLowering::TypeWidenVector:
281 WidenVectorResult(N, i);
282 Changed = true;
283 goto NodeDone;
284 case TargetLowering::TypePromoteFloat:
285 PromoteFloatResult(N, i);
286 Changed = true;
287 goto NodeDone;
288 }
289 }
290
291 ScanOperands:
292 // Scan the operand list for the node, handling any nodes with operands that
293 // are illegal.
294 {
295 unsigned NumOperands = N->getNumOperands();
296 bool NeedsReanalyzing = false;
297 unsigned i;
298 for (i = 0; i != NumOperands; ++i) {
299 if (IgnoreNodeResults(N->getOperand(i).getNode()))
300 continue;
301
302 const auto Op = N->getOperand(i);
303 LLVM_DEBUG(dbgs() << "Analyzing operand: "; Op.dump(&DAG));
304 EVT OpVT = Op.getValueType();
305 switch (getTypeAction(OpVT)) {
306 case TargetLowering::TypeLegal:
307 LLVM_DEBUG(dbgs() << "Legal operand\n");
308 continue;
309 // The following calls must either replace all of the node's results
310 // using ReplaceValueWith, and return "false"; or update the node's
311 // operands in place, and return "true".
312 case TargetLowering::TypePromoteInteger:
313 NeedsReanalyzing = PromoteIntegerOperand(N, i);
314 Changed = true;
315 break;
316 case TargetLowering::TypeExpandInteger:
317 NeedsReanalyzing = ExpandIntegerOperand(N, i);
318 Changed = true;
319 break;
320 case TargetLowering::TypeSoftenFloat:
321 NeedsReanalyzing = SoftenFloatOperand(N, i);
322 Changed = true;
323 break;
324 case TargetLowering::TypeExpandFloat:
325 NeedsReanalyzing = ExpandFloatOperand(N, i);
326 Changed = true;
327 break;
328 case TargetLowering::TypeScalarizeVector:
329 NeedsReanalyzing = ScalarizeVectorOperand(N, i);
330 Changed = true;
331 break;
332 case TargetLowering::TypeSplitVector:
333 NeedsReanalyzing = SplitVectorOperand(N, i);
334 Changed = true;
335 break;
336 case TargetLowering::TypeWidenVector:
337 NeedsReanalyzing = WidenVectorOperand(N, i);
338 Changed = true;
339 break;
340 case TargetLowering::TypePromoteFloat:
341 NeedsReanalyzing = PromoteFloatOperand(N, i);
342 Changed = true;
343 break;
344 }
345 break;
346 }
347
348 // The sub-method updated N in place. Check to see if any operands are new,
349 // and if so, mark them. If the node needs revisiting, don't add all users
350 // to the worklist etc.
351 if (NeedsReanalyzing) {
352 assert(N->getNodeId() == ReadyToProcess && "Node ID recalculated?");
353
354 N->setNodeId(NewNode);
355 // Recompute the NodeId and correct processed operands, adding the node to
356 // the worklist if ready.
357 SDNode *M = AnalyzeNewNode(N);
358 if (M == N)
359 // The node didn't morph - nothing special to do, it will be revisited.
360 continue;
361
362 // The node morphed - this is equivalent to legalizing by replacing every
363 // value of N with the corresponding value of M. So do that now.
364 assert(N->getNumValues() == M->getNumValues() &&
365 "Node morphing changed the number of results!");
366 for (unsigned i = 0, e = N->getNumValues(); i != e; ++i)
367 // Replacing the value takes care of remapping the new value.
368 ReplaceValueWith(SDValue(N, i), SDValue(M, i));
369 assert(N->getNodeId() == NewNode && "Unexpected node state!");
370 // The node continues to live on as part of the NewNode fungus that
371 // grows on top of the useful nodes. Nothing more needs to be done
372 // with it - move on to the next node.
373 continue;
374 }
375
376 if (i == NumOperands) {
377 LLVM_DEBUG(dbgs() << "Legally typed node: "; N->dump(&DAG);
378 dbgs() << "\n");
379 }
380 }
381 NodeDone:
382
383 // If we reach here, the node was processed, potentially creating new nodes.
384 // Mark it as processed and add its users to the worklist as appropriate.
385 assert(N->getNodeId() == ReadyToProcess && "Node ID recalculated?");
386 N->setNodeId(Processed);
387
388 for (SDNode::use_iterator UI = N->use_begin(), E = N->use_end();
389 UI != E; ++UI) {
390 SDNode *User = *UI;
391 int NodeId = User->getNodeId();
392
393 // This node has two options: it can either be a new node or its Node ID
394 // may be a count of the number of operands it has that are not ready.
395 if (NodeId > 0) {
396 User->setNodeId(NodeId-1);
397
398 // If this was the last use it was waiting on, add it to the ready list.
399 if (NodeId-1 == ReadyToProcess)
400 Worklist.push_back(User);
401 continue;
402 }
403
404 // If this is an unreachable new node, then ignore it. If it ever becomes
405 // reachable by being used by a newly created node then it will be handled
406 // by AnalyzeNewNode.
407 if (NodeId == NewNode)
408 continue;
409
410 // Otherwise, this node is new: this is the first operand of it that
411 // became ready. Its new NodeId is the number of operands it has minus 1
412 // (as this node is now processed).
413 assert(NodeId == Unanalyzed && "Unknown node ID!");
414 User->setNodeId(User->getNumOperands() - 1);
415
416 // If the node only has a single operand, it is now ready.
417 if (User->getNumOperands() == 1)
418 Worklist.push_back(User);
419 }
420 }
421
422 #ifndef EXPENSIVE_CHECKS
423 if (EnableExpensiveChecks)
424 #endif
425 PerformExpensiveChecks();
426
427 // If the root changed (e.g. it was a dead load) update the root.
428 DAG.setRoot(Dummy.getValue());
429
430 // Remove dead nodes. This is important to do for cleanliness but also before
431 // the checking loop below. Implicit folding by the DAG.getNode operators and
432 // node morphing can cause unreachable nodes to be around with their flags set
433 // to new.
434 DAG.RemoveDeadNodes();
435
436 // In a debug build, scan all the nodes to make sure we found them all. This
437 // ensures that there are no cycles and that everything got processed.
438 #ifndef NDEBUG
439 for (SDNode &Node : DAG.allnodes()) {
440 bool Failed = false;
441
442 // Check that all result types are legal.
443 // A value type is illegal if its TypeAction is not TypeLegal,
444 // and TLI.RegClassForVT does not have a register class for this type.
445 // For example, the x86_64 target has f128 that is not TypeLegal,
446 // to have softened operators, but it also has FR128 register class to
447 // pass and return f128 values. Hence a legalized node can have f128 type.
448 if (!IgnoreNodeResults(&Node))
449 for (unsigned i = 0, NumVals = Node.getNumValues(); i < NumVals; ++i)
450 if (!isTypeLegal(Node.getValueType(i)) &&
451 !TLI.isTypeLegal(Node.getValueType(i))) {
452 dbgs() << "Result type " << i << " illegal: ";
453 Node.dump(&DAG);
454 Failed = true;
455 }
456
457 // Check that all operand types are legal.
458 for (unsigned i = 0, NumOps = Node.getNumOperands(); i < NumOps; ++i)
459 if (!IgnoreNodeResults(Node.getOperand(i).getNode()) &&
460 !isTypeLegal(Node.getOperand(i).getValueType()) &&
461 !TLI.isTypeLegal(Node.getOperand(i).getValueType())) {
462 dbgs() << "Operand type " << i << " illegal: ";
463 Node.getOperand(i).dump(&DAG);
464 Failed = true;
465 }
466
467 if (Node.getNodeId() != Processed) {
468 if (Node.getNodeId() == NewNode)
469 dbgs() << "New node not analyzed?\n";
470 else if (Node.getNodeId() == Unanalyzed)
471 dbgs() << "Unanalyzed node not noticed?\n";
472 else if (Node.getNodeId() > 0)
473 dbgs() << "Operand not processed?\n";
474 else if (Node.getNodeId() == ReadyToProcess)
475 dbgs() << "Not added to worklist?\n";
476 Failed = true;
477 }
478
479 if (Failed) {
480 Node.dump(&DAG); dbgs() << "\n";
481 llvm_unreachable(nullptr);
482 }
483 }
484 #endif
485
486 return Changed;
487 }
488
489 /// The specified node is the root of a subtree of potentially new nodes.
490 /// Correct any processed operands (this may change the node) and calculate the
491 /// NodeId. If the node itself changes to a processed node, it is not remapped -
492 /// the caller needs to take care of this. Returns the potentially changed node.
AnalyzeNewNode(SDNode * N)493 SDNode *DAGTypeLegalizer::AnalyzeNewNode(SDNode *N) {
494 // If this was an existing node that is already done, we're done.
495 if (N->getNodeId() != NewNode && N->getNodeId() != Unanalyzed)
496 return N;
497
498 // Okay, we know that this node is new. Recursively walk all of its operands
499 // to see if they are new also. The depth of this walk is bounded by the size
500 // of the new tree that was constructed (usually 2-3 nodes), so we don't worry
501 // about revisiting of nodes.
502 //
503 // As we walk the operands, keep track of the number of nodes that are
504 // processed. If non-zero, this will become the new nodeid of this node.
505 // Operands may morph when they are analyzed. If so, the node will be
506 // updated after all operands have been analyzed. Since this is rare,
507 // the code tries to minimize overhead in the non-morphing case.
508
509 std::vector<SDValue> NewOps;
510 unsigned NumProcessed = 0;
511 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
512 SDValue OrigOp = N->getOperand(i);
513 SDValue Op = OrigOp;
514
515 AnalyzeNewValue(Op); // Op may morph.
516
517 if (Op.getNode()->getNodeId() == Processed)
518 ++NumProcessed;
519
520 if (!NewOps.empty()) {
521 // Some previous operand changed. Add this one to the list.
522 NewOps.push_back(Op);
523 } else if (Op != OrigOp) {
524 // This is the first operand to change - add all operands so far.
525 NewOps.insert(NewOps.end(), N->op_begin(), N->op_begin() + i);
526 NewOps.push_back(Op);
527 }
528 }
529
530 // Some operands changed - update the node.
531 if (!NewOps.empty()) {
532 SDNode *M = DAG.UpdateNodeOperands(N, NewOps);
533 if (M != N) {
534 // The node morphed into a different node. Normally for this to happen
535 // the original node would have to be marked NewNode. However this can
536 // in theory momentarily not be the case while ReplaceValueWith is doing
537 // its stuff. Mark the original node NewNode to help sanity checking.
538 N->setNodeId(NewNode);
539 if (M->getNodeId() != NewNode && M->getNodeId() != Unanalyzed)
540 // It morphed into a previously analyzed node - nothing more to do.
541 return M;
542
543 // It morphed into a different new node. Do the equivalent of passing
544 // it to AnalyzeNewNode: expunge it and calculate the NodeId. No need
545 // to remap the operands, since they are the same as the operands we
546 // remapped above.
547 N = M;
548 }
549 }
550
551 // Calculate the NodeId.
552 N->setNodeId(N->getNumOperands() - NumProcessed);
553 if (N->getNodeId() == ReadyToProcess)
554 Worklist.push_back(N);
555
556 return N;
557 }
558
559 /// Call AnalyzeNewNode, updating the node in Val if needed.
560 /// If the node changes to a processed node, then remap it.
AnalyzeNewValue(SDValue & Val)561 void DAGTypeLegalizer::AnalyzeNewValue(SDValue &Val) {
562 Val.setNode(AnalyzeNewNode(Val.getNode()));
563 if (Val.getNode()->getNodeId() == Processed)
564 // We were passed a processed node, or it morphed into one - remap it.
565 RemapValue(Val);
566 }
567
568 /// If the specified value was already legalized to another value,
569 /// replace it by that value.
RemapValue(SDValue & V)570 void DAGTypeLegalizer::RemapValue(SDValue &V) {
571 auto Id = getTableId(V);
572 V = getSDValue(Id);
573 }
574
RemapId(TableId & Id)575 void DAGTypeLegalizer::RemapId(TableId &Id) {
576 auto I = ReplacedValues.find(Id);
577 if (I != ReplacedValues.end()) {
578 assert(Id != I->second && "Id is mapped to itself.");
579 // Use path compression to speed up future lookups if values get multiply
580 // replaced with other values.
581 RemapId(I->second);
582 Id = I->second;
583
584 // Note that N = IdToValueMap[Id] it is possible to have
585 // N.getNode()->getNodeId() == NewNode at this point because it is possible
586 // for a node to be put in the map before being processed.
587 }
588 }
589
590 namespace {
591 /// This class is a DAGUpdateListener that listens for updates to nodes and
592 /// recomputes their ready state.
593 class NodeUpdateListener : public SelectionDAG::DAGUpdateListener {
594 DAGTypeLegalizer &DTL;
595 SmallSetVector<SDNode*, 16> &NodesToAnalyze;
596 public:
NodeUpdateListener(DAGTypeLegalizer & dtl,SmallSetVector<SDNode *,16> & nta)597 explicit NodeUpdateListener(DAGTypeLegalizer &dtl,
598 SmallSetVector<SDNode*, 16> &nta)
599 : SelectionDAG::DAGUpdateListener(dtl.getDAG()),
600 DTL(dtl), NodesToAnalyze(nta) {}
601
NodeDeleted(SDNode * N,SDNode * E)602 void NodeDeleted(SDNode *N, SDNode *E) override {
603 assert(N->getNodeId() != DAGTypeLegalizer::ReadyToProcess &&
604 N->getNodeId() != DAGTypeLegalizer::Processed &&
605 "Invalid node ID for RAUW deletion!");
606 // It is possible, though rare, for the deleted node N to occur as a
607 // target in a map, so note the replacement N -> E in ReplacedValues.
608 assert(E && "Node not replaced?");
609 DTL.NoteDeletion(N, E);
610
611 // In theory the deleted node could also have been scheduled for analysis.
612 // So remove it from the set of nodes which will be analyzed.
613 NodesToAnalyze.remove(N);
614
615 // In general nothing needs to be done for E, since it didn't change but
616 // only gained new uses. However N -> E was just added to ReplacedValues,
617 // and the result of a ReplacedValues mapping is not allowed to be marked
618 // NewNode. So if E is marked NewNode, then it needs to be analyzed.
619 if (E->getNodeId() == DAGTypeLegalizer::NewNode)
620 NodesToAnalyze.insert(E);
621 }
622
NodeUpdated(SDNode * N)623 void NodeUpdated(SDNode *N) override {
624 // Node updates can mean pretty much anything. It is possible that an
625 // operand was set to something already processed (f.e.) in which case
626 // this node could become ready. Recompute its flags.
627 assert(N->getNodeId() != DAGTypeLegalizer::ReadyToProcess &&
628 N->getNodeId() != DAGTypeLegalizer::Processed &&
629 "Invalid node ID for RAUW deletion!");
630 N->setNodeId(DAGTypeLegalizer::NewNode);
631 NodesToAnalyze.insert(N);
632 }
633 };
634 }
635
636
637 /// The specified value was legalized to the specified other value.
638 /// Update the DAG and NodeIds replacing any uses of From to use To instead.
ReplaceValueWith(SDValue From,SDValue To)639 void DAGTypeLegalizer::ReplaceValueWith(SDValue From, SDValue To) {
640 assert(From.getNode() != To.getNode() && "Potential legalization loop!");
641
642 // If expansion produced new nodes, make sure they are properly marked.
643 AnalyzeNewValue(To);
644
645 // Anything that used the old node should now use the new one. Note that this
646 // can potentially cause recursive merging.
647 SmallSetVector<SDNode*, 16> NodesToAnalyze;
648 NodeUpdateListener NUL(*this, NodesToAnalyze);
649 do {
650
651 // The old node may be present in a map like ExpandedIntegers or
652 // PromotedIntegers. Inform maps about the replacement.
653 auto FromId = getTableId(From);
654 auto ToId = getTableId(To);
655
656 if (FromId != ToId)
657 ReplacedValues[FromId] = ToId;
658 DAG.ReplaceAllUsesOfValueWith(From, To);
659
660 // Process the list of nodes that need to be reanalyzed.
661 while (!NodesToAnalyze.empty()) {
662 SDNode *N = NodesToAnalyze.back();
663 NodesToAnalyze.pop_back();
664 if (N->getNodeId() != DAGTypeLegalizer::NewNode)
665 // The node was analyzed while reanalyzing an earlier node - it is safe
666 // to skip. Note that this is not a morphing node - otherwise it would
667 // still be marked NewNode.
668 continue;
669
670 // Analyze the node's operands and recalculate the node ID.
671 SDNode *M = AnalyzeNewNode(N);
672 if (M != N) {
673 // The node morphed into a different node. Make everyone use the new
674 // node instead.
675 assert(M->getNodeId() != NewNode && "Analysis resulted in NewNode!");
676 assert(N->getNumValues() == M->getNumValues() &&
677 "Node morphing changed the number of results!");
678 for (unsigned i = 0, e = N->getNumValues(); i != e; ++i) {
679 SDValue OldVal(N, i);
680 SDValue NewVal(M, i);
681 if (M->getNodeId() == Processed)
682 RemapValue(NewVal);
683 // OldVal may be a target of the ReplacedValues map which was marked
684 // NewNode to force reanalysis because it was updated. Ensure that
685 // anything that ReplacedValues mapped to OldVal will now be mapped
686 // all the way to NewVal.
687 auto OldValId = getTableId(OldVal);
688 auto NewValId = getTableId(NewVal);
689 DAG.ReplaceAllUsesOfValueWith(OldVal, NewVal);
690 if (OldValId != NewValId)
691 ReplacedValues[OldValId] = NewValId;
692 }
693 // The original node continues to exist in the DAG, marked NewNode.
694 }
695 }
696 // When recursively update nodes with new nodes, it is possible to have
697 // new uses of From due to CSE. If this happens, replace the new uses of
698 // From with To.
699 } while (!From.use_empty());
700 }
701
SetPromotedInteger(SDValue Op,SDValue Result)702 void DAGTypeLegalizer::SetPromotedInteger(SDValue Op, SDValue Result) {
703 assert(Result.getValueType() ==
704 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType()) &&
705 "Invalid type for promoted integer");
706 AnalyzeNewValue(Result);
707
708 auto &OpIdEntry = PromotedIntegers[getTableId(Op)];
709 assert((OpIdEntry == 0) && "Node is already promoted!");
710 OpIdEntry = getTableId(Result);
711
712 DAG.transferDbgValues(Op, Result);
713 }
714
SetSoftenedFloat(SDValue Op,SDValue Result)715 void DAGTypeLegalizer::SetSoftenedFloat(SDValue Op, SDValue Result) {
716 // f128 of x86_64 could be kept in SSE registers,
717 // but sometimes softened to i128.
718 assert((Result.getValueType() ==
719 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType()) ||
720 Op.getValueType() ==
721 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType())) &&
722 "Invalid type for softened float");
723 AnalyzeNewValue(Result);
724
725 auto &OpIdEntry = SoftenedFloats[getTableId(Op)];
726 // Allow repeated calls to save f128 type nodes
727 // or any node with type that transforms to itself.
728 // Many operations on these types are not softened.
729 assert(((OpIdEntry == 0) ||
730 Op.getValueType() ==
731 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType())) &&
732 "Node is already converted to integer!");
733 OpIdEntry = getTableId(Result);
734 }
735
SetPromotedFloat(SDValue Op,SDValue Result)736 void DAGTypeLegalizer::SetPromotedFloat(SDValue Op, SDValue Result) {
737 assert(Result.getValueType() ==
738 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType()) &&
739 "Invalid type for promoted float");
740 AnalyzeNewValue(Result);
741
742 auto &OpIdEntry = PromotedFloats[getTableId(Op)];
743 assert((OpIdEntry == 0) && "Node is already promoted!");
744 OpIdEntry = getTableId(Result);
745 }
746
SetScalarizedVector(SDValue Op,SDValue Result)747 void DAGTypeLegalizer::SetScalarizedVector(SDValue Op, SDValue Result) {
748 // Note that in some cases vector operation operands may be greater than
749 // the vector element type. For example BUILD_VECTOR of type <1 x i1> with
750 // a constant i8 operand.
751 assert(Result.getValueSizeInBits() >= Op.getScalarValueSizeInBits() &&
752 "Invalid type for scalarized vector");
753 AnalyzeNewValue(Result);
754
755 auto &OpIdEntry = ScalarizedVectors[getTableId(Op)];
756 assert((OpIdEntry == 0) && "Node is already scalarized!");
757 OpIdEntry = getTableId(Result);
758 }
759
GetExpandedInteger(SDValue Op,SDValue & Lo,SDValue & Hi)760 void DAGTypeLegalizer::GetExpandedInteger(SDValue Op, SDValue &Lo,
761 SDValue &Hi) {
762 std::pair<TableId, TableId> &Entry = ExpandedIntegers[getTableId(Op)];
763 assert((Entry.first != 0) && "Operand isn't expanded");
764 Lo = getSDValue(Entry.first);
765 Hi = getSDValue(Entry.second);
766 }
767
SetExpandedInteger(SDValue Op,SDValue Lo,SDValue Hi)768 void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo,
769 SDValue Hi) {
770 assert(Lo.getValueType() ==
771 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType()) &&
772 Hi.getValueType() == Lo.getValueType() &&
773 "Invalid type for expanded integer");
774 // Lo/Hi may have been newly allocated, if so, add nodeid's as relevant.
775 AnalyzeNewValue(Lo);
776 AnalyzeNewValue(Hi);
777
778 // Transfer debug values. Don't invalidate the source debug value until it's
779 // been transferred to the high and low bits.
780 if (DAG.getDataLayout().isBigEndian()) {
781 DAG.transferDbgValues(Op, Hi, 0, Hi.getValueSizeInBits(), false);
782 DAG.transferDbgValues(Op, Lo, Hi.getValueSizeInBits(),
783 Lo.getValueSizeInBits());
784 } else {
785 DAG.transferDbgValues(Op, Lo, 0, Lo.getValueSizeInBits(), false);
786 DAG.transferDbgValues(Op, Hi, Lo.getValueSizeInBits(),
787 Hi.getValueSizeInBits());
788 }
789
790 // Remember that this is the result of the node.
791 std::pair<TableId, TableId> &Entry = ExpandedIntegers[getTableId(Op)];
792 assert((Entry.first == 0) && "Node already expanded");
793 Entry.first = getTableId(Lo);
794 Entry.second = getTableId(Hi);
795 }
796
GetExpandedFloat(SDValue Op,SDValue & Lo,SDValue & Hi)797 void DAGTypeLegalizer::GetExpandedFloat(SDValue Op, SDValue &Lo,
798 SDValue &Hi) {
799 std::pair<TableId, TableId> &Entry = ExpandedFloats[getTableId(Op)];
800 assert((Entry.first != 0) && "Operand isn't expanded");
801 Lo = getSDValue(Entry.first);
802 Hi = getSDValue(Entry.second);
803 }
804
SetExpandedFloat(SDValue Op,SDValue Lo,SDValue Hi)805 void DAGTypeLegalizer::SetExpandedFloat(SDValue Op, SDValue Lo,
806 SDValue Hi) {
807 assert(Lo.getValueType() ==
808 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType()) &&
809 Hi.getValueType() == Lo.getValueType() &&
810 "Invalid type for expanded float");
811 // Lo/Hi may have been newly allocated, if so, add nodeid's as relevant.
812 AnalyzeNewValue(Lo);
813 AnalyzeNewValue(Hi);
814
815 std::pair<TableId, TableId> &Entry = ExpandedFloats[getTableId(Op)];
816 assert((Entry.first == 0) && "Node already expanded");
817 Entry.first = getTableId(Lo);
818 Entry.second = getTableId(Hi);
819 }
820
GetSplitVector(SDValue Op,SDValue & Lo,SDValue & Hi)821 void DAGTypeLegalizer::GetSplitVector(SDValue Op, SDValue &Lo,
822 SDValue &Hi) {
823 std::pair<TableId, TableId> &Entry = SplitVectors[getTableId(Op)];
824 Lo = getSDValue(Entry.first);
825 Hi = getSDValue(Entry.second);
826 assert(Lo.getNode() && "Operand isn't split");
827 ;
828 }
829
SetSplitVector(SDValue Op,SDValue Lo,SDValue Hi)830 void DAGTypeLegalizer::SetSplitVector(SDValue Op, SDValue Lo,
831 SDValue Hi) {
832 assert(Lo.getValueType().getVectorElementType() ==
833 Op.getValueType().getVectorElementType() &&
834 2*Lo.getValueType().getVectorNumElements() ==
835 Op.getValueType().getVectorNumElements() &&
836 Hi.getValueType() == Lo.getValueType() &&
837 "Invalid type for split vector");
838 // Lo/Hi may have been newly allocated, if so, add nodeid's as relevant.
839 AnalyzeNewValue(Lo);
840 AnalyzeNewValue(Hi);
841
842 // Remember that this is the result of the node.
843 std::pair<TableId, TableId> &Entry = SplitVectors[getTableId(Op)];
844 assert((Entry.first == 0) && "Node already split");
845 Entry.first = getTableId(Lo);
846 Entry.second = getTableId(Hi);
847 }
848
SetWidenedVector(SDValue Op,SDValue Result)849 void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
850 assert(Result.getValueType() ==
851 TLI.getTypeToTransformTo(*DAG.getContext(), Op.getValueType()) &&
852 "Invalid type for widened vector");
853 AnalyzeNewValue(Result);
854
855 auto &OpIdEntry = WidenedVectors[getTableId(Op)];
856 assert((OpIdEntry == 0) && "Node already widened!");
857 OpIdEntry = getTableId(Result);
858 }
859
860
861 //===----------------------------------------------------------------------===//
862 // Utilities.
863 //===----------------------------------------------------------------------===//
864
865 /// Convert to an integer of the same size.
BitConvertToInteger(SDValue Op)866 SDValue DAGTypeLegalizer::BitConvertToInteger(SDValue Op) {
867 unsigned BitWidth = Op.getValueSizeInBits();
868 return DAG.getNode(ISD::BITCAST, SDLoc(Op),
869 EVT::getIntegerVT(*DAG.getContext(), BitWidth), Op);
870 }
871
872 /// Convert to a vector of integers of the same size.
BitConvertVectorToIntegerVector(SDValue Op)873 SDValue DAGTypeLegalizer::BitConvertVectorToIntegerVector(SDValue Op) {
874 assert(Op.getValueType().isVector() && "Only applies to vectors!");
875 unsigned EltWidth = Op.getScalarValueSizeInBits();
876 EVT EltNVT = EVT::getIntegerVT(*DAG.getContext(), EltWidth);
877 auto EltCnt = Op.getValueType().getVectorElementCount();
878 return DAG.getNode(ISD::BITCAST, SDLoc(Op),
879 EVT::getVectorVT(*DAG.getContext(), EltNVT, EltCnt), Op);
880 }
881
CreateStackStoreLoad(SDValue Op,EVT DestVT)882 SDValue DAGTypeLegalizer::CreateStackStoreLoad(SDValue Op,
883 EVT DestVT) {
884 SDLoc dl(Op);
885 // Create the stack frame object. Make sure it is aligned for both
886 // the source and destination types.
887 SDValue StackPtr = DAG.CreateStackTemporary(Op.getValueType(), DestVT);
888 // Emit a store to the stack slot.
889 SDValue Store =
890 DAG.getStore(DAG.getEntryNode(), dl, Op, StackPtr, MachinePointerInfo());
891 // Result is a load from the stack slot.
892 return DAG.getLoad(DestVT, dl, Store, StackPtr, MachinePointerInfo());
893 }
894
895 /// Replace the node's results with custom code provided by the target and
896 /// return "true", or do nothing and return "false".
897 /// The last parameter is FALSE if we are dealing with a node with legal
898 /// result types and illegal operand. The second parameter denotes the type of
899 /// illegal OperandNo in that case.
900 /// The last parameter being TRUE means we are dealing with a
901 /// node with illegal result types. The second parameter denotes the type of
902 /// illegal ResNo in that case.
CustomLowerNode(SDNode * N,EVT VT,bool LegalizeResult)903 bool DAGTypeLegalizer::CustomLowerNode(SDNode *N, EVT VT, bool LegalizeResult) {
904 // See if the target wants to custom lower this node.
905 if (TLI.getOperationAction(N->getOpcode(), VT) != TargetLowering::Custom)
906 return false;
907
908 SmallVector<SDValue, 8> Results;
909 if (LegalizeResult)
910 TLI.ReplaceNodeResults(N, Results, DAG);
911 else
912 TLI.LowerOperationWrapper(N, Results, DAG);
913
914 if (Results.empty())
915 // The target didn't want to custom lower it after all.
916 return false;
917
918 // When called from DAGTypeLegalizer::ExpandIntegerResult, we might need to
919 // provide the same kind of custom splitting behavior.
920 if (Results.size() == N->getNumValues() + 1 && LegalizeResult) {
921 // We've legalized a return type by splitting it. If there is a chain,
922 // replace that too.
923 SetExpandedInteger(SDValue(N, 0), Results[0], Results[1]);
924 if (N->getNumValues() > 1)
925 ReplaceValueWith(SDValue(N, 1), Results[2]);
926 return true;
927 }
928
929 // Make everything that once used N's values now use those in Results instead.
930 assert(Results.size() == N->getNumValues() &&
931 "Custom lowering returned the wrong number of results!");
932 for (unsigned i = 0, e = Results.size(); i != e; ++i) {
933 ReplaceValueWith(SDValue(N, i), Results[i]);
934 }
935 return true;
936 }
937
938
939 /// Widen the node's results with custom code provided by the target and return
940 /// "true", or do nothing and return "false".
CustomWidenLowerNode(SDNode * N,EVT VT)941 bool DAGTypeLegalizer::CustomWidenLowerNode(SDNode *N, EVT VT) {
942 // See if the target wants to custom lower this node.
943 if (TLI.getOperationAction(N->getOpcode(), VT) != TargetLowering::Custom)
944 return false;
945
946 SmallVector<SDValue, 8> Results;
947 TLI.ReplaceNodeResults(N, Results, DAG);
948
949 if (Results.empty())
950 // The target didn't want to custom widen lower its result after all.
951 return false;
952
953 // Update the widening map.
954 assert(Results.size() == N->getNumValues() &&
955 "Custom lowering returned the wrong number of results!");
956 for (unsigned i = 0, e = Results.size(); i != e; ++i) {
957 // If this is a chain output just replace it.
958 if (Results[i].getValueType() == MVT::Other)
959 ReplaceValueWith(SDValue(N, i), Results[i]);
960 else
961 SetWidenedVector(SDValue(N, i), Results[i]);
962 }
963 return true;
964 }
965
DisintegrateMERGE_VALUES(SDNode * N,unsigned ResNo)966 SDValue DAGTypeLegalizer::DisintegrateMERGE_VALUES(SDNode *N, unsigned ResNo) {
967 for (unsigned i = 0, e = N->getNumValues(); i != e; ++i)
968 if (i != ResNo)
969 ReplaceValueWith(SDValue(N, i), SDValue(N->getOperand(i)));
970 return SDValue(N->getOperand(ResNo));
971 }
972
973 /// Use ISD::EXTRACT_ELEMENT nodes to extract the low and high parts of the
974 /// given value.
GetPairElements(SDValue Pair,SDValue & Lo,SDValue & Hi)975 void DAGTypeLegalizer::GetPairElements(SDValue Pair,
976 SDValue &Lo, SDValue &Hi) {
977 SDLoc dl(Pair);
978 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), Pair.getValueType());
979 Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, NVT, Pair,
980 DAG.getIntPtrConstant(0, dl));
981 Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, NVT, Pair,
982 DAG.getIntPtrConstant(1, dl));
983 }
984
985 /// Build an integer with low bits Lo and high bits Hi.
JoinIntegers(SDValue Lo,SDValue Hi)986 SDValue DAGTypeLegalizer::JoinIntegers(SDValue Lo, SDValue Hi) {
987 // Arbitrarily use dlHi for result SDLoc
988 SDLoc dlHi(Hi);
989 SDLoc dlLo(Lo);
990 EVT LVT = Lo.getValueType();
991 EVT HVT = Hi.getValueType();
992 EVT NVT = EVT::getIntegerVT(*DAG.getContext(),
993 LVT.getSizeInBits() + HVT.getSizeInBits());
994
995 EVT ShiftAmtVT = TLI.getShiftAmountTy(NVT, DAG.getDataLayout(), false);
996 Lo = DAG.getNode(ISD::ZERO_EXTEND, dlLo, NVT, Lo);
997 Hi = DAG.getNode(ISD::ANY_EXTEND, dlHi, NVT, Hi);
998 Hi = DAG.getNode(ISD::SHL, dlHi, NVT, Hi,
999 DAG.getConstant(LVT.getSizeInBits(), dlHi, ShiftAmtVT));
1000 return DAG.getNode(ISD::OR, dlHi, NVT, Lo, Hi);
1001 }
1002
1003 /// Convert the node into a libcall with the same prototype.
LibCallify(RTLIB::Libcall LC,SDNode * N,bool isSigned)1004 SDValue DAGTypeLegalizer::LibCallify(RTLIB::Libcall LC, SDNode *N,
1005 bool isSigned) {
1006 unsigned NumOps = N->getNumOperands();
1007 SDLoc dl(N);
1008 if (NumOps == 0) {
1009 return TLI.makeLibCall(DAG, LC, N->getValueType(0), None, isSigned,
1010 dl).first;
1011 } else if (NumOps == 1) {
1012 SDValue Op = N->getOperand(0);
1013 return TLI.makeLibCall(DAG, LC, N->getValueType(0), Op, isSigned,
1014 dl).first;
1015 } else if (NumOps == 2) {
1016 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1017 return TLI.makeLibCall(DAG, LC, N->getValueType(0), Ops, isSigned,
1018 dl).first;
1019 }
1020 SmallVector<SDValue, 8> Ops(NumOps);
1021 for (unsigned i = 0; i < NumOps; ++i)
1022 Ops[i] = N->getOperand(i);
1023
1024 return TLI.makeLibCall(DAG, LC, N->getValueType(0), Ops, isSigned, dl).first;
1025 }
1026
1027 /// Expand a node into a call to a libcall. Similar to ExpandLibCall except that
1028 /// the first operand is the in-chain.
1029 std::pair<SDValue, SDValue>
ExpandChainLibCall(RTLIB::Libcall LC,SDNode * Node,bool isSigned)1030 DAGTypeLegalizer::ExpandChainLibCall(RTLIB::Libcall LC, SDNode *Node,
1031 bool isSigned) {
1032 SDValue InChain = Node->getOperand(0);
1033
1034 TargetLowering::ArgListTy Args;
1035 TargetLowering::ArgListEntry Entry;
1036 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i) {
1037 EVT ArgVT = Node->getOperand(i).getValueType();
1038 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
1039 Entry.Node = Node->getOperand(i);
1040 Entry.Ty = ArgTy;
1041 Entry.IsSExt = isSigned;
1042 Entry.IsZExt = !isSigned;
1043 Args.push_back(Entry);
1044 }
1045 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
1046 TLI.getPointerTy(DAG.getDataLayout()));
1047
1048 Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext());
1049
1050 TargetLowering::CallLoweringInfo CLI(DAG);
1051 CLI.setDebugLoc(SDLoc(Node))
1052 .setChain(InChain)
1053 .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
1054 std::move(Args))
1055 .setSExtResult(isSigned)
1056 .setZExtResult(!isSigned);
1057
1058 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
1059
1060 return CallInfo;
1061 }
1062
1063 /// Promote the given target boolean to a target boolean of the given type.
1064 /// A target boolean is an integer value, not necessarily of type i1, the bits
1065 /// of which conform to getBooleanContents.
1066 ///
1067 /// ValVT is the type of values that produced the boolean.
PromoteTargetBoolean(SDValue Bool,EVT ValVT)1068 SDValue DAGTypeLegalizer::PromoteTargetBoolean(SDValue Bool, EVT ValVT) {
1069 SDLoc dl(Bool);
1070 EVT BoolVT = getSetCCResultType(ValVT);
1071 ISD::NodeType ExtendCode =
1072 TargetLowering::getExtendForContent(TLI.getBooleanContents(ValVT));
1073 return DAG.getNode(ExtendCode, dl, BoolVT, Bool);
1074 }
1075
1076 /// Return the lower LoVT bits of Op in Lo and the upper HiVT bits in Hi.
SplitInteger(SDValue Op,EVT LoVT,EVT HiVT,SDValue & Lo,SDValue & Hi)1077 void DAGTypeLegalizer::SplitInteger(SDValue Op,
1078 EVT LoVT, EVT HiVT,
1079 SDValue &Lo, SDValue &Hi) {
1080 SDLoc dl(Op);
1081 assert(LoVT.getSizeInBits() + HiVT.getSizeInBits() ==
1082 Op.getValueSizeInBits() && "Invalid integer splitting!");
1083 Lo = DAG.getNode(ISD::TRUNCATE, dl, LoVT, Op);
1084 unsigned ReqShiftAmountInBits =
1085 Log2_32_Ceil(Op.getValueType().getSizeInBits());
1086 MVT ShiftAmountTy =
1087 TLI.getScalarShiftAmountTy(DAG.getDataLayout(), Op.getValueType());
1088 if (ReqShiftAmountInBits > ShiftAmountTy.getSizeInBits())
1089 ShiftAmountTy = MVT::getIntegerVT(NextPowerOf2(ReqShiftAmountInBits));
1090 Hi = DAG.getNode(ISD::SRL, dl, Op.getValueType(), Op,
1091 DAG.getConstant(LoVT.getSizeInBits(), dl, ShiftAmountTy));
1092 Hi = DAG.getNode(ISD::TRUNCATE, dl, HiVT, Hi);
1093 }
1094
1095 /// Return the lower and upper halves of Op's bits in a value type half the
1096 /// size of Op's.
SplitInteger(SDValue Op,SDValue & Lo,SDValue & Hi)1097 void DAGTypeLegalizer::SplitInteger(SDValue Op,
1098 SDValue &Lo, SDValue &Hi) {
1099 EVT HalfVT =
1100 EVT::getIntegerVT(*DAG.getContext(), Op.getValueSizeInBits() / 2);
1101 SplitInteger(Op, HalfVT, HalfVT, Lo, Hi);
1102 }
1103
1104
1105 //===----------------------------------------------------------------------===//
1106 // Entry Point
1107 //===----------------------------------------------------------------------===//
1108
1109 /// This transforms the SelectionDAG into a SelectionDAG that only uses types
1110 /// natively supported by the target. Returns "true" if it made any changes.
1111 ///
1112 /// Note that this is an involved process that may invalidate pointers into
1113 /// the graph.
LegalizeTypes()1114 bool SelectionDAG::LegalizeTypes() {
1115 return DAGTypeLegalizer(*this).run();
1116 }
1117