1 //===-- SelectionDAG.cpp - Implement the SelectionDAG data structures -----===//
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 implements the SelectionDAG class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/CodeGen/SelectionDAG.h"
15 #include "SDNodeOrdering.h"
16 #include "SDNodeDbgValue.h"
17 #include "llvm/CallingConv.h"
18 #include "llvm/Constants.h"
19 #include "llvm/DebugInfo.h"
20 #include "llvm/DerivedTypes.h"
21 #include "llvm/Function.h"
22 #include "llvm/GlobalAlias.h"
23 #include "llvm/GlobalVariable.h"
24 #include "llvm/Intrinsics.h"
25 #include "llvm/Analysis/ValueTracking.h"
26 #include "llvm/Assembly/Writer.h"
27 #include "llvm/CodeGen/MachineBasicBlock.h"
28 #include "llvm/CodeGen/MachineConstantPool.h"
29 #include "llvm/CodeGen/MachineFrameInfo.h"
30 #include "llvm/CodeGen/MachineModuleInfo.h"
31 #include "llvm/Target/TargetRegisterInfo.h"
32 #include "llvm/Target/TargetData.h"
33 #include "llvm/Target/TargetLowering.h"
34 #include "llvm/Target/TargetSelectionDAGInfo.h"
35 #include "llvm/Target/TargetOptions.h"
36 #include "llvm/Target/TargetInstrInfo.h"
37 #include "llvm/Target/TargetIntrinsicInfo.h"
38 #include "llvm/Target/TargetMachine.h"
39 #include "llvm/Support/CommandLine.h"
40 #include "llvm/Support/Debug.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/ManagedStatic.h"
43 #include "llvm/Support/MathExtras.h"
44 #include "llvm/Support/raw_ostream.h"
45 #include "llvm/Support/Mutex.h"
46 #include "llvm/ADT/SetVector.h"
47 #include "llvm/ADT/SmallPtrSet.h"
48 #include "llvm/ADT/SmallSet.h"
49 #include "llvm/ADT/SmallVector.h"
50 #include "llvm/ADT/StringExtras.h"
51 #include <algorithm>
52 #include <cmath>
53 using namespace llvm;
54
55 /// makeVTList - Return an instance of the SDVTList struct initialized with the
56 /// specified members.
makeVTList(const EVT * VTs,unsigned NumVTs)57 static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
58 SDVTList Res = {VTs, NumVTs};
59 return Res;
60 }
61
EVTToAPFloatSemantics(EVT VT)62 static const fltSemantics *EVTToAPFloatSemantics(EVT VT) {
63 switch (VT.getSimpleVT().SimpleTy) {
64 default: llvm_unreachable("Unknown FP format");
65 case MVT::f16: return &APFloat::IEEEhalf;
66 case MVT::f32: return &APFloat::IEEEsingle;
67 case MVT::f64: return &APFloat::IEEEdouble;
68 case MVT::f80: return &APFloat::x87DoubleExtended;
69 case MVT::f128: return &APFloat::IEEEquad;
70 case MVT::ppcf128: return &APFloat::PPCDoubleDouble;
71 }
72 }
73
74 // Default null implementations of the callbacks.
NodeDeleted(SDNode *,SDNode *)75 void SelectionDAG::DAGUpdateListener::NodeDeleted(SDNode*, SDNode*) {}
NodeUpdated(SDNode *)76 void SelectionDAG::DAGUpdateListener::NodeUpdated(SDNode*) {}
77
78 //===----------------------------------------------------------------------===//
79 // ConstantFPSDNode Class
80 //===----------------------------------------------------------------------===//
81
82 /// isExactlyValue - We don't rely on operator== working on double values, as
83 /// it returns true for things that are clearly not equal, like -0.0 and 0.0.
84 /// As such, this method can be used to do an exact bit-for-bit comparison of
85 /// two floating point values.
isExactlyValue(const APFloat & V) const86 bool ConstantFPSDNode::isExactlyValue(const APFloat& V) const {
87 return getValueAPF().bitwiseIsEqual(V);
88 }
89
isValueValidForType(EVT VT,const APFloat & Val)90 bool ConstantFPSDNode::isValueValidForType(EVT VT,
91 const APFloat& Val) {
92 assert(VT.isFloatingPoint() && "Can only convert between FP types");
93
94 // PPC long double cannot be converted to any other type.
95 if (VT == MVT::ppcf128 ||
96 &Val.getSemantics() == &APFloat::PPCDoubleDouble)
97 return false;
98
99 // convert modifies in place, so make a copy.
100 APFloat Val2 = APFloat(Val);
101 bool losesInfo;
102 (void) Val2.convert(*EVTToAPFloatSemantics(VT), APFloat::rmNearestTiesToEven,
103 &losesInfo);
104 return !losesInfo;
105 }
106
107 //===----------------------------------------------------------------------===//
108 // ISD Namespace
109 //===----------------------------------------------------------------------===//
110
111 /// isBuildVectorAllOnes - Return true if the specified node is a
112 /// BUILD_VECTOR where all of the elements are ~0 or undef.
isBuildVectorAllOnes(const SDNode * N)113 bool ISD::isBuildVectorAllOnes(const SDNode *N) {
114 // Look through a bit convert.
115 if (N->getOpcode() == ISD::BITCAST)
116 N = N->getOperand(0).getNode();
117
118 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
119
120 unsigned i = 0, e = N->getNumOperands();
121
122 // Skip over all of the undef values.
123 while (i != e && N->getOperand(i).getOpcode() == ISD::UNDEF)
124 ++i;
125
126 // Do not accept an all-undef vector.
127 if (i == e) return false;
128
129 // Do not accept build_vectors that aren't all constants or which have non-~0
130 // elements. We have to be a bit careful here, as the type of the constant
131 // may not be the same as the type of the vector elements due to type
132 // legalization (the elements are promoted to a legal type for the target and
133 // a vector of a type may be legal when the base element type is not).
134 // We only want to check enough bits to cover the vector elements, because
135 // we care if the resultant vector is all ones, not whether the individual
136 // constants are.
137 SDValue NotZero = N->getOperand(i);
138 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
139 if (isa<ConstantSDNode>(NotZero)) {
140 if (cast<ConstantSDNode>(NotZero)->getAPIntValue().countTrailingOnes() <
141 EltSize)
142 return false;
143 } else if (isa<ConstantFPSDNode>(NotZero)) {
144 if (cast<ConstantFPSDNode>(NotZero)->getValueAPF()
145 .bitcastToAPInt().countTrailingOnes() < EltSize)
146 return false;
147 } else
148 return false;
149
150 // Okay, we have at least one ~0 value, check to see if the rest match or are
151 // undefs. Even with the above element type twiddling, this should be OK, as
152 // the same type legalization should have applied to all the elements.
153 for (++i; i != e; ++i)
154 if (N->getOperand(i) != NotZero &&
155 N->getOperand(i).getOpcode() != ISD::UNDEF)
156 return false;
157 return true;
158 }
159
160
161 /// isBuildVectorAllZeros - Return true if the specified node is a
162 /// BUILD_VECTOR where all of the elements are 0 or undef.
isBuildVectorAllZeros(const SDNode * N)163 bool ISD::isBuildVectorAllZeros(const SDNode *N) {
164 // Look through a bit convert.
165 if (N->getOpcode() == ISD::BITCAST)
166 N = N->getOperand(0).getNode();
167
168 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
169
170 unsigned i = 0, e = N->getNumOperands();
171
172 // Skip over all of the undef values.
173 while (i != e && N->getOperand(i).getOpcode() == ISD::UNDEF)
174 ++i;
175
176 // Do not accept an all-undef vector.
177 if (i == e) return false;
178
179 // Do not accept build_vectors that aren't all constants or which have non-0
180 // elements.
181 SDValue Zero = N->getOperand(i);
182 if (isa<ConstantSDNode>(Zero)) {
183 if (!cast<ConstantSDNode>(Zero)->isNullValue())
184 return false;
185 } else if (isa<ConstantFPSDNode>(Zero)) {
186 if (!cast<ConstantFPSDNode>(Zero)->getValueAPF().isPosZero())
187 return false;
188 } else
189 return false;
190
191 // Okay, we have at least one 0 value, check to see if the rest match or are
192 // undefs.
193 for (++i; i != e; ++i)
194 if (N->getOperand(i) != Zero &&
195 N->getOperand(i).getOpcode() != ISD::UNDEF)
196 return false;
197 return true;
198 }
199
200 /// isScalarToVector - Return true if the specified node is a
201 /// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low
202 /// element is not an undef.
isScalarToVector(const SDNode * N)203 bool ISD::isScalarToVector(const SDNode *N) {
204 if (N->getOpcode() == ISD::SCALAR_TO_VECTOR)
205 return true;
206
207 if (N->getOpcode() != ISD::BUILD_VECTOR)
208 return false;
209 if (N->getOperand(0).getOpcode() == ISD::UNDEF)
210 return false;
211 unsigned NumElems = N->getNumOperands();
212 if (NumElems == 1)
213 return false;
214 for (unsigned i = 1; i < NumElems; ++i) {
215 SDValue V = N->getOperand(i);
216 if (V.getOpcode() != ISD::UNDEF)
217 return false;
218 }
219 return true;
220 }
221
222 /// allOperandsUndef - Return true if the node has at least one operand
223 /// and all operands of the specified node are ISD::UNDEF.
allOperandsUndef(const SDNode * N)224 bool ISD::allOperandsUndef(const SDNode *N) {
225 // Return false if the node has no operands.
226 // This is "logically inconsistent" with the definition of "all" but
227 // is probably the desired behavior.
228 if (N->getNumOperands() == 0)
229 return false;
230
231 for (unsigned i = 0, e = N->getNumOperands(); i != e ; ++i)
232 if (N->getOperand(i).getOpcode() != ISD::UNDEF)
233 return false;
234
235 return true;
236 }
237
238 /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X)
239 /// when given the operation for (X op Y).
getSetCCSwappedOperands(ISD::CondCode Operation)240 ISD::CondCode ISD::getSetCCSwappedOperands(ISD::CondCode Operation) {
241 // To perform this operation, we just need to swap the L and G bits of the
242 // operation.
243 unsigned OldL = (Operation >> 2) & 1;
244 unsigned OldG = (Operation >> 1) & 1;
245 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
246 (OldL << 1) | // New G bit
247 (OldG << 2)); // New L bit.
248 }
249
250 /// getSetCCInverse - Return the operation corresponding to !(X op Y), where
251 /// 'op' is a valid SetCC operation.
getSetCCInverse(ISD::CondCode Op,bool isInteger)252 ISD::CondCode ISD::getSetCCInverse(ISD::CondCode Op, bool isInteger) {
253 unsigned Operation = Op;
254 if (isInteger)
255 Operation ^= 7; // Flip L, G, E bits, but not U.
256 else
257 Operation ^= 15; // Flip all of the condition bits.
258
259 if (Operation > ISD::SETTRUE2)
260 Operation &= ~8; // Don't let N and U bits get set.
261
262 return ISD::CondCode(Operation);
263 }
264
265
266 /// isSignedOp - For an integer comparison, return 1 if the comparison is a
267 /// signed operation and 2 if the result is an unsigned comparison. Return zero
268 /// if the operation does not depend on the sign of the input (setne and seteq).
isSignedOp(ISD::CondCode Opcode)269 static int isSignedOp(ISD::CondCode Opcode) {
270 switch (Opcode) {
271 default: llvm_unreachable("Illegal integer setcc operation!");
272 case ISD::SETEQ:
273 case ISD::SETNE: return 0;
274 case ISD::SETLT:
275 case ISD::SETLE:
276 case ISD::SETGT:
277 case ISD::SETGE: return 1;
278 case ISD::SETULT:
279 case ISD::SETULE:
280 case ISD::SETUGT:
281 case ISD::SETUGE: return 2;
282 }
283 }
284
285 /// getSetCCOrOperation - Return the result of a logical OR between different
286 /// comparisons of identical values: ((X op1 Y) | (X op2 Y)). This function
287 /// returns SETCC_INVALID if it is not possible to represent the resultant
288 /// comparison.
getSetCCOrOperation(ISD::CondCode Op1,ISD::CondCode Op2,bool isInteger)289 ISD::CondCode ISD::getSetCCOrOperation(ISD::CondCode Op1, ISD::CondCode Op2,
290 bool isInteger) {
291 if (isInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
292 // Cannot fold a signed integer setcc with an unsigned integer setcc.
293 return ISD::SETCC_INVALID;
294
295 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
296
297 // If the N and U bits get set then the resultant comparison DOES suddenly
298 // care about orderedness, and is true when ordered.
299 if (Op > ISD::SETTRUE2)
300 Op &= ~16; // Clear the U bit if the N bit is set.
301
302 // Canonicalize illegal integer setcc's.
303 if (isInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
304 Op = ISD::SETNE;
305
306 return ISD::CondCode(Op);
307 }
308
309 /// getSetCCAndOperation - Return the result of a logical AND between different
310 /// comparisons of identical values: ((X op1 Y) & (X op2 Y)). This
311 /// function returns zero if it is not possible to represent the resultant
312 /// comparison.
getSetCCAndOperation(ISD::CondCode Op1,ISD::CondCode Op2,bool isInteger)313 ISD::CondCode ISD::getSetCCAndOperation(ISD::CondCode Op1, ISD::CondCode Op2,
314 bool isInteger) {
315 if (isInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
316 // Cannot fold a signed setcc with an unsigned setcc.
317 return ISD::SETCC_INVALID;
318
319 // Combine all of the condition bits.
320 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
321
322 // Canonicalize illegal integer setcc's.
323 if (isInteger) {
324 switch (Result) {
325 default: break;
326 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
327 case ISD::SETOEQ: // SETEQ & SETU[LG]E
328 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
329 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
330 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
331 }
332 }
333
334 return Result;
335 }
336
337 //===----------------------------------------------------------------------===//
338 // SDNode Profile Support
339 //===----------------------------------------------------------------------===//
340
341 /// AddNodeIDOpcode - Add the node opcode to the NodeID data.
342 ///
AddNodeIDOpcode(FoldingSetNodeID & ID,unsigned OpC)343 static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
344 ID.AddInteger(OpC);
345 }
346
347 /// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
348 /// solely with their pointer.
AddNodeIDValueTypes(FoldingSetNodeID & ID,SDVTList VTList)349 static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList) {
350 ID.AddPointer(VTList.VTs);
351 }
352
353 /// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
354 ///
AddNodeIDOperands(FoldingSetNodeID & ID,const SDValue * Ops,unsigned NumOps)355 static void AddNodeIDOperands(FoldingSetNodeID &ID,
356 const SDValue *Ops, unsigned NumOps) {
357 for (; NumOps; --NumOps, ++Ops) {
358 ID.AddPointer(Ops->getNode());
359 ID.AddInteger(Ops->getResNo());
360 }
361 }
362
363 /// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
364 ///
AddNodeIDOperands(FoldingSetNodeID & ID,const SDUse * Ops,unsigned NumOps)365 static void AddNodeIDOperands(FoldingSetNodeID &ID,
366 const SDUse *Ops, unsigned NumOps) {
367 for (; NumOps; --NumOps, ++Ops) {
368 ID.AddPointer(Ops->getNode());
369 ID.AddInteger(Ops->getResNo());
370 }
371 }
372
AddNodeIDNode(FoldingSetNodeID & ID,unsigned short OpC,SDVTList VTList,const SDValue * OpList,unsigned N)373 static void AddNodeIDNode(FoldingSetNodeID &ID,
374 unsigned short OpC, SDVTList VTList,
375 const SDValue *OpList, unsigned N) {
376 AddNodeIDOpcode(ID, OpC);
377 AddNodeIDValueTypes(ID, VTList);
378 AddNodeIDOperands(ID, OpList, N);
379 }
380
381 /// AddNodeIDCustom - If this is an SDNode with special info, add this info to
382 /// the NodeID data.
AddNodeIDCustom(FoldingSetNodeID & ID,const SDNode * N)383 static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) {
384 switch (N->getOpcode()) {
385 case ISD::TargetExternalSymbol:
386 case ISD::ExternalSymbol:
387 llvm_unreachable("Should only be used on nodes with operands");
388 default: break; // Normal nodes don't need extra info.
389 case ISD::TargetConstant:
390 case ISD::Constant:
391 ID.AddPointer(cast<ConstantSDNode>(N)->getConstantIntValue());
392 break;
393 case ISD::TargetConstantFP:
394 case ISD::ConstantFP: {
395 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
396 break;
397 }
398 case ISD::TargetGlobalAddress:
399 case ISD::GlobalAddress:
400 case ISD::TargetGlobalTLSAddress:
401 case ISD::GlobalTLSAddress: {
402 const GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(N);
403 ID.AddPointer(GA->getGlobal());
404 ID.AddInteger(GA->getOffset());
405 ID.AddInteger(GA->getTargetFlags());
406 ID.AddInteger(GA->getAddressSpace());
407 break;
408 }
409 case ISD::BasicBlock:
410 ID.AddPointer(cast<BasicBlockSDNode>(N)->getBasicBlock());
411 break;
412 case ISD::Register:
413 ID.AddInteger(cast<RegisterSDNode>(N)->getReg());
414 break;
415 case ISD::RegisterMask:
416 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
417 break;
418 case ISD::SRCVALUE:
419 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
420 break;
421 case ISD::FrameIndex:
422 case ISD::TargetFrameIndex:
423 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
424 break;
425 case ISD::JumpTable:
426 case ISD::TargetJumpTable:
427 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
428 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
429 break;
430 case ISD::ConstantPool:
431 case ISD::TargetConstantPool: {
432 const ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(N);
433 ID.AddInteger(CP->getAlignment());
434 ID.AddInteger(CP->getOffset());
435 if (CP->isMachineConstantPoolEntry())
436 CP->getMachineCPVal()->addSelectionDAGCSEId(ID);
437 else
438 ID.AddPointer(CP->getConstVal());
439 ID.AddInteger(CP->getTargetFlags());
440 break;
441 }
442 case ISD::TargetIndex: {
443 const TargetIndexSDNode *TI = cast<TargetIndexSDNode>(N);
444 ID.AddInteger(TI->getIndex());
445 ID.AddInteger(TI->getOffset());
446 ID.AddInteger(TI->getTargetFlags());
447 break;
448 }
449 case ISD::LOAD: {
450 const LoadSDNode *LD = cast<LoadSDNode>(N);
451 ID.AddInteger(LD->getMemoryVT().getRawBits());
452 ID.AddInteger(LD->getRawSubclassData());
453 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
454 break;
455 }
456 case ISD::STORE: {
457 const StoreSDNode *ST = cast<StoreSDNode>(N);
458 ID.AddInteger(ST->getMemoryVT().getRawBits());
459 ID.AddInteger(ST->getRawSubclassData());
460 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
461 break;
462 }
463 case ISD::ATOMIC_CMP_SWAP:
464 case ISD::ATOMIC_SWAP:
465 case ISD::ATOMIC_LOAD_ADD:
466 case ISD::ATOMIC_LOAD_SUB:
467 case ISD::ATOMIC_LOAD_AND:
468 case ISD::ATOMIC_LOAD_OR:
469 case ISD::ATOMIC_LOAD_XOR:
470 case ISD::ATOMIC_LOAD_NAND:
471 case ISD::ATOMIC_LOAD_MIN:
472 case ISD::ATOMIC_LOAD_MAX:
473 case ISD::ATOMIC_LOAD_UMIN:
474 case ISD::ATOMIC_LOAD_UMAX:
475 case ISD::ATOMIC_LOAD:
476 case ISD::ATOMIC_STORE: {
477 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
478 ID.AddInteger(AT->getMemoryVT().getRawBits());
479 ID.AddInteger(AT->getRawSubclassData());
480 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
481 break;
482 }
483 case ISD::PREFETCH: {
484 const MemSDNode *PF = cast<MemSDNode>(N);
485 ID.AddInteger(PF->getPointerInfo().getAddrSpace());
486 break;
487 }
488 case ISD::VECTOR_SHUFFLE: {
489 const ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(N);
490 for (unsigned i = 0, e = N->getValueType(0).getVectorNumElements();
491 i != e; ++i)
492 ID.AddInteger(SVN->getMaskElt(i));
493 break;
494 }
495 case ISD::TargetBlockAddress:
496 case ISD::BlockAddress: {
497 ID.AddPointer(cast<BlockAddressSDNode>(N)->getBlockAddress());
498 ID.AddInteger(cast<BlockAddressSDNode>(N)->getTargetFlags());
499 break;
500 }
501 } // end switch (N->getOpcode())
502
503 // Target specific memory nodes could also have address spaces to check.
504 if (N->isTargetMemoryOpcode())
505 ID.AddInteger(cast<MemSDNode>(N)->getPointerInfo().getAddrSpace());
506 }
507
508 /// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
509 /// data.
AddNodeIDNode(FoldingSetNodeID & ID,const SDNode * N)510 static void AddNodeIDNode(FoldingSetNodeID &ID, const SDNode *N) {
511 AddNodeIDOpcode(ID, N->getOpcode());
512 // Add the return value info.
513 AddNodeIDValueTypes(ID, N->getVTList());
514 // Add the operand info.
515 AddNodeIDOperands(ID, N->op_begin(), N->getNumOperands());
516
517 // Handle SDNode leafs with special info.
518 AddNodeIDCustom(ID, N);
519 }
520
521 /// encodeMemSDNodeFlags - Generic routine for computing a value for use in
522 /// the CSE map that carries volatility, temporalness, indexing mode, and
523 /// extension/truncation information.
524 ///
525 static inline unsigned
encodeMemSDNodeFlags(int ConvType,ISD::MemIndexedMode AM,bool isVolatile,bool isNonTemporal,bool isInvariant)526 encodeMemSDNodeFlags(int ConvType, ISD::MemIndexedMode AM, bool isVolatile,
527 bool isNonTemporal, bool isInvariant) {
528 assert((ConvType & 3) == ConvType &&
529 "ConvType may not require more than 2 bits!");
530 assert((AM & 7) == AM &&
531 "AM may not require more than 3 bits!");
532 return ConvType |
533 (AM << 2) |
534 (isVolatile << 5) |
535 (isNonTemporal << 6) |
536 (isInvariant << 7);
537 }
538
539 //===----------------------------------------------------------------------===//
540 // SelectionDAG Class
541 //===----------------------------------------------------------------------===//
542
543 /// doNotCSE - Return true if CSE should not be performed for this node.
doNotCSE(SDNode * N)544 static bool doNotCSE(SDNode *N) {
545 if (N->getValueType(0) == MVT::Glue)
546 return true; // Never CSE anything that produces a flag.
547
548 switch (N->getOpcode()) {
549 default: break;
550 case ISD::HANDLENODE:
551 case ISD::EH_LABEL:
552 return true; // Never CSE these nodes.
553 }
554
555 // Check that remaining values produced are not flags.
556 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
557 if (N->getValueType(i) == MVT::Glue)
558 return true; // Never CSE anything that produces a flag.
559
560 return false;
561 }
562
563 /// RemoveDeadNodes - This method deletes all unreachable nodes in the
564 /// SelectionDAG.
RemoveDeadNodes()565 void SelectionDAG::RemoveDeadNodes() {
566 // Create a dummy node (which is not added to allnodes), that adds a reference
567 // to the root node, preventing it from being deleted.
568 HandleSDNode Dummy(getRoot());
569
570 SmallVector<SDNode*, 128> DeadNodes;
571
572 // Add all obviously-dead nodes to the DeadNodes worklist.
573 for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ++I)
574 if (I->use_empty())
575 DeadNodes.push_back(I);
576
577 RemoveDeadNodes(DeadNodes);
578
579 // If the root changed (e.g. it was a dead load, update the root).
580 setRoot(Dummy.getValue());
581 }
582
583 /// RemoveDeadNodes - This method deletes the unreachable nodes in the
584 /// given list, and any nodes that become unreachable as a result.
RemoveDeadNodes(SmallVectorImpl<SDNode * > & DeadNodes)585 void SelectionDAG::RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes) {
586
587 // Process the worklist, deleting the nodes and adding their uses to the
588 // worklist.
589 while (!DeadNodes.empty()) {
590 SDNode *N = DeadNodes.pop_back_val();
591
592 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
593 DUL->NodeDeleted(N, 0);
594
595 // Take the node out of the appropriate CSE map.
596 RemoveNodeFromCSEMaps(N);
597
598 // Next, brutally remove the operand list. This is safe to do, as there are
599 // no cycles in the graph.
600 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
601 SDUse &Use = *I++;
602 SDNode *Operand = Use.getNode();
603 Use.set(SDValue());
604
605 // Now that we removed this operand, see if there are no uses of it left.
606 if (Operand->use_empty())
607 DeadNodes.push_back(Operand);
608 }
609
610 DeallocateNode(N);
611 }
612 }
613
RemoveDeadNode(SDNode * N)614 void SelectionDAG::RemoveDeadNode(SDNode *N){
615 SmallVector<SDNode*, 16> DeadNodes(1, N);
616
617 // Create a dummy node that adds a reference to the root node, preventing
618 // it from being deleted. (This matters if the root is an operand of the
619 // dead node.)
620 HandleSDNode Dummy(getRoot());
621
622 RemoveDeadNodes(DeadNodes);
623 }
624
DeleteNode(SDNode * N)625 void SelectionDAG::DeleteNode(SDNode *N) {
626 // First take this out of the appropriate CSE map.
627 RemoveNodeFromCSEMaps(N);
628
629 // Finally, remove uses due to operands of this node, remove from the
630 // AllNodes list, and delete the node.
631 DeleteNodeNotInCSEMaps(N);
632 }
633
DeleteNodeNotInCSEMaps(SDNode * N)634 void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
635 assert(N != AllNodes.begin() && "Cannot delete the entry node!");
636 assert(N->use_empty() && "Cannot delete a node that is not dead!");
637
638 // Drop all of the operands and decrement used node's use counts.
639 N->DropOperands();
640
641 DeallocateNode(N);
642 }
643
DeallocateNode(SDNode * N)644 void SelectionDAG::DeallocateNode(SDNode *N) {
645 if (N->OperandsNeedDelete)
646 delete[] N->OperandList;
647
648 // Set the opcode to DELETED_NODE to help catch bugs when node
649 // memory is reallocated.
650 N->NodeType = ISD::DELETED_NODE;
651
652 NodeAllocator.Deallocate(AllNodes.remove(N));
653
654 // Remove the ordering of this node.
655 Ordering->remove(N);
656
657 // If any of the SDDbgValue nodes refer to this SDNode, invalidate them.
658 ArrayRef<SDDbgValue*> DbgVals = DbgInfo->getSDDbgValues(N);
659 for (unsigned i = 0, e = DbgVals.size(); i != e; ++i)
660 DbgVals[i]->setIsInvalidated();
661 }
662
663 /// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
664 /// correspond to it. This is useful when we're about to delete or repurpose
665 /// the node. We don't want future request for structurally identical nodes
666 /// to return N anymore.
RemoveNodeFromCSEMaps(SDNode * N)667 bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
668 bool Erased = false;
669 switch (N->getOpcode()) {
670 case ISD::HANDLENODE: return false; // noop.
671 case ISD::CONDCODE:
672 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
673 "Cond code doesn't exist!");
674 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != 0;
675 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = 0;
676 break;
677 case ISD::ExternalSymbol:
678 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
679 break;
680 case ISD::TargetExternalSymbol: {
681 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
682 Erased = TargetExternalSymbols.erase(
683 std::pair<std::string,unsigned char>(ESN->getSymbol(),
684 ESN->getTargetFlags()));
685 break;
686 }
687 case ISD::VALUETYPE: {
688 EVT VT = cast<VTSDNode>(N)->getVT();
689 if (VT.isExtended()) {
690 Erased = ExtendedValueTypeNodes.erase(VT);
691 } else {
692 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != 0;
693 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = 0;
694 }
695 break;
696 }
697 default:
698 // Remove it from the CSE Map.
699 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
700 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
701 Erased = CSEMap.RemoveNode(N);
702 break;
703 }
704 #ifndef NDEBUG
705 // Verify that the node was actually in one of the CSE maps, unless it has a
706 // flag result (which cannot be CSE'd) or is one of the special cases that are
707 // not subject to CSE.
708 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
709 !N->isMachineOpcode() && !doNotCSE(N)) {
710 N->dump(this);
711 dbgs() << "\n";
712 llvm_unreachable("Node is not in map!");
713 }
714 #endif
715 return Erased;
716 }
717
718 /// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
719 /// maps and modified in place. Add it back to the CSE maps, unless an identical
720 /// node already exists, in which case transfer all its users to the existing
721 /// node. This transfer can potentially trigger recursive merging.
722 ///
723 void
AddModifiedNodeToCSEMaps(SDNode * N)724 SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
725 // For node types that aren't CSE'd, just act as if no identical node
726 // already exists.
727 if (!doNotCSE(N)) {
728 SDNode *Existing = CSEMap.GetOrInsertNode(N);
729 if (Existing != N) {
730 // If there was already an existing matching node, use ReplaceAllUsesWith
731 // to replace the dead one with the existing one. This can cause
732 // recursive merging of other unrelated nodes down the line.
733 ReplaceAllUsesWith(N, Existing);
734
735 // N is now dead. Inform the listeners and delete it.
736 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
737 DUL->NodeDeleted(N, Existing);
738 DeleteNodeNotInCSEMaps(N);
739 return;
740 }
741 }
742
743 // If the node doesn't already exist, we updated it. Inform listeners.
744 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
745 DUL->NodeUpdated(N);
746 }
747
748 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands
749 /// were replaced with those specified. If this node is never memoized,
750 /// return null, otherwise return a pointer to the slot it would take. If a
751 /// node already exists with these operands, the slot will be non-null.
FindModifiedNodeSlot(SDNode * N,SDValue Op,void * & InsertPos)752 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
753 void *&InsertPos) {
754 if (doNotCSE(N))
755 return 0;
756
757 SDValue Ops[] = { Op };
758 FoldingSetNodeID ID;
759 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, 1);
760 AddNodeIDCustom(ID, N);
761 SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
762 return Node;
763 }
764
765 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands
766 /// were replaced with those specified. If this node is never memoized,
767 /// return null, otherwise return a pointer to the slot it would take. If a
768 /// node already exists with these operands, the slot will be non-null.
FindModifiedNodeSlot(SDNode * N,SDValue Op1,SDValue Op2,void * & InsertPos)769 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
770 SDValue Op1, SDValue Op2,
771 void *&InsertPos) {
772 if (doNotCSE(N))
773 return 0;
774
775 SDValue Ops[] = { Op1, Op2 };
776 FoldingSetNodeID ID;
777 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, 2);
778 AddNodeIDCustom(ID, N);
779 SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
780 return Node;
781 }
782
783
784 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands
785 /// were replaced with those specified. If this node is never memoized,
786 /// return null, otherwise return a pointer to the slot it would take. If a
787 /// node already exists with these operands, the slot will be non-null.
FindModifiedNodeSlot(SDNode * N,const SDValue * Ops,unsigned NumOps,void * & InsertPos)788 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
789 const SDValue *Ops,unsigned NumOps,
790 void *&InsertPos) {
791 if (doNotCSE(N))
792 return 0;
793
794 FoldingSetNodeID ID;
795 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, NumOps);
796 AddNodeIDCustom(ID, N);
797 SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
798 return Node;
799 }
800
801 #ifndef NDEBUG
802 /// VerifyNodeCommon - Sanity check the given node. Aborts if it is invalid.
VerifyNodeCommon(SDNode * N)803 static void VerifyNodeCommon(SDNode *N) {
804 switch (N->getOpcode()) {
805 default:
806 break;
807 case ISD::BUILD_PAIR: {
808 EVT VT = N->getValueType(0);
809 assert(N->getNumValues() == 1 && "Too many results!");
810 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
811 "Wrong return type!");
812 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
813 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
814 "Mismatched operand types!");
815 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
816 "Wrong operand type!");
817 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
818 "Wrong return type size");
819 break;
820 }
821 case ISD::BUILD_VECTOR: {
822 assert(N->getNumValues() == 1 && "Too many results!");
823 assert(N->getValueType(0).isVector() && "Wrong return type!");
824 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
825 "Wrong number of operands!");
826 EVT EltVT = N->getValueType(0).getVectorElementType();
827 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I) {
828 assert((I->getValueType() == EltVT ||
829 (EltVT.isInteger() && I->getValueType().isInteger() &&
830 EltVT.bitsLE(I->getValueType()))) &&
831 "Wrong operand type!");
832 assert(I->getValueType() == N->getOperand(0).getValueType() &&
833 "Operands must all have the same type");
834 }
835 break;
836 }
837 }
838 }
839
840 /// VerifySDNode - Sanity check the given SDNode. Aborts if it is invalid.
VerifySDNode(SDNode * N)841 static void VerifySDNode(SDNode *N) {
842 // The SDNode allocators cannot be used to allocate nodes with fields that are
843 // not present in an SDNode!
844 assert(!isa<MemSDNode>(N) && "Bad MemSDNode!");
845 assert(!isa<ShuffleVectorSDNode>(N) && "Bad ShuffleVectorSDNode!");
846 assert(!isa<ConstantSDNode>(N) && "Bad ConstantSDNode!");
847 assert(!isa<ConstantFPSDNode>(N) && "Bad ConstantFPSDNode!");
848 assert(!isa<GlobalAddressSDNode>(N) && "Bad GlobalAddressSDNode!");
849 assert(!isa<FrameIndexSDNode>(N) && "Bad FrameIndexSDNode!");
850 assert(!isa<JumpTableSDNode>(N) && "Bad JumpTableSDNode!");
851 assert(!isa<ConstantPoolSDNode>(N) && "Bad ConstantPoolSDNode!");
852 assert(!isa<BasicBlockSDNode>(N) && "Bad BasicBlockSDNode!");
853 assert(!isa<SrcValueSDNode>(N) && "Bad SrcValueSDNode!");
854 assert(!isa<MDNodeSDNode>(N) && "Bad MDNodeSDNode!");
855 assert(!isa<RegisterSDNode>(N) && "Bad RegisterSDNode!");
856 assert(!isa<BlockAddressSDNode>(N) && "Bad BlockAddressSDNode!");
857 assert(!isa<EHLabelSDNode>(N) && "Bad EHLabelSDNode!");
858 assert(!isa<ExternalSymbolSDNode>(N) && "Bad ExternalSymbolSDNode!");
859 assert(!isa<CondCodeSDNode>(N) && "Bad CondCodeSDNode!");
860 assert(!isa<CvtRndSatSDNode>(N) && "Bad CvtRndSatSDNode!");
861 assert(!isa<VTSDNode>(N) && "Bad VTSDNode!");
862 assert(!isa<MachineSDNode>(N) && "Bad MachineSDNode!");
863
864 VerifyNodeCommon(N);
865 }
866
867 /// VerifyMachineNode - Sanity check the given MachineNode. Aborts if it is
868 /// invalid.
VerifyMachineNode(SDNode * N)869 static void VerifyMachineNode(SDNode *N) {
870 // The MachineNode allocators cannot be used to allocate nodes with fields
871 // that are not present in a MachineNode!
872 // Currently there are no such nodes.
873
874 VerifyNodeCommon(N);
875 }
876 #endif // NDEBUG
877
878 /// getEVTAlignment - Compute the default alignment value for the
879 /// given type.
880 ///
getEVTAlignment(EVT VT) const881 unsigned SelectionDAG::getEVTAlignment(EVT VT) const {
882 Type *Ty = VT == MVT::iPTR ?
883 PointerType::get(Type::getInt8Ty(*getContext()), 0) :
884 VT.getTypeForEVT(*getContext());
885
886 return TLI.getTargetData()->getABITypeAlignment(Ty);
887 }
888
889 // EntryNode could meaningfully have debug info if we can find it...
SelectionDAG(const TargetMachine & tm,CodeGenOpt::Level OL)890 SelectionDAG::SelectionDAG(const TargetMachine &tm, CodeGenOpt::Level OL)
891 : TM(tm), TLI(*tm.getTargetLowering()), TSI(*tm.getSelectionDAGInfo()),
892 OptLevel(OL), EntryNode(ISD::EntryToken, DebugLoc(), getVTList(MVT::Other)),
893 Root(getEntryNode()), Ordering(0), UpdateListeners(0) {
894 AllNodes.push_back(&EntryNode);
895 Ordering = new SDNodeOrdering();
896 DbgInfo = new SDDbgInfo();
897 }
898
init(MachineFunction & mf)899 void SelectionDAG::init(MachineFunction &mf) {
900 MF = &mf;
901 Context = &mf.getFunction()->getContext();
902 }
903
~SelectionDAG()904 SelectionDAG::~SelectionDAG() {
905 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
906 allnodes_clear();
907 delete Ordering;
908 delete DbgInfo;
909 }
910
allnodes_clear()911 void SelectionDAG::allnodes_clear() {
912 assert(&*AllNodes.begin() == &EntryNode);
913 AllNodes.remove(AllNodes.begin());
914 while (!AllNodes.empty())
915 DeallocateNode(AllNodes.begin());
916 }
917
clear()918 void SelectionDAG::clear() {
919 allnodes_clear();
920 OperandAllocator.Reset();
921 CSEMap.clear();
922
923 ExtendedValueTypeNodes.clear();
924 ExternalSymbols.clear();
925 TargetExternalSymbols.clear();
926 std::fill(CondCodeNodes.begin(), CondCodeNodes.end(),
927 static_cast<CondCodeSDNode*>(0));
928 std::fill(ValueTypeNodes.begin(), ValueTypeNodes.end(),
929 static_cast<SDNode*>(0));
930
931 EntryNode.UseList = 0;
932 AllNodes.push_back(&EntryNode);
933 Root = getEntryNode();
934 Ordering->clear();
935 DbgInfo->clear();
936 }
937
getAnyExtOrTrunc(SDValue Op,DebugLoc DL,EVT VT)938 SDValue SelectionDAG::getAnyExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT) {
939 return VT.bitsGT(Op.getValueType()) ?
940 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
941 getNode(ISD::TRUNCATE, DL, VT, Op);
942 }
943
getSExtOrTrunc(SDValue Op,DebugLoc DL,EVT VT)944 SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT) {
945 return VT.bitsGT(Op.getValueType()) ?
946 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
947 getNode(ISD::TRUNCATE, DL, VT, Op);
948 }
949
getZExtOrTrunc(SDValue Op,DebugLoc DL,EVT VT)950 SDValue SelectionDAG::getZExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT) {
951 return VT.bitsGT(Op.getValueType()) ?
952 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
953 getNode(ISD::TRUNCATE, DL, VT, Op);
954 }
955
getZeroExtendInReg(SDValue Op,DebugLoc DL,EVT VT)956 SDValue SelectionDAG::getZeroExtendInReg(SDValue Op, DebugLoc DL, EVT VT) {
957 assert(!VT.isVector() &&
958 "getZeroExtendInReg should use the vector element type instead of "
959 "the vector type!");
960 if (Op.getValueType() == VT) return Op;
961 unsigned BitWidth = Op.getValueType().getScalarType().getSizeInBits();
962 APInt Imm = APInt::getLowBitsSet(BitWidth,
963 VT.getSizeInBits());
964 return getNode(ISD::AND, DL, Op.getValueType(), Op,
965 getConstant(Imm, Op.getValueType()));
966 }
967
968 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
969 ///
getNOT(DebugLoc DL,SDValue Val,EVT VT)970 SDValue SelectionDAG::getNOT(DebugLoc DL, SDValue Val, EVT VT) {
971 EVT EltVT = VT.getScalarType();
972 SDValue NegOne =
973 getConstant(APInt::getAllOnesValue(EltVT.getSizeInBits()), VT);
974 return getNode(ISD::XOR, DL, VT, Val, NegOne);
975 }
976
getConstant(uint64_t Val,EVT VT,bool isT)977 SDValue SelectionDAG::getConstant(uint64_t Val, EVT VT, bool isT) {
978 EVT EltVT = VT.getScalarType();
979 assert((EltVT.getSizeInBits() >= 64 ||
980 (uint64_t)((int64_t)Val >> EltVT.getSizeInBits()) + 1 < 2) &&
981 "getConstant with a uint64_t value that doesn't fit in the type!");
982 return getConstant(APInt(EltVT.getSizeInBits(), Val), VT, isT);
983 }
984
getConstant(const APInt & Val,EVT VT,bool isT)985 SDValue SelectionDAG::getConstant(const APInt &Val, EVT VT, bool isT) {
986 return getConstant(*ConstantInt::get(*Context, Val), VT, isT);
987 }
988
getConstant(const ConstantInt & Val,EVT VT,bool isT)989 SDValue SelectionDAG::getConstant(const ConstantInt &Val, EVT VT, bool isT) {
990 assert(VT.isInteger() && "Cannot create FP integer constant!");
991
992 EVT EltVT = VT.getScalarType();
993 const ConstantInt *Elt = &Val;
994
995 // In some cases the vector type is legal but the element type is illegal and
996 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
997 // inserted value (the type does not need to match the vector element type).
998 // Any extra bits introduced will be truncated away.
999 if (VT.isVector() && TLI.getTypeAction(*getContext(), EltVT) ==
1000 TargetLowering::TypePromoteInteger) {
1001 EltVT = TLI.getTypeToTransformTo(*getContext(), EltVT);
1002 APInt NewVal = Elt->getValue().zext(EltVT.getSizeInBits());
1003 Elt = ConstantInt::get(*getContext(), NewVal);
1004 }
1005
1006 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1007 "APInt size does not match type size!");
1008 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1009 FoldingSetNodeID ID;
1010 AddNodeIDNode(ID, Opc, getVTList(EltVT), 0, 0);
1011 ID.AddPointer(Elt);
1012 void *IP = 0;
1013 SDNode *N = NULL;
1014 if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))
1015 if (!VT.isVector())
1016 return SDValue(N, 0);
1017
1018 if (!N) {
1019 N = new (NodeAllocator) ConstantSDNode(isT, Elt, EltVT);
1020 CSEMap.InsertNode(N, IP);
1021 AllNodes.push_back(N);
1022 }
1023
1024 SDValue Result(N, 0);
1025 if (VT.isVector()) {
1026 SmallVector<SDValue, 8> Ops;
1027 Ops.assign(VT.getVectorNumElements(), Result);
1028 Result = getNode(ISD::BUILD_VECTOR, DebugLoc(), VT, &Ops[0], Ops.size());
1029 }
1030 return Result;
1031 }
1032
getIntPtrConstant(uint64_t Val,bool isTarget)1033 SDValue SelectionDAG::getIntPtrConstant(uint64_t Val, bool isTarget) {
1034 return getConstant(Val, TLI.getPointerTy(), isTarget);
1035 }
1036
1037
getConstantFP(const APFloat & V,EVT VT,bool isTarget)1038 SDValue SelectionDAG::getConstantFP(const APFloat& V, EVT VT, bool isTarget) {
1039 return getConstantFP(*ConstantFP::get(*getContext(), V), VT, isTarget);
1040 }
1041
getConstantFP(const ConstantFP & V,EVT VT,bool isTarget)1042 SDValue SelectionDAG::getConstantFP(const ConstantFP& V, EVT VT, bool isTarget){
1043 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1044
1045 EVT EltVT = VT.getScalarType();
1046
1047 // Do the map lookup using the actual bit pattern for the floating point
1048 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1049 // we don't have issues with SNANs.
1050 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1051 FoldingSetNodeID ID;
1052 AddNodeIDNode(ID, Opc, getVTList(EltVT), 0, 0);
1053 ID.AddPointer(&V);
1054 void *IP = 0;
1055 SDNode *N = NULL;
1056 if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))
1057 if (!VT.isVector())
1058 return SDValue(N, 0);
1059
1060 if (!N) {
1061 N = new (NodeAllocator) ConstantFPSDNode(isTarget, &V, EltVT);
1062 CSEMap.InsertNode(N, IP);
1063 AllNodes.push_back(N);
1064 }
1065
1066 SDValue Result(N, 0);
1067 if (VT.isVector()) {
1068 SmallVector<SDValue, 8> Ops;
1069 Ops.assign(VT.getVectorNumElements(), Result);
1070 // FIXME DebugLoc info might be appropriate here
1071 Result = getNode(ISD::BUILD_VECTOR, DebugLoc(), VT, &Ops[0], Ops.size());
1072 }
1073 return Result;
1074 }
1075
getConstantFP(double Val,EVT VT,bool isTarget)1076 SDValue SelectionDAG::getConstantFP(double Val, EVT VT, bool isTarget) {
1077 EVT EltVT = VT.getScalarType();
1078 if (EltVT==MVT::f32)
1079 return getConstantFP(APFloat((float)Val), VT, isTarget);
1080 else if (EltVT==MVT::f64)
1081 return getConstantFP(APFloat(Val), VT, isTarget);
1082 else if (EltVT==MVT::f80 || EltVT==MVT::f128 || EltVT==MVT::f16) {
1083 bool ignored;
1084 APFloat apf = APFloat(Val);
1085 apf.convert(*EVTToAPFloatSemantics(EltVT), APFloat::rmNearestTiesToEven,
1086 &ignored);
1087 return getConstantFP(apf, VT, isTarget);
1088 } else
1089 llvm_unreachable("Unsupported type in getConstantFP");
1090 }
1091
getGlobalAddress(const GlobalValue * GV,DebugLoc DL,EVT VT,int64_t Offset,bool isTargetGA,unsigned char TargetFlags)1092 SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV, DebugLoc DL,
1093 EVT VT, int64_t Offset,
1094 bool isTargetGA,
1095 unsigned char TargetFlags) {
1096 assert((TargetFlags == 0 || isTargetGA) &&
1097 "Cannot set target flags on target-independent globals");
1098
1099 // Truncate (with sign-extension) the offset value to the pointer size.
1100 unsigned BitWidth = TLI.getPointerTy().getSizeInBits();
1101 if (BitWidth < 64)
1102 Offset = SignExtend64(Offset, BitWidth);
1103
1104 const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
1105 if (!GVar) {
1106 // If GV is an alias then use the aliasee for determining thread-localness.
1107 if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
1108 GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal(false));
1109 }
1110
1111 unsigned Opc;
1112 if (GVar && GVar->isThreadLocal())
1113 Opc = isTargetGA ? ISD::TargetGlobalTLSAddress : ISD::GlobalTLSAddress;
1114 else
1115 Opc = isTargetGA ? ISD::TargetGlobalAddress : ISD::GlobalAddress;
1116
1117 FoldingSetNodeID ID;
1118 AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
1119 ID.AddPointer(GV);
1120 ID.AddInteger(Offset);
1121 ID.AddInteger(TargetFlags);
1122 ID.AddInteger(GV->getType()->getAddressSpace());
1123 void *IP = 0;
1124 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1125 return SDValue(E, 0);
1126
1127 SDNode *N = new (NodeAllocator) GlobalAddressSDNode(Opc, DL, GV, VT,
1128 Offset, TargetFlags);
1129 CSEMap.InsertNode(N, IP);
1130 AllNodes.push_back(N);
1131 return SDValue(N, 0);
1132 }
1133
getFrameIndex(int FI,EVT VT,bool isTarget)1134 SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1135 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
1136 FoldingSetNodeID ID;
1137 AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
1138 ID.AddInteger(FI);
1139 void *IP = 0;
1140 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1141 return SDValue(E, 0);
1142
1143 SDNode *N = new (NodeAllocator) FrameIndexSDNode(FI, VT, isTarget);
1144 CSEMap.InsertNode(N, IP);
1145 AllNodes.push_back(N);
1146 return SDValue(N, 0);
1147 }
1148
getJumpTable(int JTI,EVT VT,bool isTarget,unsigned char TargetFlags)1149 SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1150 unsigned char TargetFlags) {
1151 assert((TargetFlags == 0 || isTarget) &&
1152 "Cannot set target flags on target-independent jump tables");
1153 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
1154 FoldingSetNodeID ID;
1155 AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
1156 ID.AddInteger(JTI);
1157 ID.AddInteger(TargetFlags);
1158 void *IP = 0;
1159 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1160 return SDValue(E, 0);
1161
1162 SDNode *N = new (NodeAllocator) JumpTableSDNode(JTI, VT, isTarget,
1163 TargetFlags);
1164 CSEMap.InsertNode(N, IP);
1165 AllNodes.push_back(N);
1166 return SDValue(N, 0);
1167 }
1168
getConstantPool(const Constant * C,EVT VT,unsigned Alignment,int Offset,bool isTarget,unsigned char TargetFlags)1169 SDValue SelectionDAG::getConstantPool(const Constant *C, EVT VT,
1170 unsigned Alignment, int Offset,
1171 bool isTarget,
1172 unsigned char TargetFlags) {
1173 assert((TargetFlags == 0 || isTarget) &&
1174 "Cannot set target flags on target-independent globals");
1175 if (Alignment == 0)
1176 Alignment = TLI.getTargetData()->getPrefTypeAlignment(C->getType());
1177 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
1178 FoldingSetNodeID ID;
1179 AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
1180 ID.AddInteger(Alignment);
1181 ID.AddInteger(Offset);
1182 ID.AddPointer(C);
1183 ID.AddInteger(TargetFlags);
1184 void *IP = 0;
1185 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1186 return SDValue(E, 0);
1187
1188 SDNode *N = new (NodeAllocator) ConstantPoolSDNode(isTarget, C, VT, Offset,
1189 Alignment, TargetFlags);
1190 CSEMap.InsertNode(N, IP);
1191 AllNodes.push_back(N);
1192 return SDValue(N, 0);
1193 }
1194
1195
getConstantPool(MachineConstantPoolValue * C,EVT VT,unsigned Alignment,int Offset,bool isTarget,unsigned char TargetFlags)1196 SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, EVT VT,
1197 unsigned Alignment, int Offset,
1198 bool isTarget,
1199 unsigned char TargetFlags) {
1200 assert((TargetFlags == 0 || isTarget) &&
1201 "Cannot set target flags on target-independent globals");
1202 if (Alignment == 0)
1203 Alignment = TLI.getTargetData()->getPrefTypeAlignment(C->getType());
1204 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
1205 FoldingSetNodeID ID;
1206 AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
1207 ID.AddInteger(Alignment);
1208 ID.AddInteger(Offset);
1209 C->addSelectionDAGCSEId(ID);
1210 ID.AddInteger(TargetFlags);
1211 void *IP = 0;
1212 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1213 return SDValue(E, 0);
1214
1215 SDNode *N = new (NodeAllocator) ConstantPoolSDNode(isTarget, C, VT, Offset,
1216 Alignment, TargetFlags);
1217 CSEMap.InsertNode(N, IP);
1218 AllNodes.push_back(N);
1219 return SDValue(N, 0);
1220 }
1221
getTargetIndex(int Index,EVT VT,int64_t Offset,unsigned char TargetFlags)1222 SDValue SelectionDAG::getTargetIndex(int Index, EVT VT, int64_t Offset,
1223 unsigned char TargetFlags) {
1224 FoldingSetNodeID ID;
1225 AddNodeIDNode(ID, ISD::TargetIndex, getVTList(VT), 0, 0);
1226 ID.AddInteger(Index);
1227 ID.AddInteger(Offset);
1228 ID.AddInteger(TargetFlags);
1229 void *IP = 0;
1230 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1231 return SDValue(E, 0);
1232
1233 SDNode *N = new (NodeAllocator) TargetIndexSDNode(Index, VT, Offset,
1234 TargetFlags);
1235 CSEMap.InsertNode(N, IP);
1236 AllNodes.push_back(N);
1237 return SDValue(N, 0);
1238 }
1239
getBasicBlock(MachineBasicBlock * MBB)1240 SDValue SelectionDAG::getBasicBlock(MachineBasicBlock *MBB) {
1241 FoldingSetNodeID ID;
1242 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), 0, 0);
1243 ID.AddPointer(MBB);
1244 void *IP = 0;
1245 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1246 return SDValue(E, 0);
1247
1248 SDNode *N = new (NodeAllocator) BasicBlockSDNode(MBB);
1249 CSEMap.InsertNode(N, IP);
1250 AllNodes.push_back(N);
1251 return SDValue(N, 0);
1252 }
1253
getValueType(EVT VT)1254 SDValue SelectionDAG::getValueType(EVT VT) {
1255 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
1256 ValueTypeNodes.size())
1257 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
1258
1259 SDNode *&N = VT.isExtended() ?
1260 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
1261
1262 if (N) return SDValue(N, 0);
1263 N = new (NodeAllocator) VTSDNode(VT);
1264 AllNodes.push_back(N);
1265 return SDValue(N, 0);
1266 }
1267
getExternalSymbol(const char * Sym,EVT VT)1268 SDValue SelectionDAG::getExternalSymbol(const char *Sym, EVT VT) {
1269 SDNode *&N = ExternalSymbols[Sym];
1270 if (N) return SDValue(N, 0);
1271 N = new (NodeAllocator) ExternalSymbolSDNode(false, Sym, 0, VT);
1272 AllNodes.push_back(N);
1273 return SDValue(N, 0);
1274 }
1275
getTargetExternalSymbol(const char * Sym,EVT VT,unsigned char TargetFlags)1276 SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, EVT VT,
1277 unsigned char TargetFlags) {
1278 SDNode *&N =
1279 TargetExternalSymbols[std::pair<std::string,unsigned char>(Sym,
1280 TargetFlags)];
1281 if (N) return SDValue(N, 0);
1282 N = new (NodeAllocator) ExternalSymbolSDNode(true, Sym, TargetFlags, VT);
1283 AllNodes.push_back(N);
1284 return SDValue(N, 0);
1285 }
1286
getCondCode(ISD::CondCode Cond)1287 SDValue SelectionDAG::getCondCode(ISD::CondCode Cond) {
1288 if ((unsigned)Cond >= CondCodeNodes.size())
1289 CondCodeNodes.resize(Cond+1);
1290
1291 if (CondCodeNodes[Cond] == 0) {
1292 CondCodeSDNode *N = new (NodeAllocator) CondCodeSDNode(Cond);
1293 CondCodeNodes[Cond] = N;
1294 AllNodes.push_back(N);
1295 }
1296
1297 return SDValue(CondCodeNodes[Cond], 0);
1298 }
1299
1300 // commuteShuffle - swaps the values of N1 and N2, and swaps all indices in
1301 // the shuffle mask M that point at N1 to point at N2, and indices that point
1302 // N2 to point at N1.
commuteShuffle(SDValue & N1,SDValue & N2,SmallVectorImpl<int> & M)1303 static void commuteShuffle(SDValue &N1, SDValue &N2, SmallVectorImpl<int> &M) {
1304 std::swap(N1, N2);
1305 int NElts = M.size();
1306 for (int i = 0; i != NElts; ++i) {
1307 if (M[i] >= NElts)
1308 M[i] -= NElts;
1309 else if (M[i] >= 0)
1310 M[i] += NElts;
1311 }
1312 }
1313
getVectorShuffle(EVT VT,DebugLoc dl,SDValue N1,SDValue N2,const int * Mask)1314 SDValue SelectionDAG::getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1,
1315 SDValue N2, const int *Mask) {
1316 assert(N1.getValueType() == N2.getValueType() && "Invalid VECTOR_SHUFFLE");
1317 assert(VT.isVector() && N1.getValueType().isVector() &&
1318 "Vector Shuffle VTs must be a vectors");
1319 assert(VT.getVectorElementType() == N1.getValueType().getVectorElementType()
1320 && "Vector Shuffle VTs must have same element type");
1321
1322 // Canonicalize shuffle undef, undef -> undef
1323 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() == ISD::UNDEF)
1324 return getUNDEF(VT);
1325
1326 // Validate that all indices in Mask are within the range of the elements
1327 // input to the shuffle.
1328 unsigned NElts = VT.getVectorNumElements();
1329 SmallVector<int, 8> MaskVec;
1330 for (unsigned i = 0; i != NElts; ++i) {
1331 assert(Mask[i] < (int)(NElts * 2) && "Index out of range");
1332 MaskVec.push_back(Mask[i]);
1333 }
1334
1335 // Canonicalize shuffle v, v -> v, undef
1336 if (N1 == N2) {
1337 N2 = getUNDEF(VT);
1338 for (unsigned i = 0; i != NElts; ++i)
1339 if (MaskVec[i] >= (int)NElts) MaskVec[i] -= NElts;
1340 }
1341
1342 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
1343 if (N1.getOpcode() == ISD::UNDEF)
1344 commuteShuffle(N1, N2, MaskVec);
1345
1346 // Canonicalize all index into lhs, -> shuffle lhs, undef
1347 // Canonicalize all index into rhs, -> shuffle rhs, undef
1348 bool AllLHS = true, AllRHS = true;
1349 bool N2Undef = N2.getOpcode() == ISD::UNDEF;
1350 for (unsigned i = 0; i != NElts; ++i) {
1351 if (MaskVec[i] >= (int)NElts) {
1352 if (N2Undef)
1353 MaskVec[i] = -1;
1354 else
1355 AllLHS = false;
1356 } else if (MaskVec[i] >= 0) {
1357 AllRHS = false;
1358 }
1359 }
1360 if (AllLHS && AllRHS)
1361 return getUNDEF(VT);
1362 if (AllLHS && !N2Undef)
1363 N2 = getUNDEF(VT);
1364 if (AllRHS) {
1365 N1 = getUNDEF(VT);
1366 commuteShuffle(N1, N2, MaskVec);
1367 }
1368
1369 // If Identity shuffle, or all shuffle in to undef, return that node.
1370 bool AllUndef = true;
1371 bool Identity = true;
1372 for (unsigned i = 0; i != NElts; ++i) {
1373 if (MaskVec[i] >= 0 && MaskVec[i] != (int)i) Identity = false;
1374 if (MaskVec[i] >= 0) AllUndef = false;
1375 }
1376 if (Identity && NElts == N1.getValueType().getVectorNumElements())
1377 return N1;
1378 if (AllUndef)
1379 return getUNDEF(VT);
1380
1381 FoldingSetNodeID ID;
1382 SDValue Ops[2] = { N1, N2 };
1383 AddNodeIDNode(ID, ISD::VECTOR_SHUFFLE, getVTList(VT), Ops, 2);
1384 for (unsigned i = 0; i != NElts; ++i)
1385 ID.AddInteger(MaskVec[i]);
1386
1387 void* IP = 0;
1388 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1389 return SDValue(E, 0);
1390
1391 // Allocate the mask array for the node out of the BumpPtrAllocator, since
1392 // SDNode doesn't have access to it. This memory will be "leaked" when
1393 // the node is deallocated, but recovered when the NodeAllocator is released.
1394 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
1395 memcpy(MaskAlloc, &MaskVec[0], NElts * sizeof(int));
1396
1397 ShuffleVectorSDNode *N =
1398 new (NodeAllocator) ShuffleVectorSDNode(VT, dl, N1, N2, MaskAlloc);
1399 CSEMap.InsertNode(N, IP);
1400 AllNodes.push_back(N);
1401 return SDValue(N, 0);
1402 }
1403
getConvertRndSat(EVT VT,DebugLoc dl,SDValue Val,SDValue DTy,SDValue STy,SDValue Rnd,SDValue Sat,ISD::CvtCode Code)1404 SDValue SelectionDAG::getConvertRndSat(EVT VT, DebugLoc dl,
1405 SDValue Val, SDValue DTy,
1406 SDValue STy, SDValue Rnd, SDValue Sat,
1407 ISD::CvtCode Code) {
1408 // If the src and dest types are the same and the conversion is between
1409 // integer types of the same sign or two floats, no conversion is necessary.
1410 if (DTy == STy &&
1411 (Code == ISD::CVT_UU || Code == ISD::CVT_SS || Code == ISD::CVT_FF))
1412 return Val;
1413
1414 FoldingSetNodeID ID;
1415 SDValue Ops[] = { Val, DTy, STy, Rnd, Sat };
1416 AddNodeIDNode(ID, ISD::CONVERT_RNDSAT, getVTList(VT), &Ops[0], 5);
1417 void* IP = 0;
1418 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1419 return SDValue(E, 0);
1420
1421 CvtRndSatSDNode *N = new (NodeAllocator) CvtRndSatSDNode(VT, dl, Ops, 5,
1422 Code);
1423 CSEMap.InsertNode(N, IP);
1424 AllNodes.push_back(N);
1425 return SDValue(N, 0);
1426 }
1427
getRegister(unsigned RegNo,EVT VT)1428 SDValue SelectionDAG::getRegister(unsigned RegNo, EVT VT) {
1429 FoldingSetNodeID ID;
1430 AddNodeIDNode(ID, ISD::Register, getVTList(VT), 0, 0);
1431 ID.AddInteger(RegNo);
1432 void *IP = 0;
1433 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1434 return SDValue(E, 0);
1435
1436 SDNode *N = new (NodeAllocator) RegisterSDNode(RegNo, VT);
1437 CSEMap.InsertNode(N, IP);
1438 AllNodes.push_back(N);
1439 return SDValue(N, 0);
1440 }
1441
getRegisterMask(const uint32_t * RegMask)1442 SDValue SelectionDAG::getRegisterMask(const uint32_t *RegMask) {
1443 FoldingSetNodeID ID;
1444 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), 0, 0);
1445 ID.AddPointer(RegMask);
1446 void *IP = 0;
1447 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1448 return SDValue(E, 0);
1449
1450 SDNode *N = new (NodeAllocator) RegisterMaskSDNode(RegMask);
1451 CSEMap.InsertNode(N, IP);
1452 AllNodes.push_back(N);
1453 return SDValue(N, 0);
1454 }
1455
getEHLabel(DebugLoc dl,SDValue Root,MCSymbol * Label)1456 SDValue SelectionDAG::getEHLabel(DebugLoc dl, SDValue Root, MCSymbol *Label) {
1457 FoldingSetNodeID ID;
1458 SDValue Ops[] = { Root };
1459 AddNodeIDNode(ID, ISD::EH_LABEL, getVTList(MVT::Other), &Ops[0], 1);
1460 ID.AddPointer(Label);
1461 void *IP = 0;
1462 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1463 return SDValue(E, 0);
1464
1465 SDNode *N = new (NodeAllocator) EHLabelSDNode(dl, Root, Label);
1466 CSEMap.InsertNode(N, IP);
1467 AllNodes.push_back(N);
1468 return SDValue(N, 0);
1469 }
1470
1471
getBlockAddress(const BlockAddress * BA,EVT VT,bool isTarget,unsigned char TargetFlags)1472 SDValue SelectionDAG::getBlockAddress(const BlockAddress *BA, EVT VT,
1473 bool isTarget,
1474 unsigned char TargetFlags) {
1475 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
1476
1477 FoldingSetNodeID ID;
1478 AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);
1479 ID.AddPointer(BA);
1480 ID.AddInteger(TargetFlags);
1481 void *IP = 0;
1482 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1483 return SDValue(E, 0);
1484
1485 SDNode *N = new (NodeAllocator) BlockAddressSDNode(Opc, VT, BA, TargetFlags);
1486 CSEMap.InsertNode(N, IP);
1487 AllNodes.push_back(N);
1488 return SDValue(N, 0);
1489 }
1490
getSrcValue(const Value * V)1491 SDValue SelectionDAG::getSrcValue(const Value *V) {
1492 assert((!V || V->getType()->isPointerTy()) &&
1493 "SrcValue is not a pointer?");
1494
1495 FoldingSetNodeID ID;
1496 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), 0, 0);
1497 ID.AddPointer(V);
1498
1499 void *IP = 0;
1500 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1501 return SDValue(E, 0);
1502
1503 SDNode *N = new (NodeAllocator) SrcValueSDNode(V);
1504 CSEMap.InsertNode(N, IP);
1505 AllNodes.push_back(N);
1506 return SDValue(N, 0);
1507 }
1508
1509 /// getMDNode - Return an MDNodeSDNode which holds an MDNode.
getMDNode(const MDNode * MD)1510 SDValue SelectionDAG::getMDNode(const MDNode *MD) {
1511 FoldingSetNodeID ID;
1512 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), 0, 0);
1513 ID.AddPointer(MD);
1514
1515 void *IP = 0;
1516 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
1517 return SDValue(E, 0);
1518
1519 SDNode *N = new (NodeAllocator) MDNodeSDNode(MD);
1520 CSEMap.InsertNode(N, IP);
1521 AllNodes.push_back(N);
1522 return SDValue(N, 0);
1523 }
1524
1525
1526 /// getShiftAmountOperand - Return the specified value casted to
1527 /// the target's desired shift amount type.
getShiftAmountOperand(EVT LHSTy,SDValue Op)1528 SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) {
1529 EVT OpTy = Op.getValueType();
1530 MVT ShTy = TLI.getShiftAmountTy(LHSTy);
1531 if (OpTy == ShTy || OpTy.isVector()) return Op;
1532
1533 ISD::NodeType Opcode = OpTy.bitsGT(ShTy) ? ISD::TRUNCATE : ISD::ZERO_EXTEND;
1534 return getNode(Opcode, Op.getDebugLoc(), ShTy, Op);
1535 }
1536
1537 /// CreateStackTemporary - Create a stack temporary, suitable for holding the
1538 /// specified value type.
CreateStackTemporary(EVT VT,unsigned minAlign)1539 SDValue SelectionDAG::CreateStackTemporary(EVT VT, unsigned minAlign) {
1540 MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo();
1541 unsigned ByteSize = VT.getStoreSize();
1542 Type *Ty = VT.getTypeForEVT(*getContext());
1543 unsigned StackAlign =
1544 std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty), minAlign);
1545
1546 int FrameIdx = FrameInfo->CreateStackObject(ByteSize, StackAlign, false);
1547 return getFrameIndex(FrameIdx, TLI.getPointerTy());
1548 }
1549
1550 /// CreateStackTemporary - Create a stack temporary suitable for holding
1551 /// either of the specified value types.
CreateStackTemporary(EVT VT1,EVT VT2)1552 SDValue SelectionDAG::CreateStackTemporary(EVT VT1, EVT VT2) {
1553 unsigned Bytes = std::max(VT1.getStoreSizeInBits(),
1554 VT2.getStoreSizeInBits())/8;
1555 Type *Ty1 = VT1.getTypeForEVT(*getContext());
1556 Type *Ty2 = VT2.getTypeForEVT(*getContext());
1557 const TargetData *TD = TLI.getTargetData();
1558 unsigned Align = std::max(TD->getPrefTypeAlignment(Ty1),
1559 TD->getPrefTypeAlignment(Ty2));
1560
1561 MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo();
1562 int FrameIdx = FrameInfo->CreateStackObject(Bytes, Align, false);
1563 return getFrameIndex(FrameIdx, TLI.getPointerTy());
1564 }
1565
FoldSetCC(EVT VT,SDValue N1,SDValue N2,ISD::CondCode Cond,DebugLoc dl)1566 SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1,
1567 SDValue N2, ISD::CondCode Cond, DebugLoc dl) {
1568 // These setcc operations always fold.
1569 switch (Cond) {
1570 default: break;
1571 case ISD::SETFALSE:
1572 case ISD::SETFALSE2: return getConstant(0, VT);
1573 case ISD::SETTRUE:
1574 case ISD::SETTRUE2: return getConstant(1, VT);
1575
1576 case ISD::SETOEQ:
1577 case ISD::SETOGT:
1578 case ISD::SETOGE:
1579 case ISD::SETOLT:
1580 case ISD::SETOLE:
1581 case ISD::SETONE:
1582 case ISD::SETO:
1583 case ISD::SETUO:
1584 case ISD::SETUEQ:
1585 case ISD::SETUNE:
1586 assert(!N1.getValueType().isInteger() && "Illegal setcc for integer!");
1587 break;
1588 }
1589
1590 if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.getNode())) {
1591 const APInt &C2 = N2C->getAPIntValue();
1592 if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
1593 const APInt &C1 = N1C->getAPIntValue();
1594
1595 switch (Cond) {
1596 default: llvm_unreachable("Unknown integer setcc!");
1597 case ISD::SETEQ: return getConstant(C1 == C2, VT);
1598 case ISD::SETNE: return getConstant(C1 != C2, VT);
1599 case ISD::SETULT: return getConstant(C1.ult(C2), VT);
1600 case ISD::SETUGT: return getConstant(C1.ugt(C2), VT);
1601 case ISD::SETULE: return getConstant(C1.ule(C2), VT);
1602 case ISD::SETUGE: return getConstant(C1.uge(C2), VT);
1603 case ISD::SETLT: return getConstant(C1.slt(C2), VT);
1604 case ISD::SETGT: return getConstant(C1.sgt(C2), VT);
1605 case ISD::SETLE: return getConstant(C1.sle(C2), VT);
1606 case ISD::SETGE: return getConstant(C1.sge(C2), VT);
1607 }
1608 }
1609 }
1610 if (ConstantFPSDNode *N1C = dyn_cast<ConstantFPSDNode>(N1.getNode())) {
1611 if (ConstantFPSDNode *N2C = dyn_cast<ConstantFPSDNode>(N2.getNode())) {
1612 // No compile time operations on this type yet.
1613 if (N1C->getValueType(0) == MVT::ppcf128)
1614 return SDValue();
1615
1616 APFloat::cmpResult R = N1C->getValueAPF().compare(N2C->getValueAPF());
1617 switch (Cond) {
1618 default: break;
1619 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
1620 return getUNDEF(VT);
1621 // fall through
1622 case ISD::SETOEQ: return getConstant(R==APFloat::cmpEqual, VT);
1623 case ISD::SETNE: if (R==APFloat::cmpUnordered)
1624 return getUNDEF(VT);
1625 // fall through
1626 case ISD::SETONE: return getConstant(R==APFloat::cmpGreaterThan ||
1627 R==APFloat::cmpLessThan, VT);
1628 case ISD::SETLT: if (R==APFloat::cmpUnordered)
1629 return getUNDEF(VT);
1630 // fall through
1631 case ISD::SETOLT: return getConstant(R==APFloat::cmpLessThan, VT);
1632 case ISD::SETGT: if (R==APFloat::cmpUnordered)
1633 return getUNDEF(VT);
1634 // fall through
1635 case ISD::SETOGT: return getConstant(R==APFloat::cmpGreaterThan, VT);
1636 case ISD::SETLE: if (R==APFloat::cmpUnordered)
1637 return getUNDEF(VT);
1638 // fall through
1639 case ISD::SETOLE: return getConstant(R==APFloat::cmpLessThan ||
1640 R==APFloat::cmpEqual, VT);
1641 case ISD::SETGE: if (R==APFloat::cmpUnordered)
1642 return getUNDEF(VT);
1643 // fall through
1644 case ISD::SETOGE: return getConstant(R==APFloat::cmpGreaterThan ||
1645 R==APFloat::cmpEqual, VT);
1646 case ISD::SETO: return getConstant(R!=APFloat::cmpUnordered, VT);
1647 case ISD::SETUO: return getConstant(R==APFloat::cmpUnordered, VT);
1648 case ISD::SETUEQ: return getConstant(R==APFloat::cmpUnordered ||
1649 R==APFloat::cmpEqual, VT);
1650 case ISD::SETUNE: return getConstant(R!=APFloat::cmpEqual, VT);
1651 case ISD::SETULT: return getConstant(R==APFloat::cmpUnordered ||
1652 R==APFloat::cmpLessThan, VT);
1653 case ISD::SETUGT: return getConstant(R==APFloat::cmpGreaterThan ||
1654 R==APFloat::cmpUnordered, VT);
1655 case ISD::SETULE: return getConstant(R!=APFloat::cmpGreaterThan, VT);
1656 case ISD::SETUGE: return getConstant(R!=APFloat::cmpLessThan, VT);
1657 }
1658 } else {
1659 // Ensure that the constant occurs on the RHS.
1660 return getSetCC(dl, VT, N2, N1, ISD::getSetCCSwappedOperands(Cond));
1661 }
1662 }
1663
1664 // Could not fold it.
1665 return SDValue();
1666 }
1667
1668 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
1669 /// use this predicate to simplify operations downstream.
SignBitIsZero(SDValue Op,unsigned Depth) const1670 bool SelectionDAG::SignBitIsZero(SDValue Op, unsigned Depth) const {
1671 // This predicate is not safe for vector operations.
1672 if (Op.getValueType().isVector())
1673 return false;
1674
1675 unsigned BitWidth = Op.getValueType().getScalarType().getSizeInBits();
1676 return MaskedValueIsZero(Op, APInt::getSignBit(BitWidth), Depth);
1677 }
1678
1679 /// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
1680 /// this predicate to simplify operations downstream. Mask is known to be zero
1681 /// for bits that V cannot have.
MaskedValueIsZero(SDValue Op,const APInt & Mask,unsigned Depth) const1682 bool SelectionDAG::MaskedValueIsZero(SDValue Op, const APInt &Mask,
1683 unsigned Depth) const {
1684 APInt KnownZero, KnownOne;
1685 ComputeMaskedBits(Op, KnownZero, KnownOne, Depth);
1686 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1687 return (KnownZero & Mask) == Mask;
1688 }
1689
1690 /// ComputeMaskedBits - Determine which of the bits specified in Mask are
1691 /// known to be either zero or one and return them in the KnownZero/KnownOne
1692 /// bitsets. This code only analyzes bits in Mask, in order to short-circuit
1693 /// processing.
ComputeMaskedBits(SDValue Op,APInt & KnownZero,APInt & KnownOne,unsigned Depth) const1694 void SelectionDAG::ComputeMaskedBits(SDValue Op, APInt &KnownZero,
1695 APInt &KnownOne, unsigned Depth) const {
1696 unsigned BitWidth = Op.getValueType().getScalarType().getSizeInBits();
1697
1698 KnownZero = KnownOne = APInt(BitWidth, 0); // Don't know anything.
1699 if (Depth == 6)
1700 return; // Limit search depth.
1701
1702 APInt KnownZero2, KnownOne2;
1703
1704 switch (Op.getOpcode()) {
1705 case ISD::Constant:
1706 // We know all of the bits for a constant!
1707 KnownOne = cast<ConstantSDNode>(Op)->getAPIntValue();
1708 KnownZero = ~KnownOne;
1709 return;
1710 case ISD::AND:
1711 // If either the LHS or the RHS are Zero, the result is zero.
1712 ComputeMaskedBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
1713 ComputeMaskedBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
1714 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1715 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
1716
1717 // Output known-1 bits are only known if set in both the LHS & RHS.
1718 KnownOne &= KnownOne2;
1719 // Output known-0 are known to be clear if zero in either the LHS | RHS.
1720 KnownZero |= KnownZero2;
1721 return;
1722 case ISD::OR:
1723 ComputeMaskedBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
1724 ComputeMaskedBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
1725 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1726 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
1727
1728 // Output known-0 bits are only known if clear in both the LHS & RHS.
1729 KnownZero &= KnownZero2;
1730 // Output known-1 are known to be set if set in either the LHS | RHS.
1731 KnownOne |= KnownOne2;
1732 return;
1733 case ISD::XOR: {
1734 ComputeMaskedBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
1735 ComputeMaskedBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
1736 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1737 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
1738
1739 // Output known-0 bits are known if clear or set in both the LHS & RHS.
1740 APInt KnownZeroOut = (KnownZero & KnownZero2) | (KnownOne & KnownOne2);
1741 // Output known-1 are known to be set if set in only one of the LHS, RHS.
1742 KnownOne = (KnownZero & KnownOne2) | (KnownOne & KnownZero2);
1743 KnownZero = KnownZeroOut;
1744 return;
1745 }
1746 case ISD::MUL: {
1747 ComputeMaskedBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
1748 ComputeMaskedBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
1749 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1750 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
1751
1752 // If low bits are zero in either operand, output low known-0 bits.
1753 // Also compute a conserative estimate for high known-0 bits.
1754 // More trickiness is possible, but this is sufficient for the
1755 // interesting case of alignment computation.
1756 KnownOne.clearAllBits();
1757 unsigned TrailZ = KnownZero.countTrailingOnes() +
1758 KnownZero2.countTrailingOnes();
1759 unsigned LeadZ = std::max(KnownZero.countLeadingOnes() +
1760 KnownZero2.countLeadingOnes(),
1761 BitWidth) - BitWidth;
1762
1763 TrailZ = std::min(TrailZ, BitWidth);
1764 LeadZ = std::min(LeadZ, BitWidth);
1765 KnownZero = APInt::getLowBitsSet(BitWidth, TrailZ) |
1766 APInt::getHighBitsSet(BitWidth, LeadZ);
1767 return;
1768 }
1769 case ISD::UDIV: {
1770 // For the purposes of computing leading zeros we can conservatively
1771 // treat a udiv as a logical right shift by the power of 2 known to
1772 // be less than the denominator.
1773 ComputeMaskedBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
1774 unsigned LeadZ = KnownZero2.countLeadingOnes();
1775
1776 KnownOne2.clearAllBits();
1777 KnownZero2.clearAllBits();
1778 ComputeMaskedBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
1779 unsigned RHSUnknownLeadingOnes = KnownOne2.countLeadingZeros();
1780 if (RHSUnknownLeadingOnes != BitWidth)
1781 LeadZ = std::min(BitWidth,
1782 LeadZ + BitWidth - RHSUnknownLeadingOnes - 1);
1783
1784 KnownZero = APInt::getHighBitsSet(BitWidth, LeadZ);
1785 return;
1786 }
1787 case ISD::SELECT:
1788 ComputeMaskedBits(Op.getOperand(2), KnownZero, KnownOne, Depth+1);
1789 ComputeMaskedBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
1790 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1791 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
1792
1793 // Only known if known in both the LHS and RHS.
1794 KnownOne &= KnownOne2;
1795 KnownZero &= KnownZero2;
1796 return;
1797 case ISD::SELECT_CC:
1798 ComputeMaskedBits(Op.getOperand(3), KnownZero, KnownOne, Depth+1);
1799 ComputeMaskedBits(Op.getOperand(2), KnownZero2, KnownOne2, Depth+1);
1800 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1801 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
1802
1803 // Only known if known in both the LHS and RHS.
1804 KnownOne &= KnownOne2;
1805 KnownZero &= KnownZero2;
1806 return;
1807 case ISD::SADDO:
1808 case ISD::UADDO:
1809 case ISD::SSUBO:
1810 case ISD::USUBO:
1811 case ISD::SMULO:
1812 case ISD::UMULO:
1813 if (Op.getResNo() != 1)
1814 return;
1815 // The boolean result conforms to getBooleanContents. Fall through.
1816 case ISD::SETCC:
1817 // If we know the result of a setcc has the top bits zero, use this info.
1818 if (TLI.getBooleanContents(Op.getValueType().isVector()) ==
1819 TargetLowering::ZeroOrOneBooleanContent && BitWidth > 1)
1820 KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - 1);
1821 return;
1822 case ISD::SHL:
1823 // (shl X, C1) & C2 == 0 iff (X & C2 >>u C1) == 0
1824 if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
1825 unsigned ShAmt = SA->getZExtValue();
1826
1827 // If the shift count is an invalid immediate, don't do anything.
1828 if (ShAmt >= BitWidth)
1829 return;
1830
1831 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1832 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1833 KnownZero <<= ShAmt;
1834 KnownOne <<= ShAmt;
1835 // low bits known zero.
1836 KnownZero |= APInt::getLowBitsSet(BitWidth, ShAmt);
1837 }
1838 return;
1839 case ISD::SRL:
1840 // (ushr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0
1841 if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
1842 unsigned ShAmt = SA->getZExtValue();
1843
1844 // If the shift count is an invalid immediate, don't do anything.
1845 if (ShAmt >= BitWidth)
1846 return;
1847
1848 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1849 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1850 KnownZero = KnownZero.lshr(ShAmt);
1851 KnownOne = KnownOne.lshr(ShAmt);
1852
1853 APInt HighBits = APInt::getHighBitsSet(BitWidth, ShAmt);
1854 KnownZero |= HighBits; // High bits known zero.
1855 }
1856 return;
1857 case ISD::SRA:
1858 if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
1859 unsigned ShAmt = SA->getZExtValue();
1860
1861 // If the shift count is an invalid immediate, don't do anything.
1862 if (ShAmt >= BitWidth)
1863 return;
1864
1865 // If any of the demanded bits are produced by the sign extension, we also
1866 // demand the input sign bit.
1867 APInt HighBits = APInt::getHighBitsSet(BitWidth, ShAmt);
1868
1869 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1870 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1871 KnownZero = KnownZero.lshr(ShAmt);
1872 KnownOne = KnownOne.lshr(ShAmt);
1873
1874 // Handle the sign bits.
1875 APInt SignBit = APInt::getSignBit(BitWidth);
1876 SignBit = SignBit.lshr(ShAmt); // Adjust to where it is now in the mask.
1877
1878 if (KnownZero.intersects(SignBit)) {
1879 KnownZero |= HighBits; // New bits are known zero.
1880 } else if (KnownOne.intersects(SignBit)) {
1881 KnownOne |= HighBits; // New bits are known one.
1882 }
1883 }
1884 return;
1885 case ISD::SIGN_EXTEND_INREG: {
1886 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
1887 unsigned EBits = EVT.getScalarType().getSizeInBits();
1888
1889 // Sign extension. Compute the demanded bits in the result that are not
1890 // present in the input.
1891 APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - EBits);
1892
1893 APInt InSignBit = APInt::getSignBit(EBits);
1894 APInt InputDemandedBits = APInt::getLowBitsSet(BitWidth, EBits);
1895
1896 // If the sign extended bits are demanded, we know that the sign
1897 // bit is demanded.
1898 InSignBit = InSignBit.zext(BitWidth);
1899 if (NewBits.getBoolValue())
1900 InputDemandedBits |= InSignBit;
1901
1902 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1903 KnownOne &= InputDemandedBits;
1904 KnownZero &= InputDemandedBits;
1905 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1906
1907 // If the sign bit of the input is known set or clear, then we know the
1908 // top bits of the result.
1909 if (KnownZero.intersects(InSignBit)) { // Input sign bit known clear
1910 KnownZero |= NewBits;
1911 KnownOne &= ~NewBits;
1912 } else if (KnownOne.intersects(InSignBit)) { // Input sign bit known set
1913 KnownOne |= NewBits;
1914 KnownZero &= ~NewBits;
1915 } else { // Input sign bit unknown
1916 KnownZero &= ~NewBits;
1917 KnownOne &= ~NewBits;
1918 }
1919 return;
1920 }
1921 case ISD::CTTZ:
1922 case ISD::CTTZ_ZERO_UNDEF:
1923 case ISD::CTLZ:
1924 case ISD::CTLZ_ZERO_UNDEF:
1925 case ISD::CTPOP: {
1926 unsigned LowBits = Log2_32(BitWidth)+1;
1927 KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - LowBits);
1928 KnownOne.clearAllBits();
1929 return;
1930 }
1931 case ISD::LOAD: {
1932 LoadSDNode *LD = cast<LoadSDNode>(Op);
1933 if (ISD::isZEXTLoad(Op.getNode())) {
1934 EVT VT = LD->getMemoryVT();
1935 unsigned MemBits = VT.getScalarType().getSizeInBits();
1936 KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - MemBits);
1937 } else if (const MDNode *Ranges = LD->getRanges()) {
1938 computeMaskedBitsLoad(*Ranges, KnownZero);
1939 }
1940 return;
1941 }
1942 case ISD::ZERO_EXTEND: {
1943 EVT InVT = Op.getOperand(0).getValueType();
1944 unsigned InBits = InVT.getScalarType().getSizeInBits();
1945 APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - InBits);
1946 KnownZero = KnownZero.trunc(InBits);
1947 KnownOne = KnownOne.trunc(InBits);
1948 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1949 KnownZero = KnownZero.zext(BitWidth);
1950 KnownOne = KnownOne.zext(BitWidth);
1951 KnownZero |= NewBits;
1952 return;
1953 }
1954 case ISD::SIGN_EXTEND: {
1955 EVT InVT = Op.getOperand(0).getValueType();
1956 unsigned InBits = InVT.getScalarType().getSizeInBits();
1957 APInt InSignBit = APInt::getSignBit(InBits);
1958 APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - InBits);
1959
1960 KnownZero = KnownZero.trunc(InBits);
1961 KnownOne = KnownOne.trunc(InBits);
1962 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1963
1964 // Note if the sign bit is known to be zero or one.
1965 bool SignBitKnownZero = KnownZero.isNegative();
1966 bool SignBitKnownOne = KnownOne.isNegative();
1967 assert(!(SignBitKnownZero && SignBitKnownOne) &&
1968 "Sign bit can't be known to be both zero and one!");
1969
1970 KnownZero = KnownZero.zext(BitWidth);
1971 KnownOne = KnownOne.zext(BitWidth);
1972
1973 // If the sign bit is known zero or one, the top bits match.
1974 if (SignBitKnownZero)
1975 KnownZero |= NewBits;
1976 else if (SignBitKnownOne)
1977 KnownOne |= NewBits;
1978 return;
1979 }
1980 case ISD::ANY_EXTEND: {
1981 EVT InVT = Op.getOperand(0).getValueType();
1982 unsigned InBits = InVT.getScalarType().getSizeInBits();
1983 KnownZero = KnownZero.trunc(InBits);
1984 KnownOne = KnownOne.trunc(InBits);
1985 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1986 KnownZero = KnownZero.zext(BitWidth);
1987 KnownOne = KnownOne.zext(BitWidth);
1988 return;
1989 }
1990 case ISD::TRUNCATE: {
1991 EVT InVT = Op.getOperand(0).getValueType();
1992 unsigned InBits = InVT.getScalarType().getSizeInBits();
1993 KnownZero = KnownZero.zext(InBits);
1994 KnownOne = KnownOne.zext(InBits);
1995 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
1996 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
1997 KnownZero = KnownZero.trunc(BitWidth);
1998 KnownOne = KnownOne.trunc(BitWidth);
1999 break;
2000 }
2001 case ISD::AssertZext: {
2002 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
2003 APInt InMask = APInt::getLowBitsSet(BitWidth, VT.getSizeInBits());
2004 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
2005 KnownZero |= (~InMask);
2006 KnownOne &= (~KnownZero);
2007 return;
2008 }
2009 case ISD::FGETSIGN:
2010 // All bits are zero except the low bit.
2011 KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - 1);
2012 return;
2013
2014 case ISD::SUB: {
2015 if (ConstantSDNode *CLHS = dyn_cast<ConstantSDNode>(Op.getOperand(0))) {
2016 // We know that the top bits of C-X are clear if X contains less bits
2017 // than C (i.e. no wrap-around can happen). For example, 20-X is
2018 // positive if we can prove that X is >= 0 and < 16.
2019 if (CLHS->getAPIntValue().isNonNegative()) {
2020 unsigned NLZ = (CLHS->getAPIntValue()+1).countLeadingZeros();
2021 // NLZ can't be BitWidth with no sign bit
2022 APInt MaskV = APInt::getHighBitsSet(BitWidth, NLZ+1);
2023 ComputeMaskedBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
2024
2025 // If all of the MaskV bits are known to be zero, then we know the
2026 // output top bits are zero, because we now know that the output is
2027 // from [0-C].
2028 if ((KnownZero2 & MaskV) == MaskV) {
2029 unsigned NLZ2 = CLHS->getAPIntValue().countLeadingZeros();
2030 // Top bits known zero.
2031 KnownZero = APInt::getHighBitsSet(BitWidth, NLZ2);
2032 }
2033 }
2034 }
2035 }
2036 // fall through
2037 case ISD::ADD:
2038 case ISD::ADDE: {
2039 // Output known-0 bits are known if clear or set in both the low clear bits
2040 // common to both LHS & RHS. For example, 8+(X<<3) is known to have the
2041 // low 3 bits clear.
2042 ComputeMaskedBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
2043 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
2044 unsigned KnownZeroOut = KnownZero2.countTrailingOnes();
2045
2046 ComputeMaskedBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
2047 assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
2048 KnownZeroOut = std::min(KnownZeroOut,
2049 KnownZero2.countTrailingOnes());
2050
2051 if (Op.getOpcode() == ISD::ADD) {
2052 KnownZero |= APInt::getLowBitsSet(BitWidth, KnownZeroOut);
2053 return;
2054 }
2055
2056 // With ADDE, a carry bit may be added in, so we can only use this
2057 // information if we know (at least) that the low two bits are clear. We
2058 // then return to the caller that the low bit is unknown but that other bits
2059 // are known zero.
2060 if (KnownZeroOut >= 2) // ADDE
2061 KnownZero |= APInt::getBitsSet(BitWidth, 1, KnownZeroOut);
2062 return;
2063 }
2064 case ISD::SREM:
2065 if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
2066 const APInt &RA = Rem->getAPIntValue().abs();
2067 if (RA.isPowerOf2()) {
2068 APInt LowBits = RA - 1;
2069 APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
2070 ComputeMaskedBits(Op.getOperand(0), KnownZero2,KnownOne2,Depth+1);
2071
2072 // The low bits of the first operand are unchanged by the srem.
2073 KnownZero = KnownZero2 & LowBits;
2074 KnownOne = KnownOne2 & LowBits;
2075
2076 // If the first operand is non-negative or has all low bits zero, then
2077 // the upper bits are all zero.
2078 if (KnownZero2[BitWidth-1] || ((KnownZero2 & LowBits) == LowBits))
2079 KnownZero |= ~LowBits;
2080
2081 // If the first operand is negative and not all low bits are zero, then
2082 // the upper bits are all one.
2083 if (KnownOne2[BitWidth-1] && ((KnownOne2 & LowBits) != 0))
2084 KnownOne |= ~LowBits;
2085 assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?");
2086 }
2087 }
2088 return;
2089 case ISD::UREM: {
2090 if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
2091 const APInt &RA = Rem->getAPIntValue();
2092 if (RA.isPowerOf2()) {
2093 APInt LowBits = (RA - 1);
2094 KnownZero |= ~LowBits;
2095 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne,Depth+1);
2096 assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?");
2097 break;
2098 }
2099 }
2100
2101 // Since the result is less than or equal to either operand, any leading
2102 // zero bits in either operand must also exist in the result.
2103 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
2104 ComputeMaskedBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
2105
2106 uint32_t Leaders = std::max(KnownZero.countLeadingOnes(),
2107 KnownZero2.countLeadingOnes());
2108 KnownOne.clearAllBits();
2109 KnownZero = APInt::getHighBitsSet(BitWidth, Leaders);
2110 return;
2111 }
2112 case ISD::FrameIndex:
2113 case ISD::TargetFrameIndex:
2114 if (unsigned Align = InferPtrAlignment(Op)) {
2115 // The low bits are known zero if the pointer is aligned.
2116 KnownZero = APInt::getLowBitsSet(BitWidth, Log2_32(Align));
2117 return;
2118 }
2119 break;
2120
2121 default:
2122 if (Op.getOpcode() < ISD::BUILTIN_OP_END)
2123 break;
2124 // Fallthrough
2125 case ISD::INTRINSIC_WO_CHAIN:
2126 case ISD::INTRINSIC_W_CHAIN:
2127 case ISD::INTRINSIC_VOID:
2128 // Allow the target to implement this method for its nodes.
2129 TLI.computeMaskedBitsForTargetNode(Op, KnownZero, KnownOne, *this, Depth);
2130 return;
2131 }
2132 }
2133
2134 /// ComputeNumSignBits - Return the number of times the sign bit of the
2135 /// register is replicated into the other bits. We know that at least 1 bit
2136 /// is always equal to the sign bit (itself), but other cases can give us
2137 /// information. For example, immediately after an "SRA X, 2", we know that
2138 /// the top 3 bits are all equal to each other, so we return 3.
ComputeNumSignBits(SDValue Op,unsigned Depth) const2139 unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, unsigned Depth) const{
2140 EVT VT = Op.getValueType();
2141 assert(VT.isInteger() && "Invalid VT!");
2142 unsigned VTBits = VT.getScalarType().getSizeInBits();
2143 unsigned Tmp, Tmp2;
2144 unsigned FirstAnswer = 1;
2145
2146 if (Depth == 6)
2147 return 1; // Limit search depth.
2148
2149 switch (Op.getOpcode()) {
2150 default: break;
2151 case ISD::AssertSext:
2152 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
2153 return VTBits-Tmp+1;
2154 case ISD::AssertZext:
2155 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
2156 return VTBits-Tmp;
2157
2158 case ISD::Constant: {
2159 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
2160 return Val.getNumSignBits();
2161 }
2162
2163 case ISD::SIGN_EXTEND:
2164 Tmp = VTBits-Op.getOperand(0).getValueType().getScalarType().getSizeInBits();
2165 return ComputeNumSignBits(Op.getOperand(0), Depth+1) + Tmp;
2166
2167 case ISD::SIGN_EXTEND_INREG:
2168 // Max of the input and what this extends.
2169 Tmp =
2170 cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarType().getSizeInBits();
2171 Tmp = VTBits-Tmp+1;
2172
2173 Tmp2 = ComputeNumSignBits(Op.getOperand(0), Depth+1);
2174 return std::max(Tmp, Tmp2);
2175
2176 case ISD::SRA:
2177 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
2178 // SRA X, C -> adds C sign bits.
2179 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
2180 Tmp += C->getZExtValue();
2181 if (Tmp > VTBits) Tmp = VTBits;
2182 }
2183 return Tmp;
2184 case ISD::SHL:
2185 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
2186 // shl destroys sign bits.
2187 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
2188 if (C->getZExtValue() >= VTBits || // Bad shift.
2189 C->getZExtValue() >= Tmp) break; // Shifted all sign bits out.
2190 return Tmp - C->getZExtValue();
2191 }
2192 break;
2193 case ISD::AND:
2194 case ISD::OR:
2195 case ISD::XOR: // NOT is handled here.
2196 // Logical binary ops preserve the number of sign bits at the worst.
2197 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
2198 if (Tmp != 1) {
2199 Tmp2 = ComputeNumSignBits(Op.getOperand(1), Depth+1);
2200 FirstAnswer = std::min(Tmp, Tmp2);
2201 // We computed what we know about the sign bits as our first
2202 // answer. Now proceed to the generic code that uses
2203 // ComputeMaskedBits, and pick whichever answer is better.
2204 }
2205 break;
2206
2207 case ISD::SELECT:
2208 Tmp = ComputeNumSignBits(Op.getOperand(1), Depth+1);
2209 if (Tmp == 1) return 1; // Early out.
2210 Tmp2 = ComputeNumSignBits(Op.getOperand(2), Depth+1);
2211 return std::min(Tmp, Tmp2);
2212
2213 case ISD::SADDO:
2214 case ISD::UADDO:
2215 case ISD::SSUBO:
2216 case ISD::USUBO:
2217 case ISD::SMULO:
2218 case ISD::UMULO:
2219 if (Op.getResNo() != 1)
2220 break;
2221 // The boolean result conforms to getBooleanContents. Fall through.
2222 case ISD::SETCC:
2223 // If setcc returns 0/-1, all bits are sign bits.
2224 if (TLI.getBooleanContents(Op.getValueType().isVector()) ==
2225 TargetLowering::ZeroOrNegativeOneBooleanContent)
2226 return VTBits;
2227 break;
2228 case ISD::ROTL:
2229 case ISD::ROTR:
2230 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
2231 unsigned RotAmt = C->getZExtValue() & (VTBits-1);
2232
2233 // Handle rotate right by N like a rotate left by 32-N.
2234 if (Op.getOpcode() == ISD::ROTR)
2235 RotAmt = (VTBits-RotAmt) & (VTBits-1);
2236
2237 // If we aren't rotating out all of the known-in sign bits, return the
2238 // number that are left. This handles rotl(sext(x), 1) for example.
2239 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
2240 if (Tmp > RotAmt+1) return Tmp-RotAmt;
2241 }
2242 break;
2243 case ISD::ADD:
2244 // Add can have at most one carry bit. Thus we know that the output
2245 // is, at worst, one more bit than the inputs.
2246 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
2247 if (Tmp == 1) return 1; // Early out.
2248
2249 // Special case decrementing a value (ADD X, -1):
2250 if (ConstantSDNode *CRHS = dyn_cast<ConstantSDNode>(Op.getOperand(1)))
2251 if (CRHS->isAllOnesValue()) {
2252 APInt KnownZero, KnownOne;
2253 ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
2254
2255 // If the input is known to be 0 or 1, the output is 0/-1, which is all
2256 // sign bits set.
2257 if ((KnownZero | APInt(VTBits, 1)).isAllOnesValue())
2258 return VTBits;
2259
2260 // If we are subtracting one from a positive number, there is no carry
2261 // out of the result.
2262 if (KnownZero.isNegative())
2263 return Tmp;
2264 }
2265
2266 Tmp2 = ComputeNumSignBits(Op.getOperand(1), Depth+1);
2267 if (Tmp2 == 1) return 1;
2268 return std::min(Tmp, Tmp2)-1;
2269
2270 case ISD::SUB:
2271 Tmp2 = ComputeNumSignBits(Op.getOperand(1), Depth+1);
2272 if (Tmp2 == 1) return 1;
2273
2274 // Handle NEG.
2275 if (ConstantSDNode *CLHS = dyn_cast<ConstantSDNode>(Op.getOperand(0)))
2276 if (CLHS->isNullValue()) {
2277 APInt KnownZero, KnownOne;
2278 ComputeMaskedBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
2279 // If the input is known to be 0 or 1, the output is 0/-1, which is all
2280 // sign bits set.
2281 if ((KnownZero | APInt(VTBits, 1)).isAllOnesValue())
2282 return VTBits;
2283
2284 // If the input is known to be positive (the sign bit is known clear),
2285 // the output of the NEG has the same number of sign bits as the input.
2286 if (KnownZero.isNegative())
2287 return Tmp2;
2288
2289 // Otherwise, we treat this like a SUB.
2290 }
2291
2292 // Sub can have at most one carry bit. Thus we know that the output
2293 // is, at worst, one more bit than the inputs.
2294 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
2295 if (Tmp == 1) return 1; // Early out.
2296 return std::min(Tmp, Tmp2)-1;
2297 case ISD::TRUNCATE:
2298 // FIXME: it's tricky to do anything useful for this, but it is an important
2299 // case for targets like X86.
2300 break;
2301 }
2302
2303 // Handle LOADX separately here. EXTLOAD case will fallthrough.
2304 if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) {
2305 unsigned ExtType = LD->getExtensionType();
2306 switch (ExtType) {
2307 default: break;
2308 case ISD::SEXTLOAD: // '17' bits known
2309 Tmp = LD->getMemoryVT().getScalarType().getSizeInBits();
2310 return VTBits-Tmp+1;
2311 case ISD::ZEXTLOAD: // '16' bits known
2312 Tmp = LD->getMemoryVT().getScalarType().getSizeInBits();
2313 return VTBits-Tmp;
2314 }
2315 }
2316
2317 // Allow the target to implement this method for its nodes.
2318 if (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
2319 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
2320 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
2321 Op.getOpcode() == ISD::INTRINSIC_VOID) {
2322 unsigned NumBits = TLI.ComputeNumSignBitsForTargetNode(Op, Depth);
2323 if (NumBits > 1) FirstAnswer = std::max(FirstAnswer, NumBits);
2324 }
2325
2326 // Finally, if we can prove that the top bits of the result are 0's or 1's,
2327 // use this information.
2328 APInt KnownZero, KnownOne;
2329 ComputeMaskedBits(Op, KnownZero, KnownOne, Depth);
2330
2331 APInt Mask;
2332 if (KnownZero.isNegative()) { // sign bit is 0
2333 Mask = KnownZero;
2334 } else if (KnownOne.isNegative()) { // sign bit is 1;
2335 Mask = KnownOne;
2336 } else {
2337 // Nothing known.
2338 return FirstAnswer;
2339 }
2340
2341 // Okay, we know that the sign bit in Mask is set. Use CLZ to determine
2342 // the number of identical bits in the top of the input value.
2343 Mask = ~Mask;
2344 Mask <<= Mask.getBitWidth()-VTBits;
2345 // Return # leading zeros. We use 'min' here in case Val was zero before
2346 // shifting. We don't want to return '64' as for an i32 "0".
2347 return std::max(FirstAnswer, std::min(VTBits, Mask.countLeadingZeros()));
2348 }
2349
2350 /// isBaseWithConstantOffset - Return true if the specified operand is an
2351 /// ISD::ADD with a ConstantSDNode on the right-hand side, or if it is an
2352 /// ISD::OR with a ConstantSDNode that is guaranteed to have the same
2353 /// semantics as an ADD. This handles the equivalence:
2354 /// X|Cst == X+Cst iff X&Cst = 0.
isBaseWithConstantOffset(SDValue Op) const2355 bool SelectionDAG::isBaseWithConstantOffset(SDValue Op) const {
2356 if ((Op.getOpcode() != ISD::ADD && Op.getOpcode() != ISD::OR) ||
2357 !isa<ConstantSDNode>(Op.getOperand(1)))
2358 return false;
2359
2360 if (Op.getOpcode() == ISD::OR &&
2361 !MaskedValueIsZero(Op.getOperand(0),
2362 cast<ConstantSDNode>(Op.getOperand(1))->getAPIntValue()))
2363 return false;
2364
2365 return true;
2366 }
2367
2368
isKnownNeverNaN(SDValue Op) const2369 bool SelectionDAG::isKnownNeverNaN(SDValue Op) const {
2370 // If we're told that NaNs won't happen, assume they won't.
2371 if (getTarget().Options.NoNaNsFPMath)
2372 return true;
2373
2374 // If the value is a constant, we can obviously see if it is a NaN or not.
2375 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op))
2376 return !C->getValueAPF().isNaN();
2377
2378 // TODO: Recognize more cases here.
2379
2380 return false;
2381 }
2382
isKnownNeverZero(SDValue Op) const2383 bool SelectionDAG::isKnownNeverZero(SDValue Op) const {
2384 // If the value is a constant, we can obviously see if it is a zero or not.
2385 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op))
2386 return !C->isZero();
2387
2388 // TODO: Recognize more cases here.
2389 switch (Op.getOpcode()) {
2390 default: break;
2391 case ISD::OR:
2392 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1)))
2393 return !C->isNullValue();
2394 break;
2395 }
2396
2397 return false;
2398 }
2399
isEqualTo(SDValue A,SDValue B) const2400 bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const {
2401 // Check the obvious case.
2402 if (A == B) return true;
2403
2404 // For for negative and positive zero.
2405 if (const ConstantFPSDNode *CA = dyn_cast<ConstantFPSDNode>(A))
2406 if (const ConstantFPSDNode *CB = dyn_cast<ConstantFPSDNode>(B))
2407 if (CA->isZero() && CB->isZero()) return true;
2408
2409 // Otherwise they may not be equal.
2410 return false;
2411 }
2412
2413 /// getNode - Gets or creates the specified node.
2414 ///
getNode(unsigned Opcode,DebugLoc DL,EVT VT)2415 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT) {
2416 FoldingSetNodeID ID;
2417 AddNodeIDNode(ID, Opcode, getVTList(VT), 0, 0);
2418 void *IP = 0;
2419 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
2420 return SDValue(E, 0);
2421
2422 SDNode *N = new (NodeAllocator) SDNode(Opcode, DL, getVTList(VT));
2423 CSEMap.InsertNode(N, IP);
2424
2425 AllNodes.push_back(N);
2426 #ifndef NDEBUG
2427 VerifySDNode(N);
2428 #endif
2429 return SDValue(N, 0);
2430 }
2431
getNode(unsigned Opcode,DebugLoc DL,EVT VT,SDValue Operand)2432 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
2433 EVT VT, SDValue Operand) {
2434 // Constant fold unary operations with an integer constant operand.
2435 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Operand.getNode())) {
2436 const APInt &Val = C->getAPIntValue();
2437 switch (Opcode) {
2438 default: break;
2439 case ISD::SIGN_EXTEND:
2440 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), VT);
2441 case ISD::ANY_EXTEND:
2442 case ISD::ZERO_EXTEND:
2443 case ISD::TRUNCATE:
2444 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), VT);
2445 case ISD::UINT_TO_FP:
2446 case ISD::SINT_TO_FP: {
2447 // No compile time operations on ppcf128.
2448 if (VT == MVT::ppcf128) break;
2449 APFloat apf(APInt::getNullValue(VT.getSizeInBits()));
2450 (void)apf.convertFromAPInt(Val,
2451 Opcode==ISD::SINT_TO_FP,
2452 APFloat::rmNearestTiesToEven);
2453 return getConstantFP(apf, VT);
2454 }
2455 case ISD::BITCAST:
2456 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
2457 return getConstantFP(Val.bitsToFloat(), VT);
2458 else if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
2459 return getConstantFP(Val.bitsToDouble(), VT);
2460 break;
2461 case ISD::BSWAP:
2462 return getConstant(Val.byteSwap(), VT);
2463 case ISD::CTPOP:
2464 return getConstant(Val.countPopulation(), VT);
2465 case ISD::CTLZ:
2466 case ISD::CTLZ_ZERO_UNDEF:
2467 return getConstant(Val.countLeadingZeros(), VT);
2468 case ISD::CTTZ:
2469 case ISD::CTTZ_ZERO_UNDEF:
2470 return getConstant(Val.countTrailingZeros(), VT);
2471 }
2472 }
2473
2474 // Constant fold unary operations with a floating point constant operand.
2475 if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Operand.getNode())) {
2476 APFloat V = C->getValueAPF(); // make copy
2477 if (VT != MVT::ppcf128 && Operand.getValueType() != MVT::ppcf128) {
2478 switch (Opcode) {
2479 case ISD::FNEG:
2480 V.changeSign();
2481 return getConstantFP(V, VT);
2482 case ISD::FABS:
2483 V.clearSign();
2484 return getConstantFP(V, VT);
2485 case ISD::FCEIL: {
2486 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
2487 if (fs == APFloat::opOK || fs == APFloat::opInexact)
2488 return getConstantFP(V, VT);
2489 break;
2490 }
2491 case ISD::FTRUNC: {
2492 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
2493 if (fs == APFloat::opOK || fs == APFloat::opInexact)
2494 return getConstantFP(V, VT);
2495 break;
2496 }
2497 case ISD::FFLOOR: {
2498 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
2499 if (fs == APFloat::opOK || fs == APFloat::opInexact)
2500 return getConstantFP(V, VT);
2501 break;
2502 }
2503 case ISD::FP_EXTEND: {
2504 bool ignored;
2505 // This can return overflow, underflow, or inexact; we don't care.
2506 // FIXME need to be more flexible about rounding mode.
2507 (void)V.convert(*EVTToAPFloatSemantics(VT),
2508 APFloat::rmNearestTiesToEven, &ignored);
2509 return getConstantFP(V, VT);
2510 }
2511 case ISD::FP_TO_SINT:
2512 case ISD::FP_TO_UINT: {
2513 integerPart x[2];
2514 bool ignored;
2515 assert(integerPartWidth >= 64);
2516 // FIXME need to be more flexible about rounding mode.
2517 APFloat::opStatus s = V.convertToInteger(x, VT.getSizeInBits(),
2518 Opcode==ISD::FP_TO_SINT,
2519 APFloat::rmTowardZero, &ignored);
2520 if (s==APFloat::opInvalidOp) // inexact is OK, in fact usual
2521 break;
2522 APInt api(VT.getSizeInBits(), x);
2523 return getConstant(api, VT);
2524 }
2525 case ISD::BITCAST:
2526 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
2527 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), VT);
2528 else if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
2529 return getConstant(V.bitcastToAPInt().getZExtValue(), VT);
2530 break;
2531 }
2532 }
2533 }
2534
2535 unsigned OpOpcode = Operand.getNode()->getOpcode();
2536 switch (Opcode) {
2537 case ISD::TokenFactor:
2538 case ISD::MERGE_VALUES:
2539 case ISD::CONCAT_VECTORS:
2540 return Operand; // Factor, merge or concat of one node? No need.
2541 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
2542 case ISD::FP_EXTEND:
2543 assert(VT.isFloatingPoint() &&
2544 Operand.getValueType().isFloatingPoint() && "Invalid FP cast!");
2545 if (Operand.getValueType() == VT) return Operand; // noop conversion.
2546 assert((!VT.isVector() ||
2547 VT.getVectorNumElements() ==
2548 Operand.getValueType().getVectorNumElements()) &&
2549 "Vector element count mismatch!");
2550 if (Operand.getOpcode() == ISD::UNDEF)
2551 return getUNDEF(VT);
2552 break;
2553 case ISD::SIGN_EXTEND:
2554 assert(VT.isInteger() && Operand.getValueType().isInteger() &&
2555 "Invalid SIGN_EXTEND!");
2556 if (Operand.getValueType() == VT) return Operand; // noop extension
2557 assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) &&
2558 "Invalid sext node, dst < src!");
2559 assert((!VT.isVector() ||
2560 VT.getVectorNumElements() ==
2561 Operand.getValueType().getVectorNumElements()) &&
2562 "Vector element count mismatch!");
2563 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND)
2564 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0));
2565 else if (OpOpcode == ISD::UNDEF)
2566 // sext(undef) = 0, because the top bits will all be the same.
2567 return getConstant(0, VT);
2568 break;
2569 case ISD::ZERO_EXTEND:
2570 assert(VT.isInteger() && Operand.getValueType().isInteger() &&
2571 "Invalid ZERO_EXTEND!");
2572 if (Operand.getValueType() == VT) return Operand; // noop extension
2573 assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) &&
2574 "Invalid zext node, dst < src!");
2575 assert((!VT.isVector() ||
2576 VT.getVectorNumElements() ==
2577 Operand.getValueType().getVectorNumElements()) &&
2578 "Vector element count mismatch!");
2579 if (OpOpcode == ISD::ZERO_EXTEND) // (zext (zext x)) -> (zext x)
2580 return getNode(ISD::ZERO_EXTEND, DL, VT,
2581 Operand.getNode()->getOperand(0));
2582 else if (OpOpcode == ISD::UNDEF)
2583 // zext(undef) = 0, because the top bits will be zero.
2584 return getConstant(0, VT);
2585 break;
2586 case ISD::ANY_EXTEND:
2587 assert(VT.isInteger() && Operand.getValueType().isInteger() &&
2588 "Invalid ANY_EXTEND!");
2589 if (Operand.getValueType() == VT) return Operand; // noop extension
2590 assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) &&
2591 "Invalid anyext node, dst < src!");
2592 assert((!VT.isVector() ||
2593 VT.getVectorNumElements() ==
2594 Operand.getValueType().getVectorNumElements()) &&
2595 "Vector element count mismatch!");
2596
2597 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
2598 OpOpcode == ISD::ANY_EXTEND)
2599 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
2600 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0));
2601 else if (OpOpcode == ISD::UNDEF)
2602 return getUNDEF(VT);
2603
2604 // (ext (trunx x)) -> x
2605 if (OpOpcode == ISD::TRUNCATE) {
2606 SDValue OpOp = Operand.getNode()->getOperand(0);
2607 if (OpOp.getValueType() == VT)
2608 return OpOp;
2609 }
2610 break;
2611 case ISD::TRUNCATE:
2612 assert(VT.isInteger() && Operand.getValueType().isInteger() &&
2613 "Invalid TRUNCATE!");
2614 if (Operand.getValueType() == VT) return Operand; // noop truncate
2615 assert(Operand.getValueType().getScalarType().bitsGT(VT.getScalarType()) &&
2616 "Invalid truncate node, src < dst!");
2617 assert((!VT.isVector() ||
2618 VT.getVectorNumElements() ==
2619 Operand.getValueType().getVectorNumElements()) &&
2620 "Vector element count mismatch!");
2621 if (OpOpcode == ISD::TRUNCATE)
2622 return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0));
2623 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
2624 OpOpcode == ISD::ANY_EXTEND) {
2625 // If the source is smaller than the dest, we still need an extend.
2626 if (Operand.getNode()->getOperand(0).getValueType().getScalarType()
2627 .bitsLT(VT.getScalarType()))
2628 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0));
2629 if (Operand.getNode()->getOperand(0).getValueType().bitsGT(VT))
2630 return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0));
2631 return Operand.getNode()->getOperand(0);
2632 }
2633 if (OpOpcode == ISD::UNDEF)
2634 return getUNDEF(VT);
2635 break;
2636 case ISD::BITCAST:
2637 // Basic sanity checking.
2638 assert(VT.getSizeInBits() == Operand.getValueType().getSizeInBits()
2639 && "Cannot BITCAST between types of different sizes!");
2640 if (VT == Operand.getValueType()) return Operand; // noop conversion.
2641 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
2642 return getNode(ISD::BITCAST, DL, VT, Operand.getOperand(0));
2643 if (OpOpcode == ISD::UNDEF)
2644 return getUNDEF(VT);
2645 break;
2646 case ISD::SCALAR_TO_VECTOR:
2647 assert(VT.isVector() && !Operand.getValueType().isVector() &&
2648 (VT.getVectorElementType() == Operand.getValueType() ||
2649 (VT.getVectorElementType().isInteger() &&
2650 Operand.getValueType().isInteger() &&
2651 VT.getVectorElementType().bitsLE(Operand.getValueType()))) &&
2652 "Illegal SCALAR_TO_VECTOR node!");
2653 if (OpOpcode == ISD::UNDEF)
2654 return getUNDEF(VT);
2655 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
2656 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
2657 isa<ConstantSDNode>(Operand.getOperand(1)) &&
2658 Operand.getConstantOperandVal(1) == 0 &&
2659 Operand.getOperand(0).getValueType() == VT)
2660 return Operand.getOperand(0);
2661 break;
2662 case ISD::FNEG:
2663 // -(X-Y) -> (Y-X) is unsafe because when X==Y, -0.0 != +0.0
2664 if (getTarget().Options.UnsafeFPMath && OpOpcode == ISD::FSUB)
2665 return getNode(ISD::FSUB, DL, VT, Operand.getNode()->getOperand(1),
2666 Operand.getNode()->getOperand(0));
2667 if (OpOpcode == ISD::FNEG) // --X -> X
2668 return Operand.getNode()->getOperand(0);
2669 break;
2670 case ISD::FABS:
2671 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
2672 return getNode(ISD::FABS, DL, VT, Operand.getNode()->getOperand(0));
2673 break;
2674 }
2675
2676 SDNode *N;
2677 SDVTList VTs = getVTList(VT);
2678 if (VT != MVT::Glue) { // Don't CSE flag producing nodes
2679 FoldingSetNodeID ID;
2680 SDValue Ops[1] = { Operand };
2681 AddNodeIDNode(ID, Opcode, VTs, Ops, 1);
2682 void *IP = 0;
2683 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
2684 return SDValue(E, 0);
2685
2686 N = new (NodeAllocator) UnarySDNode(Opcode, DL, VTs, Operand);
2687 CSEMap.InsertNode(N, IP);
2688 } else {
2689 N = new (NodeAllocator) UnarySDNode(Opcode, DL, VTs, Operand);
2690 }
2691
2692 AllNodes.push_back(N);
2693 #ifndef NDEBUG
2694 VerifySDNode(N);
2695 #endif
2696 return SDValue(N, 0);
2697 }
2698
FoldConstantArithmetic(unsigned Opcode,EVT VT,ConstantSDNode * Cst1,ConstantSDNode * Cst2)2699 SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode,
2700 EVT VT,
2701 ConstantSDNode *Cst1,
2702 ConstantSDNode *Cst2) {
2703 const APInt &C1 = Cst1->getAPIntValue(), &C2 = Cst2->getAPIntValue();
2704
2705 switch (Opcode) {
2706 case ISD::ADD: return getConstant(C1 + C2, VT);
2707 case ISD::SUB: return getConstant(C1 - C2, VT);
2708 case ISD::MUL: return getConstant(C1 * C2, VT);
2709 case ISD::UDIV:
2710 if (C2.getBoolValue()) return getConstant(C1.udiv(C2), VT);
2711 break;
2712 case ISD::UREM:
2713 if (C2.getBoolValue()) return getConstant(C1.urem(C2), VT);
2714 break;
2715 case ISD::SDIV:
2716 if (C2.getBoolValue()) return getConstant(C1.sdiv(C2), VT);
2717 break;
2718 case ISD::SREM:
2719 if (C2.getBoolValue()) return getConstant(C1.srem(C2), VT);
2720 break;
2721 case ISD::AND: return getConstant(C1 & C2, VT);
2722 case ISD::OR: return getConstant(C1 | C2, VT);
2723 case ISD::XOR: return getConstant(C1 ^ C2, VT);
2724 case ISD::SHL: return getConstant(C1 << C2, VT);
2725 case ISD::SRL: return getConstant(C1.lshr(C2), VT);
2726 case ISD::SRA: return getConstant(C1.ashr(C2), VT);
2727 case ISD::ROTL: return getConstant(C1.rotl(C2), VT);
2728 case ISD::ROTR: return getConstant(C1.rotr(C2), VT);
2729 default: break;
2730 }
2731
2732 return SDValue();
2733 }
2734
getNode(unsigned Opcode,DebugLoc DL,EVT VT,SDValue N1,SDValue N2)2735 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
2736 SDValue N1, SDValue N2) {
2737 ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode());
2738 ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.getNode());
2739 switch (Opcode) {
2740 default: break;
2741 case ISD::TokenFactor:
2742 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
2743 N2.getValueType() == MVT::Other && "Invalid token factor!");
2744 // Fold trivial token factors.
2745 if (N1.getOpcode() == ISD::EntryToken) return N2;
2746 if (N2.getOpcode() == ISD::EntryToken) return N1;
2747 if (N1 == N2) return N1;
2748 break;
2749 case ISD::CONCAT_VECTORS:
2750 // Concat of UNDEFs is UNDEF.
2751 if (N1.getOpcode() == ISD::UNDEF &&
2752 N2.getOpcode() == ISD::UNDEF)
2753 return getUNDEF(VT);
2754
2755 // A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to
2756 // one big BUILD_VECTOR.
2757 if (N1.getOpcode() == ISD::BUILD_VECTOR &&
2758 N2.getOpcode() == ISD::BUILD_VECTOR) {
2759 SmallVector<SDValue, 16> Elts(N1.getNode()->op_begin(),
2760 N1.getNode()->op_end());
2761 Elts.append(N2.getNode()->op_begin(), N2.getNode()->op_end());
2762 return getNode(ISD::BUILD_VECTOR, DL, VT, &Elts[0], Elts.size());
2763 }
2764 break;
2765 case ISD::AND:
2766 assert(VT.isInteger() && "This operator does not apply to FP types!");
2767 assert(N1.getValueType() == N2.getValueType() &&
2768 N1.getValueType() == VT && "Binary operator types must match!");
2769 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
2770 // worth handling here.
2771 if (N2C && N2C->isNullValue())
2772 return N2;
2773 if (N2C && N2C->isAllOnesValue()) // X & -1 -> X
2774 return N1;
2775 break;
2776 case ISD::OR:
2777 case ISD::XOR:
2778 case ISD::ADD:
2779 case ISD::SUB:
2780 assert(VT.isInteger() && "This operator does not apply to FP types!");
2781 assert(N1.getValueType() == N2.getValueType() &&
2782 N1.getValueType() == VT && "Binary operator types must match!");
2783 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
2784 // it's worth handling here.
2785 if (N2C && N2C->isNullValue())
2786 return N1;
2787 break;
2788 case ISD::UDIV:
2789 case ISD::UREM:
2790 case ISD::MULHU:
2791 case ISD::MULHS:
2792 case ISD::MUL:
2793 case ISD::SDIV:
2794 case ISD::SREM:
2795 assert(VT.isInteger() && "This operator does not apply to FP types!");
2796 assert(N1.getValueType() == N2.getValueType() &&
2797 N1.getValueType() == VT && "Binary operator types must match!");
2798 break;
2799 case ISD::FADD:
2800 case ISD::FSUB:
2801 case ISD::FMUL:
2802 case ISD::FDIV:
2803 case ISD::FREM:
2804 if (getTarget().Options.UnsafeFPMath) {
2805 if (Opcode == ISD::FADD) {
2806 // 0+x --> x
2807 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1))
2808 if (CFP->getValueAPF().isZero())
2809 return N2;
2810 // x+0 --> x
2811 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N2))
2812 if (CFP->getValueAPF().isZero())
2813 return N1;
2814 } else if (Opcode == ISD::FSUB) {
2815 // x-0 --> x
2816 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N2))
2817 if (CFP->getValueAPF().isZero())
2818 return N1;
2819 } else if (Opcode == ISD::FMUL) {
2820 ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1);
2821 SDValue V = N2;
2822
2823 // If the first operand isn't the constant, try the second
2824 if (!CFP) {
2825 CFP = dyn_cast<ConstantFPSDNode>(N2);
2826 V = N1;
2827 }
2828
2829 if (CFP) {
2830 // 0*x --> 0
2831 if (CFP->isZero())
2832 return SDValue(CFP,0);
2833 // 1*x --> x
2834 if (CFP->isExactlyValue(1.0))
2835 return V;
2836 }
2837 }
2838 }
2839 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
2840 assert(N1.getValueType() == N2.getValueType() &&
2841 N1.getValueType() == VT && "Binary operator types must match!");
2842 break;
2843 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
2844 assert(N1.getValueType() == VT &&
2845 N1.getValueType().isFloatingPoint() &&
2846 N2.getValueType().isFloatingPoint() &&
2847 "Invalid FCOPYSIGN!");
2848 break;
2849 case ISD::SHL:
2850 case ISD::SRA:
2851 case ISD::SRL:
2852 case ISD::ROTL:
2853 case ISD::ROTR:
2854 assert(VT == N1.getValueType() &&
2855 "Shift operators return type must be the same as their first arg");
2856 assert(VT.isInteger() && N2.getValueType().isInteger() &&
2857 "Shifts only work on integers");
2858 // Verify that the shift amount VT is bit enough to hold valid shift
2859 // amounts. This catches things like trying to shift an i1024 value by an
2860 // i8, which is easy to fall into in generic code that uses
2861 // TLI.getShiftAmount().
2862 assert(N2.getValueType().getSizeInBits() >=
2863 Log2_32_Ceil(N1.getValueType().getSizeInBits()) &&
2864 "Invalid use of small shift amount with oversized value!");
2865
2866 // Always fold shifts of i1 values so the code generator doesn't need to
2867 // handle them. Since we know the size of the shift has to be less than the
2868 // size of the value, the shift/rotate count is guaranteed to be zero.
2869 if (VT == MVT::i1)
2870 return N1;
2871 if (N2C && N2C->isNullValue())
2872 return N1;
2873 break;
2874 case ISD::FP_ROUND_INREG: {
2875 EVT EVT = cast<VTSDNode>(N2)->getVT();
2876 assert(VT == N1.getValueType() && "Not an inreg round!");
2877 assert(VT.isFloatingPoint() && EVT.isFloatingPoint() &&
2878 "Cannot FP_ROUND_INREG integer types");
2879 assert(EVT.isVector() == VT.isVector() &&
2880 "FP_ROUND_INREG type should be vector iff the operand "
2881 "type is vector!");
2882 assert((!EVT.isVector() ||
2883 EVT.getVectorNumElements() == VT.getVectorNumElements()) &&
2884 "Vector element counts must match in FP_ROUND_INREG");
2885 assert(EVT.bitsLE(VT) && "Not rounding down!");
2886 (void)EVT;
2887 if (cast<VTSDNode>(N2)->getVT() == VT) return N1; // Not actually rounding.
2888 break;
2889 }
2890 case ISD::FP_ROUND:
2891 assert(VT.isFloatingPoint() &&
2892 N1.getValueType().isFloatingPoint() &&
2893 VT.bitsLE(N1.getValueType()) &&
2894 isa<ConstantSDNode>(N2) && "Invalid FP_ROUND!");
2895 if (N1.getValueType() == VT) return N1; // noop conversion.
2896 break;
2897 case ISD::AssertSext:
2898 case ISD::AssertZext: {
2899 EVT EVT = cast<VTSDNode>(N2)->getVT();
2900 assert(VT == N1.getValueType() && "Not an inreg extend!");
2901 assert(VT.isInteger() && EVT.isInteger() &&
2902 "Cannot *_EXTEND_INREG FP types");
2903 assert(!EVT.isVector() &&
2904 "AssertSExt/AssertZExt type should be the vector element type "
2905 "rather than the vector type!");
2906 assert(EVT.bitsLE(VT) && "Not extending!");
2907 if (VT == EVT) return N1; // noop assertion.
2908 break;
2909 }
2910 case ISD::SIGN_EXTEND_INREG: {
2911 EVT EVT = cast<VTSDNode>(N2)->getVT();
2912 assert(VT == N1.getValueType() && "Not an inreg extend!");
2913 assert(VT.isInteger() && EVT.isInteger() &&
2914 "Cannot *_EXTEND_INREG FP types");
2915 assert(EVT.isVector() == VT.isVector() &&
2916 "SIGN_EXTEND_INREG type should be vector iff the operand "
2917 "type is vector!");
2918 assert((!EVT.isVector() ||
2919 EVT.getVectorNumElements() == VT.getVectorNumElements()) &&
2920 "Vector element counts must match in SIGN_EXTEND_INREG");
2921 assert(EVT.bitsLE(VT) && "Not extending!");
2922 if (EVT == VT) return N1; // Not actually extending
2923
2924 if (N1C) {
2925 APInt Val = N1C->getAPIntValue();
2926 unsigned FromBits = EVT.getScalarType().getSizeInBits();
2927 Val <<= Val.getBitWidth()-FromBits;
2928 Val = Val.ashr(Val.getBitWidth()-FromBits);
2929 return getConstant(Val, VT);
2930 }
2931 break;
2932 }
2933 case ISD::EXTRACT_VECTOR_ELT:
2934 // EXTRACT_VECTOR_ELT of an UNDEF is an UNDEF.
2935 if (N1.getOpcode() == ISD::UNDEF)
2936 return getUNDEF(VT);
2937
2938 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
2939 // expanding copies of large vectors from registers.
2940 if (N2C &&
2941 N1.getOpcode() == ISD::CONCAT_VECTORS &&
2942 N1.getNumOperands() > 0) {
2943 unsigned Factor =
2944 N1.getOperand(0).getValueType().getVectorNumElements();
2945 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT,
2946 N1.getOperand(N2C->getZExtValue() / Factor),
2947 getConstant(N2C->getZExtValue() % Factor,
2948 N2.getValueType()));
2949 }
2950
2951 // EXTRACT_VECTOR_ELT of BUILD_VECTOR is often formed while lowering is
2952 // expanding large vector constants.
2953 if (N2C && N1.getOpcode() == ISD::BUILD_VECTOR) {
2954 SDValue Elt = N1.getOperand(N2C->getZExtValue());
2955
2956 if (VT != Elt.getValueType())
2957 // If the vector element type is not legal, the BUILD_VECTOR operands
2958 // are promoted and implicitly truncated, and the result implicitly
2959 // extended. Make that explicit here.
2960 Elt = getAnyExtOrTrunc(Elt, DL, VT);
2961
2962 return Elt;
2963 }
2964
2965 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
2966 // operations are lowered to scalars.
2967 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
2968 // If the indices are the same, return the inserted element else
2969 // if the indices are known different, extract the element from
2970 // the original vector.
2971 SDValue N1Op2 = N1.getOperand(2);
2972 ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2.getNode());
2973
2974 if (N1Op2C && N2C) {
2975 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
2976 if (VT == N1.getOperand(1).getValueType())
2977 return N1.getOperand(1);
2978 else
2979 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
2980 }
2981
2982 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
2983 }
2984 }
2985 break;
2986 case ISD::EXTRACT_ELEMENT:
2987 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
2988 assert(!N1.getValueType().isVector() && !VT.isVector() &&
2989 (N1.getValueType().isInteger() == VT.isInteger()) &&
2990 N1.getValueType() != VT &&
2991 "Wrong types for EXTRACT_ELEMENT!");
2992
2993 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
2994 // 64-bit integers into 32-bit parts. Instead of building the extract of
2995 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
2996 if (N1.getOpcode() == ISD::BUILD_PAIR)
2997 return N1.getOperand(N2C->getZExtValue());
2998
2999 // EXTRACT_ELEMENT of a constant int is also very common.
3000 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N1)) {
3001 unsigned ElementSize = VT.getSizeInBits();
3002 unsigned Shift = ElementSize * N2C->getZExtValue();
3003 APInt ShiftedVal = C->getAPIntValue().lshr(Shift);
3004 return getConstant(ShiftedVal.trunc(ElementSize), VT);
3005 }
3006 break;
3007 case ISD::EXTRACT_SUBVECTOR: {
3008 SDValue Index = N2;
3009 if (VT.isSimple() && N1.getValueType().isSimple()) {
3010 assert(VT.isVector() && N1.getValueType().isVector() &&
3011 "Extract subvector VTs must be a vectors!");
3012 assert(VT.getVectorElementType() == N1.getValueType().getVectorElementType() &&
3013 "Extract subvector VTs must have the same element type!");
3014 assert(VT.getSimpleVT() <= N1.getValueType().getSimpleVT() &&
3015 "Extract subvector must be from larger vector to smaller vector!");
3016
3017 if (isa<ConstantSDNode>(Index.getNode())) {
3018 assert((VT.getVectorNumElements() +
3019 cast<ConstantSDNode>(Index.getNode())->getZExtValue()
3020 <= N1.getValueType().getVectorNumElements())
3021 && "Extract subvector overflow!");
3022 }
3023
3024 // Trivial extraction.
3025 if (VT.getSimpleVT() == N1.getValueType().getSimpleVT())
3026 return N1;
3027 }
3028 break;
3029 }
3030 }
3031
3032 if (N1C) {
3033 if (N2C) {
3034 SDValue SV = FoldConstantArithmetic(Opcode, VT, N1C, N2C);
3035 if (SV.getNode()) return SV;
3036 } else { // Cannonicalize constant to RHS if commutative
3037 if (isCommutativeBinOp(Opcode)) {
3038 std::swap(N1C, N2C);
3039 std::swap(N1, N2);
3040 }
3041 }
3042 }
3043
3044 // Constant fold FP operations.
3045 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1.getNode());
3046 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2.getNode());
3047 if (N1CFP) {
3048 if (!N2CFP && isCommutativeBinOp(Opcode)) {
3049 // Cannonicalize constant to RHS if commutative
3050 std::swap(N1CFP, N2CFP);
3051 std::swap(N1, N2);
3052 } else if (N2CFP && VT != MVT::ppcf128) {
3053 APFloat V1 = N1CFP->getValueAPF(), V2 = N2CFP->getValueAPF();
3054 APFloat::opStatus s;
3055 switch (Opcode) {
3056 case ISD::FADD:
3057 s = V1.add(V2, APFloat::rmNearestTiesToEven);
3058 if (s != APFloat::opInvalidOp)
3059 return getConstantFP(V1, VT);
3060 break;
3061 case ISD::FSUB:
3062 s = V1.subtract(V2, APFloat::rmNearestTiesToEven);
3063 if (s!=APFloat::opInvalidOp)
3064 return getConstantFP(V1, VT);
3065 break;
3066 case ISD::FMUL:
3067 s = V1.multiply(V2, APFloat::rmNearestTiesToEven);
3068 if (s!=APFloat::opInvalidOp)
3069 return getConstantFP(V1, VT);
3070 break;
3071 case ISD::FDIV:
3072 s = V1.divide(V2, APFloat::rmNearestTiesToEven);
3073 if (s!=APFloat::opInvalidOp && s!=APFloat::opDivByZero)
3074 return getConstantFP(V1, VT);
3075 break;
3076 case ISD::FREM :
3077 s = V1.mod(V2, APFloat::rmNearestTiesToEven);
3078 if (s!=APFloat::opInvalidOp && s!=APFloat::opDivByZero)
3079 return getConstantFP(V1, VT);
3080 break;
3081 case ISD::FCOPYSIGN:
3082 V1.copySign(V2);
3083 return getConstantFP(V1, VT);
3084 default: break;
3085 }
3086 }
3087
3088 if (Opcode == ISD::FP_ROUND) {
3089 APFloat V = N1CFP->getValueAPF(); // make copy
3090 bool ignored;
3091 // This can return overflow, underflow, or inexact; we don't care.
3092 // FIXME need to be more flexible about rounding mode.
3093 (void)V.convert(*EVTToAPFloatSemantics(VT),
3094 APFloat::rmNearestTiesToEven, &ignored);
3095 return getConstantFP(V, VT);
3096 }
3097 }
3098
3099 // Canonicalize an UNDEF to the RHS, even over a constant.
3100 if (N1.getOpcode() == ISD::UNDEF) {
3101 if (isCommutativeBinOp(Opcode)) {
3102 std::swap(N1, N2);
3103 } else {
3104 switch (Opcode) {
3105 case ISD::FP_ROUND_INREG:
3106 case ISD::SIGN_EXTEND_INREG:
3107 case ISD::SUB:
3108 case ISD::FSUB:
3109 case ISD::FDIV:
3110 case ISD::FREM:
3111 case ISD::SRA:
3112 return N1; // fold op(undef, arg2) -> undef
3113 case ISD::UDIV:
3114 case ISD::SDIV:
3115 case ISD::UREM:
3116 case ISD::SREM:
3117 case ISD::SRL:
3118 case ISD::SHL:
3119 if (!VT.isVector())
3120 return getConstant(0, VT); // fold op(undef, arg2) -> 0
3121 // For vectors, we can't easily build an all zero vector, just return
3122 // the LHS.
3123 return N2;
3124 }
3125 }
3126 }
3127
3128 // Fold a bunch of operators when the RHS is undef.
3129 if (N2.getOpcode() == ISD::UNDEF) {
3130 switch (Opcode) {
3131 case ISD::XOR:
3132 if (N1.getOpcode() == ISD::UNDEF)
3133 // Handle undef ^ undef -> 0 special case. This is a common
3134 // idiom (misuse).
3135 return getConstant(0, VT);
3136 // fallthrough
3137 case ISD::ADD:
3138 case ISD::ADDC:
3139 case ISD::ADDE:
3140 case ISD::SUB:
3141 case ISD::UDIV:
3142 case ISD::SDIV:
3143 case ISD::UREM:
3144 case ISD::SREM:
3145 return N2; // fold op(arg1, undef) -> undef
3146 case ISD::FADD:
3147 case ISD::FSUB:
3148 case ISD::FMUL:
3149 case ISD::FDIV:
3150 case ISD::FREM:
3151 if (getTarget().Options.UnsafeFPMath)
3152 return N2;
3153 break;
3154 case ISD::MUL:
3155 case ISD::AND:
3156 case ISD::SRL:
3157 case ISD::SHL:
3158 if (!VT.isVector())
3159 return getConstant(0, VT); // fold op(arg1, undef) -> 0
3160 // For vectors, we can't easily build an all zero vector, just return
3161 // the LHS.
3162 return N1;
3163 case ISD::OR:
3164 if (!VT.isVector())
3165 return getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), VT);
3166 // For vectors, we can't easily build an all one vector, just return
3167 // the LHS.
3168 return N1;
3169 case ISD::SRA:
3170 return N1;
3171 }
3172 }
3173
3174 // Memoize this node if possible.
3175 SDNode *N;
3176 SDVTList VTs = getVTList(VT);
3177 if (VT != MVT::Glue) {
3178 SDValue Ops[] = { N1, N2 };
3179 FoldingSetNodeID ID;
3180 AddNodeIDNode(ID, Opcode, VTs, Ops, 2);
3181 void *IP = 0;
3182 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
3183 return SDValue(E, 0);
3184
3185 N = new (NodeAllocator) BinarySDNode(Opcode, DL, VTs, N1, N2);
3186 CSEMap.InsertNode(N, IP);
3187 } else {
3188 N = new (NodeAllocator) BinarySDNode(Opcode, DL, VTs, N1, N2);
3189 }
3190
3191 AllNodes.push_back(N);
3192 #ifndef NDEBUG
3193 VerifySDNode(N);
3194 #endif
3195 return SDValue(N, 0);
3196 }
3197
getNode(unsigned Opcode,DebugLoc DL,EVT VT,SDValue N1,SDValue N2,SDValue N3)3198 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
3199 SDValue N1, SDValue N2, SDValue N3) {
3200 // Perform various simplifications.
3201 ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode());
3202 switch (Opcode) {
3203 case ISD::CONCAT_VECTORS:
3204 // A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to
3205 // one big BUILD_VECTOR.
3206 if (N1.getOpcode() == ISD::BUILD_VECTOR &&
3207 N2.getOpcode() == ISD::BUILD_VECTOR &&
3208 N3.getOpcode() == ISD::BUILD_VECTOR) {
3209 SmallVector<SDValue, 16> Elts(N1.getNode()->op_begin(),
3210 N1.getNode()->op_end());
3211 Elts.append(N2.getNode()->op_begin(), N2.getNode()->op_end());
3212 Elts.append(N3.getNode()->op_begin(), N3.getNode()->op_end());
3213 return getNode(ISD::BUILD_VECTOR, DL, VT, &Elts[0], Elts.size());
3214 }
3215 break;
3216 case ISD::SETCC: {
3217 // Use FoldSetCC to simplify SETCC's.
3218 SDValue Simp = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL);
3219 if (Simp.getNode()) return Simp;
3220 break;
3221 }
3222 case ISD::SELECT:
3223 if (N1C) {
3224 if (N1C->getZExtValue())
3225 return N2; // select true, X, Y -> X
3226 return N3; // select false, X, Y -> Y
3227 }
3228
3229 if (N2 == N3) return N2; // select C, X, X -> X
3230 break;
3231 case ISD::VECTOR_SHUFFLE:
3232 llvm_unreachable("should use getVectorShuffle constructor!");
3233 case ISD::INSERT_SUBVECTOR: {
3234 SDValue Index = N3;
3235 if (VT.isSimple() && N1.getValueType().isSimple()
3236 && N2.getValueType().isSimple()) {
3237 assert(VT.isVector() && N1.getValueType().isVector() &&
3238 N2.getValueType().isVector() &&
3239 "Insert subvector VTs must be a vectors");
3240 assert(VT == N1.getValueType() &&
3241 "Dest and insert subvector source types must match!");
3242 assert(N2.getValueType().getSimpleVT() <= N1.getValueType().getSimpleVT() &&
3243 "Insert subvector must be from smaller vector to larger vector!");
3244 if (isa<ConstantSDNode>(Index.getNode())) {
3245 assert((N2.getValueType().getVectorNumElements() +
3246 cast<ConstantSDNode>(Index.getNode())->getZExtValue()
3247 <= VT.getVectorNumElements())
3248 && "Insert subvector overflow!");
3249 }
3250
3251 // Trivial insertion.
3252 if (VT.getSimpleVT() == N2.getValueType().getSimpleVT())
3253 return N2;
3254 }
3255 break;
3256 }
3257 case ISD::BITCAST:
3258 // Fold bit_convert nodes from a type to themselves.
3259 if (N1.getValueType() == VT)
3260 return N1;
3261 break;
3262 }
3263
3264 // Memoize node if it doesn't produce a flag.
3265 SDNode *N;
3266 SDVTList VTs = getVTList(VT);
3267 if (VT != MVT::Glue) {
3268 SDValue Ops[] = { N1, N2, N3 };
3269 FoldingSetNodeID ID;
3270 AddNodeIDNode(ID, Opcode, VTs, Ops, 3);
3271 void *IP = 0;
3272 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
3273 return SDValue(E, 0);
3274
3275 N = new (NodeAllocator) TernarySDNode(Opcode, DL, VTs, N1, N2, N3);
3276 CSEMap.InsertNode(N, IP);
3277 } else {
3278 N = new (NodeAllocator) TernarySDNode(Opcode, DL, VTs, N1, N2, N3);
3279 }
3280
3281 AllNodes.push_back(N);
3282 #ifndef NDEBUG
3283 VerifySDNode(N);
3284 #endif
3285 return SDValue(N, 0);
3286 }
3287
getNode(unsigned Opcode,DebugLoc DL,EVT VT,SDValue N1,SDValue N2,SDValue N3,SDValue N4)3288 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
3289 SDValue N1, SDValue N2, SDValue N3,
3290 SDValue N4) {
3291 SDValue Ops[] = { N1, N2, N3, N4 };
3292 return getNode(Opcode, DL, VT, Ops, 4);
3293 }
3294
getNode(unsigned Opcode,DebugLoc DL,EVT VT,SDValue N1,SDValue N2,SDValue N3,SDValue N4,SDValue N5)3295 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
3296 SDValue N1, SDValue N2, SDValue N3,
3297 SDValue N4, SDValue N5) {
3298 SDValue Ops[] = { N1, N2, N3, N4, N5 };
3299 return getNode(Opcode, DL, VT, Ops, 5);
3300 }
3301
3302 /// getStackArgumentTokenFactor - Compute a TokenFactor to force all
3303 /// the incoming stack arguments to be loaded from the stack.
getStackArgumentTokenFactor(SDValue Chain)3304 SDValue SelectionDAG::getStackArgumentTokenFactor(SDValue Chain) {
3305 SmallVector<SDValue, 8> ArgChains;
3306
3307 // Include the original chain at the beginning of the list. When this is
3308 // used by target LowerCall hooks, this helps legalize find the
3309 // CALLSEQ_BEGIN node.
3310 ArgChains.push_back(Chain);
3311
3312 // Add a chain value for each stack argument.
3313 for (SDNode::use_iterator U = getEntryNode().getNode()->use_begin(),
3314 UE = getEntryNode().getNode()->use_end(); U != UE; ++U)
3315 if (LoadSDNode *L = dyn_cast<LoadSDNode>(*U))
3316 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
3317 if (FI->getIndex() < 0)
3318 ArgChains.push_back(SDValue(L, 1));
3319
3320 // Build a tokenfactor for all the chains.
3321 return getNode(ISD::TokenFactor, Chain.getDebugLoc(), MVT::Other,
3322 &ArgChains[0], ArgChains.size());
3323 }
3324
3325 /// SplatByte - Distribute ByteVal over NumBits bits.
SplatByte(unsigned NumBits,uint8_t ByteVal)3326 static APInt SplatByte(unsigned NumBits, uint8_t ByteVal) {
3327 APInt Val = APInt(NumBits, ByteVal);
3328 unsigned Shift = 8;
3329 for (unsigned i = NumBits; i > 8; i >>= 1) {
3330 Val = (Val << Shift) | Val;
3331 Shift <<= 1;
3332 }
3333 return Val;
3334 }
3335
3336 /// getMemsetValue - Vectorized representation of the memset value
3337 /// operand.
getMemsetValue(SDValue Value,EVT VT,SelectionDAG & DAG,DebugLoc dl)3338 static SDValue getMemsetValue(SDValue Value, EVT VT, SelectionDAG &DAG,
3339 DebugLoc dl) {
3340 assert(Value.getOpcode() != ISD::UNDEF);
3341
3342 unsigned NumBits = VT.getScalarType().getSizeInBits();
3343 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Value)) {
3344 APInt Val = SplatByte(NumBits, C->getZExtValue() & 255);
3345 if (VT.isInteger())
3346 return DAG.getConstant(Val, VT);
3347 return DAG.getConstantFP(APFloat(Val), VT);
3348 }
3349
3350 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Value);
3351 if (NumBits > 8) {
3352 // Use a multiplication with 0x010101... to extend the input to the
3353 // required length.
3354 APInt Magic = SplatByte(NumBits, 0x01);
3355 Value = DAG.getNode(ISD::MUL, dl, VT, Value, DAG.getConstant(Magic, VT));
3356 }
3357
3358 return Value;
3359 }
3360
3361 /// getMemsetStringVal - Similar to getMemsetValue. Except this is only
3362 /// used when a memcpy is turned into a memset when the source is a constant
3363 /// string ptr.
getMemsetStringVal(EVT VT,DebugLoc dl,SelectionDAG & DAG,const TargetLowering & TLI,StringRef Str)3364 static SDValue getMemsetStringVal(EVT VT, DebugLoc dl, SelectionDAG &DAG,
3365 const TargetLowering &TLI, StringRef Str) {
3366 // Handle vector with all elements zero.
3367 if (Str.empty()) {
3368 if (VT.isInteger())
3369 return DAG.getConstant(0, VT);
3370 else if (VT == MVT::f32 || VT == MVT::f64)
3371 return DAG.getConstantFP(0.0, VT);
3372 else if (VT.isVector()) {
3373 unsigned NumElts = VT.getVectorNumElements();
3374 MVT EltVT = (VT.getVectorElementType() == MVT::f32) ? MVT::i32 : MVT::i64;
3375 return DAG.getNode(ISD::BITCAST, dl, VT,
3376 DAG.getConstant(0, EVT::getVectorVT(*DAG.getContext(),
3377 EltVT, NumElts)));
3378 } else
3379 llvm_unreachable("Expected type!");
3380 }
3381
3382 assert(!VT.isVector() && "Can't handle vector type here!");
3383 unsigned NumVTBytes = VT.getSizeInBits() / 8;
3384 unsigned NumBytes = std::min(NumVTBytes, unsigned(Str.size()));
3385
3386 uint64_t Val = 0;
3387 if (TLI.isLittleEndian()) {
3388 for (unsigned i = 0; i != NumBytes; ++i)
3389 Val |= (uint64_t)(unsigned char)Str[i] << i*8;
3390 } else {
3391 for (unsigned i = 0; i != NumBytes; ++i)
3392 Val |= (uint64_t)(unsigned char)Str[i] << (NumVTBytes-i-1)*8;
3393 }
3394
3395 return DAG.getConstant(Val, VT);
3396 }
3397
3398 /// getMemBasePlusOffset - Returns base and offset node for the
3399 ///
getMemBasePlusOffset(SDValue Base,unsigned Offset,SelectionDAG & DAG)3400 static SDValue getMemBasePlusOffset(SDValue Base, unsigned Offset,
3401 SelectionDAG &DAG) {
3402 EVT VT = Base.getValueType();
3403 return DAG.getNode(ISD::ADD, Base.getDebugLoc(),
3404 VT, Base, DAG.getConstant(Offset, VT));
3405 }
3406
3407 /// isMemSrcFromString - Returns true if memcpy source is a string constant.
3408 ///
isMemSrcFromString(SDValue Src,StringRef & Str)3409 static bool isMemSrcFromString(SDValue Src, StringRef &Str) {
3410 unsigned SrcDelta = 0;
3411 GlobalAddressSDNode *G = NULL;
3412 if (Src.getOpcode() == ISD::GlobalAddress)
3413 G = cast<GlobalAddressSDNode>(Src);
3414 else if (Src.getOpcode() == ISD::ADD &&
3415 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
3416 Src.getOperand(1).getOpcode() == ISD::Constant) {
3417 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
3418 SrcDelta = cast<ConstantSDNode>(Src.getOperand(1))->getZExtValue();
3419 }
3420 if (!G)
3421 return false;
3422
3423 return getConstantStringInfo(G->getGlobal(), Str, SrcDelta, false);
3424 }
3425
3426 /// FindOptimalMemOpLowering - Determines the optimial series memory ops
3427 /// to replace the memset / memcpy. Return true if the number of memory ops
3428 /// is below the threshold. It returns the types of the sequence of
3429 /// memory ops to perform memset / memcpy by reference.
FindOptimalMemOpLowering(std::vector<EVT> & MemOps,unsigned Limit,uint64_t Size,unsigned DstAlign,unsigned SrcAlign,bool IsZeroVal,bool MemcpyStrSrc,SelectionDAG & DAG,const TargetLowering & TLI)3430 static bool FindOptimalMemOpLowering(std::vector<EVT> &MemOps,
3431 unsigned Limit, uint64_t Size,
3432 unsigned DstAlign, unsigned SrcAlign,
3433 bool IsZeroVal,
3434 bool MemcpyStrSrc,
3435 SelectionDAG &DAG,
3436 const TargetLowering &TLI) {
3437 assert((SrcAlign == 0 || SrcAlign >= DstAlign) &&
3438 "Expecting memcpy / memset source to meet alignment requirement!");
3439 // If 'SrcAlign' is zero, that means the memory operation does not need to
3440 // load the value, i.e. memset or memcpy from constant string. Otherwise,
3441 // it's the inferred alignment of the source. 'DstAlign', on the other hand,
3442 // is the specified alignment of the memory operation. If it is zero, that
3443 // means it's possible to change the alignment of the destination.
3444 // 'MemcpyStrSrc' indicates whether the memcpy source is constant so it does
3445 // not need to be loaded.
3446 EVT VT = TLI.getOptimalMemOpType(Size, DstAlign, SrcAlign,
3447 IsZeroVal, MemcpyStrSrc,
3448 DAG.getMachineFunction());
3449
3450 if (VT == MVT::Other) {
3451 if (DstAlign >= TLI.getTargetData()->getPointerPrefAlignment() ||
3452 TLI.allowsUnalignedMemoryAccesses(VT)) {
3453 VT = TLI.getPointerTy();
3454 } else {
3455 switch (DstAlign & 7) {
3456 case 0: VT = MVT::i64; break;
3457 case 4: VT = MVT::i32; break;
3458 case 2: VT = MVT::i16; break;
3459 default: VT = MVT::i8; break;
3460 }
3461 }
3462
3463 MVT LVT = MVT::i64;
3464 while (!TLI.isTypeLegal(LVT))
3465 LVT = (MVT::SimpleValueType)(LVT.SimpleTy - 1);
3466 assert(LVT.isInteger());
3467
3468 if (VT.bitsGT(LVT))
3469 VT = LVT;
3470 }
3471
3472 unsigned NumMemOps = 0;
3473 while (Size != 0) {
3474 unsigned VTSize = VT.getSizeInBits() / 8;
3475 while (VTSize > Size) {
3476 // For now, only use non-vector load / store's for the left-over pieces.
3477 if (VT.isVector() || VT.isFloatingPoint()) {
3478 VT = MVT::i64;
3479 while (!TLI.isTypeLegal(VT))
3480 VT = (MVT::SimpleValueType)(VT.getSimpleVT().SimpleTy - 1);
3481 VTSize = VT.getSizeInBits() / 8;
3482 } else {
3483 // This can result in a type that is not legal on the target, e.g.
3484 // 1 or 2 bytes on PPC.
3485 VT = (MVT::SimpleValueType)(VT.getSimpleVT().SimpleTy - 1);
3486 VTSize >>= 1;
3487 }
3488 }
3489
3490 if (++NumMemOps > Limit)
3491 return false;
3492 MemOps.push_back(VT);
3493 Size -= VTSize;
3494 }
3495
3496 return true;
3497 }
3498
getMemcpyLoadsAndStores(SelectionDAG & DAG,DebugLoc dl,SDValue Chain,SDValue Dst,SDValue Src,uint64_t Size,unsigned Align,bool isVol,bool AlwaysInline,MachinePointerInfo DstPtrInfo,MachinePointerInfo SrcPtrInfo)3499 static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, DebugLoc dl,
3500 SDValue Chain, SDValue Dst,
3501 SDValue Src, uint64_t Size,
3502 unsigned Align, bool isVol,
3503 bool AlwaysInline,
3504 MachinePointerInfo DstPtrInfo,
3505 MachinePointerInfo SrcPtrInfo) {
3506 // Turn a memcpy of undef to nop.
3507 if (Src.getOpcode() == ISD::UNDEF)
3508 return Chain;
3509
3510 // Expand memcpy to a series of load and store ops if the size operand falls
3511 // below a certain threshold.
3512 // TODO: In the AlwaysInline case, if the size is big then generate a loop
3513 // rather than maybe a humongous number of loads and stores.
3514 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3515 std::vector<EVT> MemOps;
3516 bool DstAlignCanChange = false;
3517 MachineFunction &MF = DAG.getMachineFunction();
3518 MachineFrameInfo *MFI = MF.getFrameInfo();
3519 bool OptSize = MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize);
3520 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
3521 if (FI && !MFI->isFixedObjectIndex(FI->getIndex()))
3522 DstAlignCanChange = true;
3523 unsigned SrcAlign = DAG.InferPtrAlignment(Src);
3524 if (Align > SrcAlign)
3525 SrcAlign = Align;
3526 StringRef Str;
3527 bool CopyFromStr = isMemSrcFromString(Src, Str);
3528 bool isZeroStr = CopyFromStr && Str.empty();
3529 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
3530
3531 if (!FindOptimalMemOpLowering(MemOps, Limit, Size,
3532 (DstAlignCanChange ? 0 : Align),
3533 (isZeroStr ? 0 : SrcAlign),
3534 true, CopyFromStr, DAG, TLI))
3535 return SDValue();
3536
3537 if (DstAlignCanChange) {
3538 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
3539 unsigned NewAlign = (unsigned) TLI.getTargetData()->getABITypeAlignment(Ty);
3540 if (NewAlign > Align) {
3541 // Give the stack frame object a larger alignment if needed.
3542 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign)
3543 MFI->setObjectAlignment(FI->getIndex(), NewAlign);
3544 Align = NewAlign;
3545 }
3546 }
3547
3548 SmallVector<SDValue, 8> OutChains;
3549 unsigned NumMemOps = MemOps.size();
3550 uint64_t SrcOff = 0, DstOff = 0;
3551 for (unsigned i = 0; i != NumMemOps; ++i) {
3552 EVT VT = MemOps[i];
3553 unsigned VTSize = VT.getSizeInBits() / 8;
3554 SDValue Value, Store;
3555
3556 if (CopyFromStr &&
3557 (isZeroStr || (VT.isInteger() && !VT.isVector()))) {
3558 // It's unlikely a store of a vector immediate can be done in a single
3559 // instruction. It would require a load from a constantpool first.
3560 // We only handle zero vectors here.
3561 // FIXME: Handle other cases where store of vector immediate is done in
3562 // a single instruction.
3563 Value = getMemsetStringVal(VT, dl, DAG, TLI, Str.substr(SrcOff));
3564 Store = DAG.getStore(Chain, dl, Value,
3565 getMemBasePlusOffset(Dst, DstOff, DAG),
3566 DstPtrInfo.getWithOffset(DstOff), isVol,
3567 false, Align);
3568 } else {
3569 // The type might not be legal for the target. This should only happen
3570 // if the type is smaller than a legal type, as on PPC, so the right
3571 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
3572 // to Load/Store if NVT==VT.
3573 // FIXME does the case above also need this?
3574 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
3575 assert(NVT.bitsGE(VT));
3576 Value = DAG.getExtLoad(ISD::EXTLOAD, dl, NVT, Chain,
3577 getMemBasePlusOffset(Src, SrcOff, DAG),
3578 SrcPtrInfo.getWithOffset(SrcOff), VT, isVol, false,
3579 MinAlign(SrcAlign, SrcOff));
3580 Store = DAG.getTruncStore(Chain, dl, Value,
3581 getMemBasePlusOffset(Dst, DstOff, DAG),
3582 DstPtrInfo.getWithOffset(DstOff), VT, isVol,
3583 false, Align);
3584 }
3585 OutChains.push_back(Store);
3586 SrcOff += VTSize;
3587 DstOff += VTSize;
3588 }
3589
3590 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
3591 &OutChains[0], OutChains.size());
3592 }
3593
getMemmoveLoadsAndStores(SelectionDAG & DAG,DebugLoc dl,SDValue Chain,SDValue Dst,SDValue Src,uint64_t Size,unsigned Align,bool isVol,bool AlwaysInline,MachinePointerInfo DstPtrInfo,MachinePointerInfo SrcPtrInfo)3594 static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, DebugLoc dl,
3595 SDValue Chain, SDValue Dst,
3596 SDValue Src, uint64_t Size,
3597 unsigned Align, bool isVol,
3598 bool AlwaysInline,
3599 MachinePointerInfo DstPtrInfo,
3600 MachinePointerInfo SrcPtrInfo) {
3601 // Turn a memmove of undef to nop.
3602 if (Src.getOpcode() == ISD::UNDEF)
3603 return Chain;
3604
3605 // Expand memmove to a series of load and store ops if the size operand falls
3606 // below a certain threshold.
3607 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3608 std::vector<EVT> MemOps;
3609 bool DstAlignCanChange = false;
3610 MachineFunction &MF = DAG.getMachineFunction();
3611 MachineFrameInfo *MFI = MF.getFrameInfo();
3612 bool OptSize = MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize);
3613 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
3614 if (FI && !MFI->isFixedObjectIndex(FI->getIndex()))
3615 DstAlignCanChange = true;
3616 unsigned SrcAlign = DAG.InferPtrAlignment(Src);
3617 if (Align > SrcAlign)
3618 SrcAlign = Align;
3619 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
3620
3621 if (!FindOptimalMemOpLowering(MemOps, Limit, Size,
3622 (DstAlignCanChange ? 0 : Align),
3623 SrcAlign, true, false, DAG, TLI))
3624 return SDValue();
3625
3626 if (DstAlignCanChange) {
3627 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
3628 unsigned NewAlign = (unsigned) TLI.getTargetData()->getABITypeAlignment(Ty);
3629 if (NewAlign > Align) {
3630 // Give the stack frame object a larger alignment if needed.
3631 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign)
3632 MFI->setObjectAlignment(FI->getIndex(), NewAlign);
3633 Align = NewAlign;
3634 }
3635 }
3636
3637 uint64_t SrcOff = 0, DstOff = 0;
3638 SmallVector<SDValue, 8> LoadValues;
3639 SmallVector<SDValue, 8> LoadChains;
3640 SmallVector<SDValue, 8> OutChains;
3641 unsigned NumMemOps = MemOps.size();
3642 for (unsigned i = 0; i < NumMemOps; i++) {
3643 EVT VT = MemOps[i];
3644 unsigned VTSize = VT.getSizeInBits() / 8;
3645 SDValue Value, Store;
3646
3647 Value = DAG.getLoad(VT, dl, Chain,
3648 getMemBasePlusOffset(Src, SrcOff, DAG),
3649 SrcPtrInfo.getWithOffset(SrcOff), isVol,
3650 false, false, SrcAlign);
3651 LoadValues.push_back(Value);
3652 LoadChains.push_back(Value.getValue(1));
3653 SrcOff += VTSize;
3654 }
3655 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
3656 &LoadChains[0], LoadChains.size());
3657 OutChains.clear();
3658 for (unsigned i = 0; i < NumMemOps; i++) {
3659 EVT VT = MemOps[i];
3660 unsigned VTSize = VT.getSizeInBits() / 8;
3661 SDValue Value, Store;
3662
3663 Store = DAG.getStore(Chain, dl, LoadValues[i],
3664 getMemBasePlusOffset(Dst, DstOff, DAG),
3665 DstPtrInfo.getWithOffset(DstOff), isVol, false, Align);
3666 OutChains.push_back(Store);
3667 DstOff += VTSize;
3668 }
3669
3670 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
3671 &OutChains[0], OutChains.size());
3672 }
3673
getMemsetStores(SelectionDAG & DAG,DebugLoc dl,SDValue Chain,SDValue Dst,SDValue Src,uint64_t Size,unsigned Align,bool isVol,MachinePointerInfo DstPtrInfo)3674 static SDValue getMemsetStores(SelectionDAG &DAG, DebugLoc dl,
3675 SDValue Chain, SDValue Dst,
3676 SDValue Src, uint64_t Size,
3677 unsigned Align, bool isVol,
3678 MachinePointerInfo DstPtrInfo) {
3679 // Turn a memset of undef to nop.
3680 if (Src.getOpcode() == ISD::UNDEF)
3681 return Chain;
3682
3683 // Expand memset to a series of load/store ops if the size operand
3684 // falls below a certain threshold.
3685 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
3686 std::vector<EVT> MemOps;
3687 bool DstAlignCanChange = false;
3688 MachineFunction &MF = DAG.getMachineFunction();
3689 MachineFrameInfo *MFI = MF.getFrameInfo();
3690 bool OptSize = MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize);
3691 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
3692 if (FI && !MFI->isFixedObjectIndex(FI->getIndex()))
3693 DstAlignCanChange = true;
3694 bool IsZeroVal =
3695 isa<ConstantSDNode>(Src) && cast<ConstantSDNode>(Src)->isNullValue();
3696 if (!FindOptimalMemOpLowering(MemOps, TLI.getMaxStoresPerMemset(OptSize),
3697 Size, (DstAlignCanChange ? 0 : Align), 0,
3698 IsZeroVal, false, DAG, TLI))
3699 return SDValue();
3700
3701 if (DstAlignCanChange) {
3702 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
3703 unsigned NewAlign = (unsigned) TLI.getTargetData()->getABITypeAlignment(Ty);
3704 if (NewAlign > Align) {
3705 // Give the stack frame object a larger alignment if needed.
3706 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign)
3707 MFI->setObjectAlignment(FI->getIndex(), NewAlign);
3708 Align = NewAlign;
3709 }
3710 }
3711
3712 SmallVector<SDValue, 8> OutChains;
3713 uint64_t DstOff = 0;
3714 unsigned NumMemOps = MemOps.size();
3715
3716 // Find the largest store and generate the bit pattern for it.
3717 EVT LargestVT = MemOps[0];
3718 for (unsigned i = 1; i < NumMemOps; i++)
3719 if (MemOps[i].bitsGT(LargestVT))
3720 LargestVT = MemOps[i];
3721 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
3722
3723 for (unsigned i = 0; i < NumMemOps; i++) {
3724 EVT VT = MemOps[i];
3725
3726 // If this store is smaller than the largest store see whether we can get
3727 // the smaller value for free with a truncate.
3728 SDValue Value = MemSetValue;
3729 if (VT.bitsLT(LargestVT)) {
3730 if (!LargestVT.isVector() && !VT.isVector() &&
3731 TLI.isTruncateFree(LargestVT, VT))
3732 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
3733 else
3734 Value = getMemsetValue(Src, VT, DAG, dl);
3735 }
3736 assert(Value.getValueType() == VT && "Value with wrong type.");
3737 SDValue Store = DAG.getStore(Chain, dl, Value,
3738 getMemBasePlusOffset(Dst, DstOff, DAG),
3739 DstPtrInfo.getWithOffset(DstOff),
3740 isVol, false, Align);
3741 OutChains.push_back(Store);
3742 DstOff += VT.getSizeInBits() / 8;
3743 }
3744
3745 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
3746 &OutChains[0], OutChains.size());
3747 }
3748
getMemcpy(SDValue Chain,DebugLoc dl,SDValue Dst,SDValue Src,SDValue Size,unsigned Align,bool isVol,bool AlwaysInline,MachinePointerInfo DstPtrInfo,MachinePointerInfo SrcPtrInfo)3749 SDValue SelectionDAG::getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst,
3750 SDValue Src, SDValue Size,
3751 unsigned Align, bool isVol, bool AlwaysInline,
3752 MachinePointerInfo DstPtrInfo,
3753 MachinePointerInfo SrcPtrInfo) {
3754
3755 // Check to see if we should lower the memcpy to loads and stores first.
3756 // For cases within the target-specified limits, this is the best choice.
3757 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
3758 if (ConstantSize) {
3759 // Memcpy with size zero? Just return the original chain.
3760 if (ConstantSize->isNullValue())
3761 return Chain;
3762
3763 SDValue Result = getMemcpyLoadsAndStores(*this, dl, Chain, Dst, Src,
3764 ConstantSize->getZExtValue(),Align,
3765 isVol, false, DstPtrInfo, SrcPtrInfo);
3766 if (Result.getNode())
3767 return Result;
3768 }
3769
3770 // Then check to see if we should lower the memcpy with target-specific
3771 // code. If the target chooses to do this, this is the next best.
3772 SDValue Result =
3773 TSI.EmitTargetCodeForMemcpy(*this, dl, Chain, Dst, Src, Size, Align,
3774 isVol, AlwaysInline,
3775 DstPtrInfo, SrcPtrInfo);
3776 if (Result.getNode())
3777 return Result;
3778
3779 // If we really need inline code and the target declined to provide it,
3780 // use a (potentially long) sequence of loads and stores.
3781 if (AlwaysInline) {
3782 assert(ConstantSize && "AlwaysInline requires a constant size!");
3783 return getMemcpyLoadsAndStores(*this, dl, Chain, Dst, Src,
3784 ConstantSize->getZExtValue(), Align, isVol,
3785 true, DstPtrInfo, SrcPtrInfo);
3786 }
3787
3788 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
3789 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
3790 // respect volatile, so they may do things like read or write memory
3791 // beyond the given memory regions. But fixing this isn't easy, and most
3792 // people don't care.
3793
3794 // Emit a library call.
3795 TargetLowering::ArgListTy Args;
3796 TargetLowering::ArgListEntry Entry;
3797 Entry.Ty = TLI.getTargetData()->getIntPtrType(*getContext());
3798 Entry.Node = Dst; Args.push_back(Entry);
3799 Entry.Node = Src; Args.push_back(Entry);
3800 Entry.Node = Size; Args.push_back(Entry);
3801 // FIXME: pass in DebugLoc
3802 TargetLowering::
3803 CallLoweringInfo CLI(Chain, Type::getVoidTy(*getContext()),
3804 false, false, false, false, 0,
3805 TLI.getLibcallCallingConv(RTLIB::MEMCPY),
3806 /*isTailCall=*/false,
3807 /*doesNotReturn=*/false, /*isReturnValueUsed=*/false,
3808 getExternalSymbol(TLI.getLibcallName(RTLIB::MEMCPY),
3809 TLI.getPointerTy()),
3810 Args, *this, dl);
3811 std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
3812
3813 return CallResult.second;
3814 }
3815
getMemmove(SDValue Chain,DebugLoc dl,SDValue Dst,SDValue Src,SDValue Size,unsigned Align,bool isVol,MachinePointerInfo DstPtrInfo,MachinePointerInfo SrcPtrInfo)3816 SDValue SelectionDAG::getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst,
3817 SDValue Src, SDValue Size,
3818 unsigned Align, bool isVol,
3819 MachinePointerInfo DstPtrInfo,
3820 MachinePointerInfo SrcPtrInfo) {
3821
3822 // Check to see if we should lower the memmove to loads and stores first.
3823 // For cases within the target-specified limits, this is the best choice.
3824 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
3825 if (ConstantSize) {
3826 // Memmove with size zero? Just return the original chain.
3827 if (ConstantSize->isNullValue())
3828 return Chain;
3829
3830 SDValue Result =
3831 getMemmoveLoadsAndStores(*this, dl, Chain, Dst, Src,
3832 ConstantSize->getZExtValue(), Align, isVol,
3833 false, DstPtrInfo, SrcPtrInfo);
3834 if (Result.getNode())
3835 return Result;
3836 }
3837
3838 // Then check to see if we should lower the memmove with target-specific
3839 // code. If the target chooses to do this, this is the next best.
3840 SDValue Result =
3841 TSI.EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size, Align, isVol,
3842 DstPtrInfo, SrcPtrInfo);
3843 if (Result.getNode())
3844 return Result;
3845
3846 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
3847 // not be safe. See memcpy above for more details.
3848
3849 // Emit a library call.
3850 TargetLowering::ArgListTy Args;
3851 TargetLowering::ArgListEntry Entry;
3852 Entry.Ty = TLI.getTargetData()->getIntPtrType(*getContext());
3853 Entry.Node = Dst; Args.push_back(Entry);
3854 Entry.Node = Src; Args.push_back(Entry);
3855 Entry.Node = Size; Args.push_back(Entry);
3856 // FIXME: pass in DebugLoc
3857 TargetLowering::
3858 CallLoweringInfo CLI(Chain, Type::getVoidTy(*getContext()),
3859 false, false, false, false, 0,
3860 TLI.getLibcallCallingConv(RTLIB::MEMMOVE),
3861 /*isTailCall=*/false,
3862 /*doesNotReturn=*/false, /*isReturnValueUsed=*/false,
3863 getExternalSymbol(TLI.getLibcallName(RTLIB::MEMMOVE),
3864 TLI.getPointerTy()),
3865 Args, *this, dl);
3866 std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
3867
3868 return CallResult.second;
3869 }
3870
getMemset(SDValue Chain,DebugLoc dl,SDValue Dst,SDValue Src,SDValue Size,unsigned Align,bool isVol,MachinePointerInfo DstPtrInfo)3871 SDValue SelectionDAG::getMemset(SDValue Chain, DebugLoc dl, SDValue Dst,
3872 SDValue Src, SDValue Size,
3873 unsigned Align, bool isVol,
3874 MachinePointerInfo DstPtrInfo) {
3875
3876 // Check to see if we should lower the memset to stores first.
3877 // For cases within the target-specified limits, this is the best choice.
3878 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
3879 if (ConstantSize) {
3880 // Memset with size zero? Just return the original chain.
3881 if (ConstantSize->isNullValue())
3882 return Chain;
3883
3884 SDValue Result =
3885 getMemsetStores(*this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(),
3886 Align, isVol, DstPtrInfo);
3887
3888 if (Result.getNode())
3889 return Result;
3890 }
3891
3892 // Then check to see if we should lower the memset with target-specific
3893 // code. If the target chooses to do this, this is the next best.
3894 SDValue Result =
3895 TSI.EmitTargetCodeForMemset(*this, dl, Chain, Dst, Src, Size, Align, isVol,
3896 DstPtrInfo);
3897 if (Result.getNode())
3898 return Result;
3899
3900 // Emit a library call.
3901 Type *IntPtrTy = TLI.getTargetData()->getIntPtrType(*getContext());
3902 TargetLowering::ArgListTy Args;
3903 TargetLowering::ArgListEntry Entry;
3904 Entry.Node = Dst; Entry.Ty = IntPtrTy;
3905 Args.push_back(Entry);
3906 // Extend or truncate the argument to be an i32 value for the call.
3907 if (Src.getValueType().bitsGT(MVT::i32))
3908 Src = getNode(ISD::TRUNCATE, dl, MVT::i32, Src);
3909 else
3910 Src = getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Src);
3911 Entry.Node = Src;
3912 Entry.Ty = Type::getInt32Ty(*getContext());
3913 Entry.isSExt = true;
3914 Args.push_back(Entry);
3915 Entry.Node = Size;
3916 Entry.Ty = IntPtrTy;
3917 Entry.isSExt = false;
3918 Args.push_back(Entry);
3919 // FIXME: pass in DebugLoc
3920 TargetLowering::
3921 CallLoweringInfo CLI(Chain, Type::getVoidTy(*getContext()),
3922 false, false, false, false, 0,
3923 TLI.getLibcallCallingConv(RTLIB::MEMSET),
3924 /*isTailCall=*/false,
3925 /*doesNotReturn*/false, /*isReturnValueUsed=*/false,
3926 getExternalSymbol(TLI.getLibcallName(RTLIB::MEMSET),
3927 TLI.getPointerTy()),
3928 Args, *this, dl);
3929 std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
3930
3931 return CallResult.second;
3932 }
3933
getAtomic(unsigned Opcode,DebugLoc dl,EVT MemVT,SDValue Chain,SDValue Ptr,SDValue Cmp,SDValue Swp,MachinePointerInfo PtrInfo,unsigned Alignment,AtomicOrdering Ordering,SynchronizationScope SynchScope)3934 SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
3935 SDValue Chain, SDValue Ptr, SDValue Cmp,
3936 SDValue Swp, MachinePointerInfo PtrInfo,
3937 unsigned Alignment,
3938 AtomicOrdering Ordering,
3939 SynchronizationScope SynchScope) {
3940 if (Alignment == 0) // Ensure that codegen never sees alignment 0
3941 Alignment = getEVTAlignment(MemVT);
3942
3943 MachineFunction &MF = getMachineFunction();
3944
3945 // All atomics are load and store, except for ATMOIC_LOAD and ATOMIC_STORE.
3946 // For now, atomics are considered to be volatile always.
3947 // FIXME: Volatile isn't really correct; we should keep track of atomic
3948 // orderings in the memoperand.
3949 unsigned Flags = MachineMemOperand::MOVolatile;
3950 if (Opcode != ISD::ATOMIC_STORE)
3951 Flags |= MachineMemOperand::MOLoad;
3952 if (Opcode != ISD::ATOMIC_LOAD)
3953 Flags |= MachineMemOperand::MOStore;
3954
3955 MachineMemOperand *MMO =
3956 MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment);
3957
3958 return getAtomic(Opcode, dl, MemVT, Chain, Ptr, Cmp, Swp, MMO,
3959 Ordering, SynchScope);
3960 }
3961
getAtomic(unsigned Opcode,DebugLoc dl,EVT MemVT,SDValue Chain,SDValue Ptr,SDValue Cmp,SDValue Swp,MachineMemOperand * MMO,AtomicOrdering Ordering,SynchronizationScope SynchScope)3962 SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
3963 SDValue Chain,
3964 SDValue Ptr, SDValue Cmp,
3965 SDValue Swp, MachineMemOperand *MMO,
3966 AtomicOrdering Ordering,
3967 SynchronizationScope SynchScope) {
3968 assert(Opcode == ISD::ATOMIC_CMP_SWAP && "Invalid Atomic Op");
3969 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
3970
3971 EVT VT = Cmp.getValueType();
3972
3973 SDVTList VTs = getVTList(VT, MVT::Other);
3974 FoldingSetNodeID ID;
3975 ID.AddInteger(MemVT.getRawBits());
3976 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
3977 AddNodeIDNode(ID, Opcode, VTs, Ops, 4);
3978 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
3979 void* IP = 0;
3980 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
3981 cast<AtomicSDNode>(E)->refineAlignment(MMO);
3982 return SDValue(E, 0);
3983 }
3984 SDNode *N = new (NodeAllocator) AtomicSDNode(Opcode, dl, VTs, MemVT, Chain,
3985 Ptr, Cmp, Swp, MMO, Ordering,
3986 SynchScope);
3987 CSEMap.InsertNode(N, IP);
3988 AllNodes.push_back(N);
3989 return SDValue(N, 0);
3990 }
3991
getAtomic(unsigned Opcode,DebugLoc dl,EVT MemVT,SDValue Chain,SDValue Ptr,SDValue Val,const Value * PtrVal,unsigned Alignment,AtomicOrdering Ordering,SynchronizationScope SynchScope)3992 SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
3993 SDValue Chain,
3994 SDValue Ptr, SDValue Val,
3995 const Value* PtrVal,
3996 unsigned Alignment,
3997 AtomicOrdering Ordering,
3998 SynchronizationScope SynchScope) {
3999 if (Alignment == 0) // Ensure that codegen never sees alignment 0
4000 Alignment = getEVTAlignment(MemVT);
4001
4002 MachineFunction &MF = getMachineFunction();
4003 // An atomic store does not load. An atomic load does not store.
4004 // (An atomicrmw obviously both loads and stores.)
4005 // For now, atomics are considered to be volatile always, and they are
4006 // chained as such.
4007 // FIXME: Volatile isn't really correct; we should keep track of atomic
4008 // orderings in the memoperand.
4009 unsigned Flags = MachineMemOperand::MOVolatile;
4010 if (Opcode != ISD::ATOMIC_STORE)
4011 Flags |= MachineMemOperand::MOLoad;
4012 if (Opcode != ISD::ATOMIC_LOAD)
4013 Flags |= MachineMemOperand::MOStore;
4014
4015 MachineMemOperand *MMO =
4016 MF.getMachineMemOperand(MachinePointerInfo(PtrVal), Flags,
4017 MemVT.getStoreSize(), Alignment);
4018
4019 return getAtomic(Opcode, dl, MemVT, Chain, Ptr, Val, MMO,
4020 Ordering, SynchScope);
4021 }
4022
getAtomic(unsigned Opcode,DebugLoc dl,EVT MemVT,SDValue Chain,SDValue Ptr,SDValue Val,MachineMemOperand * MMO,AtomicOrdering Ordering,SynchronizationScope SynchScope)4023 SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
4024 SDValue Chain,
4025 SDValue Ptr, SDValue Val,
4026 MachineMemOperand *MMO,
4027 AtomicOrdering Ordering,
4028 SynchronizationScope SynchScope) {
4029 assert((Opcode == ISD::ATOMIC_LOAD_ADD ||
4030 Opcode == ISD::ATOMIC_LOAD_SUB ||
4031 Opcode == ISD::ATOMIC_LOAD_AND ||
4032 Opcode == ISD::ATOMIC_LOAD_OR ||
4033 Opcode == ISD::ATOMIC_LOAD_XOR ||
4034 Opcode == ISD::ATOMIC_LOAD_NAND ||
4035 Opcode == ISD::ATOMIC_LOAD_MIN ||
4036 Opcode == ISD::ATOMIC_LOAD_MAX ||
4037 Opcode == ISD::ATOMIC_LOAD_UMIN ||
4038 Opcode == ISD::ATOMIC_LOAD_UMAX ||
4039 Opcode == ISD::ATOMIC_SWAP ||
4040 Opcode == ISD::ATOMIC_STORE) &&
4041 "Invalid Atomic Op");
4042
4043 EVT VT = Val.getValueType();
4044
4045 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
4046 getVTList(VT, MVT::Other);
4047 FoldingSetNodeID ID;
4048 ID.AddInteger(MemVT.getRawBits());
4049 SDValue Ops[] = {Chain, Ptr, Val};
4050 AddNodeIDNode(ID, Opcode, VTs, Ops, 3);
4051 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
4052 void* IP = 0;
4053 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
4054 cast<AtomicSDNode>(E)->refineAlignment(MMO);
4055 return SDValue(E, 0);
4056 }
4057 SDNode *N = new (NodeAllocator) AtomicSDNode(Opcode, dl, VTs, MemVT, Chain,
4058 Ptr, Val, MMO,
4059 Ordering, SynchScope);
4060 CSEMap.InsertNode(N, IP);
4061 AllNodes.push_back(N);
4062 return SDValue(N, 0);
4063 }
4064
getAtomic(unsigned Opcode,DebugLoc dl,EVT MemVT,EVT VT,SDValue Chain,SDValue Ptr,const Value * PtrVal,unsigned Alignment,AtomicOrdering Ordering,SynchronizationScope SynchScope)4065 SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
4066 EVT VT, SDValue Chain,
4067 SDValue Ptr,
4068 const Value* PtrVal,
4069 unsigned Alignment,
4070 AtomicOrdering Ordering,
4071 SynchronizationScope SynchScope) {
4072 if (Alignment == 0) // Ensure that codegen never sees alignment 0
4073 Alignment = getEVTAlignment(MemVT);
4074
4075 MachineFunction &MF = getMachineFunction();
4076 // An atomic store does not load. An atomic load does not store.
4077 // (An atomicrmw obviously both loads and stores.)
4078 // For now, atomics are considered to be volatile always, and they are
4079 // chained as such.
4080 // FIXME: Volatile isn't really correct; we should keep track of atomic
4081 // orderings in the memoperand.
4082 unsigned Flags = MachineMemOperand::MOVolatile;
4083 if (Opcode != ISD::ATOMIC_STORE)
4084 Flags |= MachineMemOperand::MOLoad;
4085 if (Opcode != ISD::ATOMIC_LOAD)
4086 Flags |= MachineMemOperand::MOStore;
4087
4088 MachineMemOperand *MMO =
4089 MF.getMachineMemOperand(MachinePointerInfo(PtrVal), Flags,
4090 MemVT.getStoreSize(), Alignment);
4091
4092 return getAtomic(Opcode, dl, MemVT, VT, Chain, Ptr, MMO,
4093 Ordering, SynchScope);
4094 }
4095
getAtomic(unsigned Opcode,DebugLoc dl,EVT MemVT,EVT VT,SDValue Chain,SDValue Ptr,MachineMemOperand * MMO,AtomicOrdering Ordering,SynchronizationScope SynchScope)4096 SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
4097 EVT VT, SDValue Chain,
4098 SDValue Ptr,
4099 MachineMemOperand *MMO,
4100 AtomicOrdering Ordering,
4101 SynchronizationScope SynchScope) {
4102 assert(Opcode == ISD::ATOMIC_LOAD && "Invalid Atomic Op");
4103
4104 SDVTList VTs = getVTList(VT, MVT::Other);
4105 FoldingSetNodeID ID;
4106 ID.AddInteger(MemVT.getRawBits());
4107 SDValue Ops[] = {Chain, Ptr};
4108 AddNodeIDNode(ID, Opcode, VTs, Ops, 2);
4109 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
4110 void* IP = 0;
4111 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
4112 cast<AtomicSDNode>(E)->refineAlignment(MMO);
4113 return SDValue(E, 0);
4114 }
4115 SDNode *N = new (NodeAllocator) AtomicSDNode(Opcode, dl, VTs, MemVT, Chain,
4116 Ptr, MMO, Ordering, SynchScope);
4117 CSEMap.InsertNode(N, IP);
4118 AllNodes.push_back(N);
4119 return SDValue(N, 0);
4120 }
4121
4122 /// getMergeValues - Create a MERGE_VALUES node from the given operands.
getMergeValues(const SDValue * Ops,unsigned NumOps,DebugLoc dl)4123 SDValue SelectionDAG::getMergeValues(const SDValue *Ops, unsigned NumOps,
4124 DebugLoc dl) {
4125 if (NumOps == 1)
4126 return Ops[0];
4127
4128 SmallVector<EVT, 4> VTs;
4129 VTs.reserve(NumOps);
4130 for (unsigned i = 0; i < NumOps; ++i)
4131 VTs.push_back(Ops[i].getValueType());
4132 return getNode(ISD::MERGE_VALUES, dl, getVTList(&VTs[0], NumOps),
4133 Ops, NumOps);
4134 }
4135
4136 SDValue
getMemIntrinsicNode(unsigned Opcode,DebugLoc dl,const EVT * VTs,unsigned NumVTs,const SDValue * Ops,unsigned NumOps,EVT MemVT,MachinePointerInfo PtrInfo,unsigned Align,bool Vol,bool ReadMem,bool WriteMem)4137 SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl,
4138 const EVT *VTs, unsigned NumVTs,
4139 const SDValue *Ops, unsigned NumOps,
4140 EVT MemVT, MachinePointerInfo PtrInfo,
4141 unsigned Align, bool Vol,
4142 bool ReadMem, bool WriteMem) {
4143 return getMemIntrinsicNode(Opcode, dl, makeVTList(VTs, NumVTs), Ops, NumOps,
4144 MemVT, PtrInfo, Align, Vol,
4145 ReadMem, WriteMem);
4146 }
4147
4148 SDValue
getMemIntrinsicNode(unsigned Opcode,DebugLoc dl,SDVTList VTList,const SDValue * Ops,unsigned NumOps,EVT MemVT,MachinePointerInfo PtrInfo,unsigned Align,bool Vol,bool ReadMem,bool WriteMem)4149 SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
4150 const SDValue *Ops, unsigned NumOps,
4151 EVT MemVT, MachinePointerInfo PtrInfo,
4152 unsigned Align, bool Vol,
4153 bool ReadMem, bool WriteMem) {
4154 if (Align == 0) // Ensure that codegen never sees alignment 0
4155 Align = getEVTAlignment(MemVT);
4156
4157 MachineFunction &MF = getMachineFunction();
4158 unsigned Flags = 0;
4159 if (WriteMem)
4160 Flags |= MachineMemOperand::MOStore;
4161 if (ReadMem)
4162 Flags |= MachineMemOperand::MOLoad;
4163 if (Vol)
4164 Flags |= MachineMemOperand::MOVolatile;
4165 MachineMemOperand *MMO =
4166 MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Align);
4167
4168 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, NumOps, MemVT, MMO);
4169 }
4170
4171 SDValue
getMemIntrinsicNode(unsigned Opcode,DebugLoc dl,SDVTList VTList,const SDValue * Ops,unsigned NumOps,EVT MemVT,MachineMemOperand * MMO)4172 SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
4173 const SDValue *Ops, unsigned NumOps,
4174 EVT MemVT, MachineMemOperand *MMO) {
4175 assert((Opcode == ISD::INTRINSIC_VOID ||
4176 Opcode == ISD::INTRINSIC_W_CHAIN ||
4177 Opcode == ISD::PREFETCH ||
4178 Opcode == ISD::LIFETIME_START ||
4179 Opcode == ISD::LIFETIME_END ||
4180 (Opcode <= INT_MAX &&
4181 (int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) &&
4182 "Opcode is not a memory-accessing opcode!");
4183
4184 // Memoize the node unless it returns a flag.
4185 MemIntrinsicSDNode *N;
4186 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
4187 FoldingSetNodeID ID;
4188 AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);
4189 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
4190 void *IP = 0;
4191 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
4192 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO);
4193 return SDValue(E, 0);
4194 }
4195
4196 N = new (NodeAllocator) MemIntrinsicSDNode(Opcode, dl, VTList, Ops, NumOps,
4197 MemVT, MMO);
4198 CSEMap.InsertNode(N, IP);
4199 } else {
4200 N = new (NodeAllocator) MemIntrinsicSDNode(Opcode, dl, VTList, Ops, NumOps,
4201 MemVT, MMO);
4202 }
4203 AllNodes.push_back(N);
4204 return SDValue(N, 0);
4205 }
4206
4207 /// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
4208 /// MachinePointerInfo record from it. This is particularly useful because the
4209 /// code generator has many cases where it doesn't bother passing in a
4210 /// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
InferPointerInfo(SDValue Ptr,int64_t Offset=0)4211 static MachinePointerInfo InferPointerInfo(SDValue Ptr, int64_t Offset = 0) {
4212 // If this is FI+Offset, we can model it.
4213 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
4214 return MachinePointerInfo::getFixedStack(FI->getIndex(), Offset);
4215
4216 // If this is (FI+Offset1)+Offset2, we can model it.
4217 if (Ptr.getOpcode() != ISD::ADD ||
4218 !isa<ConstantSDNode>(Ptr.getOperand(1)) ||
4219 !isa<FrameIndexSDNode>(Ptr.getOperand(0)))
4220 return MachinePointerInfo();
4221
4222 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
4223 return MachinePointerInfo::getFixedStack(FI, Offset+
4224 cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
4225 }
4226
4227 /// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
4228 /// MachinePointerInfo record from it. This is particularly useful because the
4229 /// code generator has many cases where it doesn't bother passing in a
4230 /// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
InferPointerInfo(SDValue Ptr,SDValue OffsetOp)4231 static MachinePointerInfo InferPointerInfo(SDValue Ptr, SDValue OffsetOp) {
4232 // If the 'Offset' value isn't a constant, we can't handle this.
4233 if (ConstantSDNode *OffsetNode = dyn_cast<ConstantSDNode>(OffsetOp))
4234 return InferPointerInfo(Ptr, OffsetNode->getSExtValue());
4235 if (OffsetOp.getOpcode() == ISD::UNDEF)
4236 return InferPointerInfo(Ptr);
4237 return MachinePointerInfo();
4238 }
4239
4240
4241 SDValue
getLoad(ISD::MemIndexedMode AM,ISD::LoadExtType ExtType,EVT VT,DebugLoc dl,SDValue Chain,SDValue Ptr,SDValue Offset,MachinePointerInfo PtrInfo,EVT MemVT,bool isVolatile,bool isNonTemporal,bool isInvariant,unsigned Alignment,const MDNode * TBAAInfo,const MDNode * Ranges)4242 SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
4243 EVT VT, DebugLoc dl, SDValue Chain,
4244 SDValue Ptr, SDValue Offset,
4245 MachinePointerInfo PtrInfo, EVT MemVT,
4246 bool isVolatile, bool isNonTemporal, bool isInvariant,
4247 unsigned Alignment, const MDNode *TBAAInfo,
4248 const MDNode *Ranges) {
4249 assert(Chain.getValueType() == MVT::Other &&
4250 "Invalid chain type");
4251 if (Alignment == 0) // Ensure that codegen never sees alignment 0
4252 Alignment = getEVTAlignment(VT);
4253
4254 unsigned Flags = MachineMemOperand::MOLoad;
4255 if (isVolatile)
4256 Flags |= MachineMemOperand::MOVolatile;
4257 if (isNonTemporal)
4258 Flags |= MachineMemOperand::MONonTemporal;
4259 if (isInvariant)
4260 Flags |= MachineMemOperand::MOInvariant;
4261
4262 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
4263 // clients.
4264 if (PtrInfo.V == 0)
4265 PtrInfo = InferPointerInfo(Ptr, Offset);
4266
4267 MachineFunction &MF = getMachineFunction();
4268 MachineMemOperand *MMO =
4269 MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment,
4270 TBAAInfo, Ranges);
4271 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
4272 }
4273
4274 SDValue
getLoad(ISD::MemIndexedMode AM,ISD::LoadExtType ExtType,EVT VT,DebugLoc dl,SDValue Chain,SDValue Ptr,SDValue Offset,EVT MemVT,MachineMemOperand * MMO)4275 SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
4276 EVT VT, DebugLoc dl, SDValue Chain,
4277 SDValue Ptr, SDValue Offset, EVT MemVT,
4278 MachineMemOperand *MMO) {
4279 if (VT == MemVT) {
4280 ExtType = ISD::NON_EXTLOAD;
4281 } else if (ExtType == ISD::NON_EXTLOAD) {
4282 assert(VT == MemVT && "Non-extending load from different memory type!");
4283 } else {
4284 // Extending load.
4285 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
4286 "Should only be an extending load, not truncating!");
4287 assert(VT.isInteger() == MemVT.isInteger() &&
4288 "Cannot convert from FP to Int or Int -> FP!");
4289 assert(VT.isVector() == MemVT.isVector() &&
4290 "Cannot use trunc store to convert to or from a vector!");
4291 assert((!VT.isVector() ||
4292 VT.getVectorNumElements() == MemVT.getVectorNumElements()) &&
4293 "Cannot use trunc store to change the number of vector elements!");
4294 }
4295
4296 bool Indexed = AM != ISD::UNINDEXED;
4297 assert((Indexed || Offset.getOpcode() == ISD::UNDEF) &&
4298 "Unindexed load with an offset!");
4299
4300 SDVTList VTs = Indexed ?
4301 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
4302 SDValue Ops[] = { Chain, Ptr, Offset };
4303 FoldingSetNodeID ID;
4304 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops, 3);
4305 ID.AddInteger(MemVT.getRawBits());
4306 ID.AddInteger(encodeMemSDNodeFlags(ExtType, AM, MMO->isVolatile(),
4307 MMO->isNonTemporal(),
4308 MMO->isInvariant()));
4309 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
4310 void *IP = 0;
4311 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
4312 cast<LoadSDNode>(E)->refineAlignment(MMO);
4313 return SDValue(E, 0);
4314 }
4315 SDNode *N = new (NodeAllocator) LoadSDNode(Ops, dl, VTs, AM, ExtType,
4316 MemVT, MMO);
4317 CSEMap.InsertNode(N, IP);
4318 AllNodes.push_back(N);
4319 return SDValue(N, 0);
4320 }
4321
getLoad(EVT VT,DebugLoc dl,SDValue Chain,SDValue Ptr,MachinePointerInfo PtrInfo,bool isVolatile,bool isNonTemporal,bool isInvariant,unsigned Alignment,const MDNode * TBAAInfo,const MDNode * Ranges)4322 SDValue SelectionDAG::getLoad(EVT VT, DebugLoc dl,
4323 SDValue Chain, SDValue Ptr,
4324 MachinePointerInfo PtrInfo,
4325 bool isVolatile, bool isNonTemporal,
4326 bool isInvariant, unsigned Alignment,
4327 const MDNode *TBAAInfo,
4328 const MDNode *Ranges) {
4329 SDValue Undef = getUNDEF(Ptr.getValueType());
4330 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
4331 PtrInfo, VT, isVolatile, isNonTemporal, isInvariant, Alignment,
4332 TBAAInfo, Ranges);
4333 }
4334
getExtLoad(ISD::LoadExtType ExtType,DebugLoc dl,EVT VT,SDValue Chain,SDValue Ptr,MachinePointerInfo PtrInfo,EVT MemVT,bool isVolatile,bool isNonTemporal,unsigned Alignment,const MDNode * TBAAInfo)4335 SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, DebugLoc dl, EVT VT,
4336 SDValue Chain, SDValue Ptr,
4337 MachinePointerInfo PtrInfo, EVT MemVT,
4338 bool isVolatile, bool isNonTemporal,
4339 unsigned Alignment, const MDNode *TBAAInfo) {
4340 SDValue Undef = getUNDEF(Ptr.getValueType());
4341 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
4342 PtrInfo, MemVT, isVolatile, isNonTemporal, false, Alignment,
4343 TBAAInfo);
4344 }
4345
4346
4347 SDValue
getIndexedLoad(SDValue OrigLoad,DebugLoc dl,SDValue Base,SDValue Offset,ISD::MemIndexedMode AM)4348 SelectionDAG::getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
4349 SDValue Offset, ISD::MemIndexedMode AM) {
4350 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
4351 assert(LD->getOffset().getOpcode() == ISD::UNDEF &&
4352 "Load is already a indexed load!");
4353 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
4354 LD->getChain(), Base, Offset, LD->getPointerInfo(),
4355 LD->getMemoryVT(), LD->isVolatile(), LD->isNonTemporal(),
4356 false, LD->getAlignment());
4357 }
4358
getStore(SDValue Chain,DebugLoc dl,SDValue Val,SDValue Ptr,MachinePointerInfo PtrInfo,bool isVolatile,bool isNonTemporal,unsigned Alignment,const MDNode * TBAAInfo)4359 SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
4360 SDValue Ptr, MachinePointerInfo PtrInfo,
4361 bool isVolatile, bool isNonTemporal,
4362 unsigned Alignment, const MDNode *TBAAInfo) {
4363 assert(Chain.getValueType() == MVT::Other &&
4364 "Invalid chain type");
4365 if (Alignment == 0) // Ensure that codegen never sees alignment 0
4366 Alignment = getEVTAlignment(Val.getValueType());
4367
4368 unsigned Flags = MachineMemOperand::MOStore;
4369 if (isVolatile)
4370 Flags |= MachineMemOperand::MOVolatile;
4371 if (isNonTemporal)
4372 Flags |= MachineMemOperand::MONonTemporal;
4373
4374 if (PtrInfo.V == 0)
4375 PtrInfo = InferPointerInfo(Ptr);
4376
4377 MachineFunction &MF = getMachineFunction();
4378 MachineMemOperand *MMO =
4379 MF.getMachineMemOperand(PtrInfo, Flags,
4380 Val.getValueType().getStoreSize(), Alignment,
4381 TBAAInfo);
4382
4383 return getStore(Chain, dl, Val, Ptr, MMO);
4384 }
4385
getStore(SDValue Chain,DebugLoc dl,SDValue Val,SDValue Ptr,MachineMemOperand * MMO)4386 SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
4387 SDValue Ptr, MachineMemOperand *MMO) {
4388 assert(Chain.getValueType() == MVT::Other &&
4389 "Invalid chain type");
4390 EVT VT = Val.getValueType();
4391 SDVTList VTs = getVTList(MVT::Other);
4392 SDValue Undef = getUNDEF(Ptr.getValueType());
4393 SDValue Ops[] = { Chain, Val, Ptr, Undef };
4394 FoldingSetNodeID ID;
4395 AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
4396 ID.AddInteger(VT.getRawBits());
4397 ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile(),
4398 MMO->isNonTemporal(), MMO->isInvariant()));
4399 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
4400 void *IP = 0;
4401 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
4402 cast<StoreSDNode>(E)->refineAlignment(MMO);
4403 return SDValue(E, 0);
4404 }
4405 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl, VTs, ISD::UNINDEXED,
4406 false, VT, MMO);
4407 CSEMap.InsertNode(N, IP);
4408 AllNodes.push_back(N);
4409 return SDValue(N, 0);
4410 }
4411
getTruncStore(SDValue Chain,DebugLoc dl,SDValue Val,SDValue Ptr,MachinePointerInfo PtrInfo,EVT SVT,bool isVolatile,bool isNonTemporal,unsigned Alignment,const MDNode * TBAAInfo)4412 SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
4413 SDValue Ptr, MachinePointerInfo PtrInfo,
4414 EVT SVT,bool isVolatile, bool isNonTemporal,
4415 unsigned Alignment,
4416 const MDNode *TBAAInfo) {
4417 assert(Chain.getValueType() == MVT::Other &&
4418 "Invalid chain type");
4419 if (Alignment == 0) // Ensure that codegen never sees alignment 0
4420 Alignment = getEVTAlignment(SVT);
4421
4422 unsigned Flags = MachineMemOperand::MOStore;
4423 if (isVolatile)
4424 Flags |= MachineMemOperand::MOVolatile;
4425 if (isNonTemporal)
4426 Flags |= MachineMemOperand::MONonTemporal;
4427
4428 if (PtrInfo.V == 0)
4429 PtrInfo = InferPointerInfo(Ptr);
4430
4431 MachineFunction &MF = getMachineFunction();
4432 MachineMemOperand *MMO =
4433 MF.getMachineMemOperand(PtrInfo, Flags, SVT.getStoreSize(), Alignment,
4434 TBAAInfo);
4435
4436 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
4437 }
4438
getTruncStore(SDValue Chain,DebugLoc dl,SDValue Val,SDValue Ptr,EVT SVT,MachineMemOperand * MMO)4439 SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
4440 SDValue Ptr, EVT SVT,
4441 MachineMemOperand *MMO) {
4442 EVT VT = Val.getValueType();
4443
4444 assert(Chain.getValueType() == MVT::Other &&
4445 "Invalid chain type");
4446 if (VT == SVT)
4447 return getStore(Chain, dl, Val, Ptr, MMO);
4448
4449 assert(SVT.getScalarType().bitsLT(VT.getScalarType()) &&
4450 "Should only be a truncating store, not extending!");
4451 assert(VT.isInteger() == SVT.isInteger() &&
4452 "Can't do FP-INT conversion!");
4453 assert(VT.isVector() == SVT.isVector() &&
4454 "Cannot use trunc store to convert to or from a vector!");
4455 assert((!VT.isVector() ||
4456 VT.getVectorNumElements() == SVT.getVectorNumElements()) &&
4457 "Cannot use trunc store to change the number of vector elements!");
4458
4459 SDVTList VTs = getVTList(MVT::Other);
4460 SDValue Undef = getUNDEF(Ptr.getValueType());
4461 SDValue Ops[] = { Chain, Val, Ptr, Undef };
4462 FoldingSetNodeID ID;
4463 AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
4464 ID.AddInteger(SVT.getRawBits());
4465 ID.AddInteger(encodeMemSDNodeFlags(true, ISD::UNINDEXED, MMO->isVolatile(),
4466 MMO->isNonTemporal(), MMO->isInvariant()));
4467 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
4468 void *IP = 0;
4469 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
4470 cast<StoreSDNode>(E)->refineAlignment(MMO);
4471 return SDValue(E, 0);
4472 }
4473 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl, VTs, ISD::UNINDEXED,
4474 true, SVT, MMO);
4475 CSEMap.InsertNode(N, IP);
4476 AllNodes.push_back(N);
4477 return SDValue(N, 0);
4478 }
4479
4480 SDValue
getIndexedStore(SDValue OrigStore,DebugLoc dl,SDValue Base,SDValue Offset,ISD::MemIndexedMode AM)4481 SelectionDAG::getIndexedStore(SDValue OrigStore, DebugLoc dl, SDValue Base,
4482 SDValue Offset, ISD::MemIndexedMode AM) {
4483 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
4484 assert(ST->getOffset().getOpcode() == ISD::UNDEF &&
4485 "Store is already a indexed store!");
4486 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
4487 SDValue Ops[] = { ST->getChain(), ST->getValue(), Base, Offset };
4488 FoldingSetNodeID ID;
4489 AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
4490 ID.AddInteger(ST->getMemoryVT().getRawBits());
4491 ID.AddInteger(ST->getRawSubclassData());
4492 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
4493 void *IP = 0;
4494 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
4495 return SDValue(E, 0);
4496
4497 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl, VTs, AM,
4498 ST->isTruncatingStore(),
4499 ST->getMemoryVT(),
4500 ST->getMemOperand());
4501 CSEMap.InsertNode(N, IP);
4502 AllNodes.push_back(N);
4503 return SDValue(N, 0);
4504 }
4505
getVAArg(EVT VT,DebugLoc dl,SDValue Chain,SDValue Ptr,SDValue SV,unsigned Align)4506 SDValue SelectionDAG::getVAArg(EVT VT, DebugLoc dl,
4507 SDValue Chain, SDValue Ptr,
4508 SDValue SV,
4509 unsigned Align) {
4510 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, MVT::i32) };
4511 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops, 4);
4512 }
4513
getNode(unsigned Opcode,DebugLoc DL,EVT VT,const SDUse * Ops,unsigned NumOps)4514 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
4515 const SDUse *Ops, unsigned NumOps) {
4516 switch (NumOps) {
4517 case 0: return getNode(Opcode, DL, VT);
4518 case 1: return getNode(Opcode, DL, VT, Ops[0]);
4519 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
4520 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
4521 default: break;
4522 }
4523
4524 // Copy from an SDUse array into an SDValue array for use with
4525 // the regular getNode logic.
4526 SmallVector<SDValue, 8> NewOps(Ops, Ops + NumOps);
4527 return getNode(Opcode, DL, VT, &NewOps[0], NumOps);
4528 }
4529
getNode(unsigned Opcode,DebugLoc DL,EVT VT,const SDValue * Ops,unsigned NumOps)4530 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
4531 const SDValue *Ops, unsigned NumOps) {
4532 switch (NumOps) {
4533 case 0: return getNode(Opcode, DL, VT);
4534 case 1: return getNode(Opcode, DL, VT, Ops[0]);
4535 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
4536 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
4537 default: break;
4538 }
4539
4540 switch (Opcode) {
4541 default: break;
4542 case ISD::SELECT_CC: {
4543 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
4544 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
4545 "LHS and RHS of condition must have same type!");
4546 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
4547 "True and False arms of SelectCC must have same type!");
4548 assert(Ops[2].getValueType() == VT &&
4549 "select_cc node must be of same type as true and false value!");
4550 break;
4551 }
4552 case ISD::BR_CC: {
4553 assert(NumOps == 5 && "BR_CC takes 5 operands!");
4554 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
4555 "LHS/RHS of comparison should match types!");
4556 break;
4557 }
4558 }
4559
4560 // Memoize nodes.
4561 SDNode *N;
4562 SDVTList VTs = getVTList(VT);
4563
4564 if (VT != MVT::Glue) {
4565 FoldingSetNodeID ID;
4566 AddNodeIDNode(ID, Opcode, VTs, Ops, NumOps);
4567 void *IP = 0;
4568
4569 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
4570 return SDValue(E, 0);
4571
4572 N = new (NodeAllocator) SDNode(Opcode, DL, VTs, Ops, NumOps);
4573 CSEMap.InsertNode(N, IP);
4574 } else {
4575 N = new (NodeAllocator) SDNode(Opcode, DL, VTs, Ops, NumOps);
4576 }
4577
4578 AllNodes.push_back(N);
4579 #ifndef NDEBUG
4580 VerifySDNode(N);
4581 #endif
4582 return SDValue(N, 0);
4583 }
4584
getNode(unsigned Opcode,DebugLoc DL,const std::vector<EVT> & ResultTys,const SDValue * Ops,unsigned NumOps)4585 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
4586 const std::vector<EVT> &ResultTys,
4587 const SDValue *Ops, unsigned NumOps) {
4588 return getNode(Opcode, DL, getVTList(&ResultTys[0], ResultTys.size()),
4589 Ops, NumOps);
4590 }
4591
getNode(unsigned Opcode,DebugLoc DL,const EVT * VTs,unsigned NumVTs,const SDValue * Ops,unsigned NumOps)4592 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
4593 const EVT *VTs, unsigned NumVTs,
4594 const SDValue *Ops, unsigned NumOps) {
4595 if (NumVTs == 1)
4596 return getNode(Opcode, DL, VTs[0], Ops, NumOps);
4597 return getNode(Opcode, DL, makeVTList(VTs, NumVTs), Ops, NumOps);
4598 }
4599
getNode(unsigned Opcode,DebugLoc DL,SDVTList VTList,const SDValue * Ops,unsigned NumOps)4600 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
4601 const SDValue *Ops, unsigned NumOps) {
4602 if (VTList.NumVTs == 1)
4603 return getNode(Opcode, DL, VTList.VTs[0], Ops, NumOps);
4604
4605 #if 0
4606 switch (Opcode) {
4607 // FIXME: figure out how to safely handle things like
4608 // int foo(int x) { return 1 << (x & 255); }
4609 // int bar() { return foo(256); }
4610 case ISD::SRA_PARTS:
4611 case ISD::SRL_PARTS:
4612 case ISD::SHL_PARTS:
4613 if (N3.getOpcode() == ISD::SIGN_EXTEND_INREG &&
4614 cast<VTSDNode>(N3.getOperand(1))->getVT() != MVT::i1)
4615 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
4616 else if (N3.getOpcode() == ISD::AND)
4617 if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N3.getOperand(1))) {
4618 // If the and is only masking out bits that cannot effect the shift,
4619 // eliminate the and.
4620 unsigned NumBits = VT.getScalarType().getSizeInBits()*2;
4621 if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1)
4622 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
4623 }
4624 break;
4625 }
4626 #endif
4627
4628 // Memoize the node unless it returns a flag.
4629 SDNode *N;
4630 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
4631 FoldingSetNodeID ID;
4632 AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);
4633 void *IP = 0;
4634 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
4635 return SDValue(E, 0);
4636
4637 if (NumOps == 1) {
4638 N = new (NodeAllocator) UnarySDNode(Opcode, DL, VTList, Ops[0]);
4639 } else if (NumOps == 2) {
4640 N = new (NodeAllocator) BinarySDNode(Opcode, DL, VTList, Ops[0], Ops[1]);
4641 } else if (NumOps == 3) {
4642 N = new (NodeAllocator) TernarySDNode(Opcode, DL, VTList, Ops[0], Ops[1],
4643 Ops[2]);
4644 } else {
4645 N = new (NodeAllocator) SDNode(Opcode, DL, VTList, Ops, NumOps);
4646 }
4647 CSEMap.InsertNode(N, IP);
4648 } else {
4649 if (NumOps == 1) {
4650 N = new (NodeAllocator) UnarySDNode(Opcode, DL, VTList, Ops[0]);
4651 } else if (NumOps == 2) {
4652 N = new (NodeAllocator) BinarySDNode(Opcode, DL, VTList, Ops[0], Ops[1]);
4653 } else if (NumOps == 3) {
4654 N = new (NodeAllocator) TernarySDNode(Opcode, DL, VTList, Ops[0], Ops[1],
4655 Ops[2]);
4656 } else {
4657 N = new (NodeAllocator) SDNode(Opcode, DL, VTList, Ops, NumOps);
4658 }
4659 }
4660 AllNodes.push_back(N);
4661 #ifndef NDEBUG
4662 VerifySDNode(N);
4663 #endif
4664 return SDValue(N, 0);
4665 }
4666
getNode(unsigned Opcode,DebugLoc DL,SDVTList VTList)4667 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList) {
4668 return getNode(Opcode, DL, VTList, 0, 0);
4669 }
4670
getNode(unsigned Opcode,DebugLoc DL,SDVTList VTList,SDValue N1)4671 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
4672 SDValue N1) {
4673 SDValue Ops[] = { N1 };
4674 return getNode(Opcode, DL, VTList, Ops, 1);
4675 }
4676
getNode(unsigned Opcode,DebugLoc DL,SDVTList VTList,SDValue N1,SDValue N2)4677 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
4678 SDValue N1, SDValue N2) {
4679 SDValue Ops[] = { N1, N2 };
4680 return getNode(Opcode, DL, VTList, Ops, 2);
4681 }
4682
getNode(unsigned Opcode,DebugLoc DL,SDVTList VTList,SDValue N1,SDValue N2,SDValue N3)4683 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
4684 SDValue N1, SDValue N2, SDValue N3) {
4685 SDValue Ops[] = { N1, N2, N3 };
4686 return getNode(Opcode, DL, VTList, Ops, 3);
4687 }
4688
getNode(unsigned Opcode,DebugLoc DL,SDVTList VTList,SDValue N1,SDValue N2,SDValue N3,SDValue N4)4689 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
4690 SDValue N1, SDValue N2, SDValue N3,
4691 SDValue N4) {
4692 SDValue Ops[] = { N1, N2, N3, N4 };
4693 return getNode(Opcode, DL, VTList, Ops, 4);
4694 }
4695
getNode(unsigned Opcode,DebugLoc DL,SDVTList VTList,SDValue N1,SDValue N2,SDValue N3,SDValue N4,SDValue N5)4696 SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
4697 SDValue N1, SDValue N2, SDValue N3,
4698 SDValue N4, SDValue N5) {
4699 SDValue Ops[] = { N1, N2, N3, N4, N5 };
4700 return getNode(Opcode, DL, VTList, Ops, 5);
4701 }
4702
getVTList(EVT VT)4703 SDVTList SelectionDAG::getVTList(EVT VT) {
4704 return makeVTList(SDNode::getValueTypeList(VT), 1);
4705 }
4706
getVTList(EVT VT1,EVT VT2)4707 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2) {
4708 for (std::vector<SDVTList>::reverse_iterator I = VTList.rbegin(),
4709 E = VTList.rend(); I != E; ++I)
4710 if (I->NumVTs == 2 && I->VTs[0] == VT1 && I->VTs[1] == VT2)
4711 return *I;
4712
4713 EVT *Array = Allocator.Allocate<EVT>(2);
4714 Array[0] = VT1;
4715 Array[1] = VT2;
4716 SDVTList Result = makeVTList(Array, 2);
4717 VTList.push_back(Result);
4718 return Result;
4719 }
4720
getVTList(EVT VT1,EVT VT2,EVT VT3)4721 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2, EVT VT3) {
4722 for (std::vector<SDVTList>::reverse_iterator I = VTList.rbegin(),
4723 E = VTList.rend(); I != E; ++I)
4724 if (I->NumVTs == 3 && I->VTs[0] == VT1 && I->VTs[1] == VT2 &&
4725 I->VTs[2] == VT3)
4726 return *I;
4727
4728 EVT *Array = Allocator.Allocate<EVT>(3);
4729 Array[0] = VT1;
4730 Array[1] = VT2;
4731 Array[2] = VT3;
4732 SDVTList Result = makeVTList(Array, 3);
4733 VTList.push_back(Result);
4734 return Result;
4735 }
4736
getVTList(EVT VT1,EVT VT2,EVT VT3,EVT VT4)4737 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2, EVT VT3, EVT VT4) {
4738 for (std::vector<SDVTList>::reverse_iterator I = VTList.rbegin(),
4739 E = VTList.rend(); I != E; ++I)
4740 if (I->NumVTs == 4 && I->VTs[0] == VT1 && I->VTs[1] == VT2 &&
4741 I->VTs[2] == VT3 && I->VTs[3] == VT4)
4742 return *I;
4743
4744 EVT *Array = Allocator.Allocate<EVT>(4);
4745 Array[0] = VT1;
4746 Array[1] = VT2;
4747 Array[2] = VT3;
4748 Array[3] = VT4;
4749 SDVTList Result = makeVTList(Array, 4);
4750 VTList.push_back(Result);
4751 return Result;
4752 }
4753
getVTList(const EVT * VTs,unsigned NumVTs)4754 SDVTList SelectionDAG::getVTList(const EVT *VTs, unsigned NumVTs) {
4755 switch (NumVTs) {
4756 case 0: llvm_unreachable("Cannot have nodes without results!");
4757 case 1: return getVTList(VTs[0]);
4758 case 2: return getVTList(VTs[0], VTs[1]);
4759 case 3: return getVTList(VTs[0], VTs[1], VTs[2]);
4760 case 4: return getVTList(VTs[0], VTs[1], VTs[2], VTs[3]);
4761 default: break;
4762 }
4763
4764 for (std::vector<SDVTList>::reverse_iterator I = VTList.rbegin(),
4765 E = VTList.rend(); I != E; ++I) {
4766 if (I->NumVTs != NumVTs || VTs[0] != I->VTs[0] || VTs[1] != I->VTs[1])
4767 continue;
4768
4769 if (std::equal(&VTs[2], &VTs[NumVTs], &I->VTs[2]))
4770 return *I;
4771 }
4772
4773 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
4774 std::copy(VTs, VTs+NumVTs, Array);
4775 SDVTList Result = makeVTList(Array, NumVTs);
4776 VTList.push_back(Result);
4777 return Result;
4778 }
4779
4780
4781 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
4782 /// specified operands. If the resultant node already exists in the DAG,
4783 /// this does not modify the specified node, instead it returns the node that
4784 /// already exists. If the resultant node does not exist in the DAG, the
4785 /// input node is returned. As a degenerate case, if you specify the same
4786 /// input operands as the node already has, the input node is returned.
UpdateNodeOperands(SDNode * N,SDValue Op)4787 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op) {
4788 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
4789
4790 // Check to see if there is no change.
4791 if (Op == N->getOperand(0)) return N;
4792
4793 // See if the modified node already exists.
4794 void *InsertPos = 0;
4795 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
4796 return Existing;
4797
4798 // Nope it doesn't. Remove the node from its current place in the maps.
4799 if (InsertPos)
4800 if (!RemoveNodeFromCSEMaps(N))
4801 InsertPos = 0;
4802
4803 // Now we update the operands.
4804 N->OperandList[0].set(Op);
4805
4806 // If this gets put into a CSE map, add it.
4807 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
4808 return N;
4809 }
4810
UpdateNodeOperands(SDNode * N,SDValue Op1,SDValue Op2)4811 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2) {
4812 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
4813
4814 // Check to see if there is no change.
4815 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
4816 return N; // No operands changed, just return the input node.
4817
4818 // See if the modified node already exists.
4819 void *InsertPos = 0;
4820 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
4821 return Existing;
4822
4823 // Nope it doesn't. Remove the node from its current place in the maps.
4824 if (InsertPos)
4825 if (!RemoveNodeFromCSEMaps(N))
4826 InsertPos = 0;
4827
4828 // Now we update the operands.
4829 if (N->OperandList[0] != Op1)
4830 N->OperandList[0].set(Op1);
4831 if (N->OperandList[1] != Op2)
4832 N->OperandList[1].set(Op2);
4833
4834 // If this gets put into a CSE map, add it.
4835 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
4836 return N;
4837 }
4838
4839 SDNode *SelectionDAG::
UpdateNodeOperands(SDNode * N,SDValue Op1,SDValue Op2,SDValue Op3)4840 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, SDValue Op3) {
4841 SDValue Ops[] = { Op1, Op2, Op3 };
4842 return UpdateNodeOperands(N, Ops, 3);
4843 }
4844
4845 SDNode *SelectionDAG::
UpdateNodeOperands(SDNode * N,SDValue Op1,SDValue Op2,SDValue Op3,SDValue Op4)4846 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
4847 SDValue Op3, SDValue Op4) {
4848 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
4849 return UpdateNodeOperands(N, Ops, 4);
4850 }
4851
4852 SDNode *SelectionDAG::
UpdateNodeOperands(SDNode * N,SDValue Op1,SDValue Op2,SDValue Op3,SDValue Op4,SDValue Op5)4853 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2,
4854 SDValue Op3, SDValue Op4, SDValue Op5) {
4855 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
4856 return UpdateNodeOperands(N, Ops, 5);
4857 }
4858
4859 SDNode *SelectionDAG::
UpdateNodeOperands(SDNode * N,const SDValue * Ops,unsigned NumOps)4860 UpdateNodeOperands(SDNode *N, const SDValue *Ops, unsigned NumOps) {
4861 assert(N->getNumOperands() == NumOps &&
4862 "Update with wrong number of operands");
4863
4864 // Check to see if there is no change.
4865 bool AnyChange = false;
4866 for (unsigned i = 0; i != NumOps; ++i) {
4867 if (Ops[i] != N->getOperand(i)) {
4868 AnyChange = true;
4869 break;
4870 }
4871 }
4872
4873 // No operands changed, just return the input node.
4874 if (!AnyChange) return N;
4875
4876 // See if the modified node already exists.
4877 void *InsertPos = 0;
4878 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, NumOps, InsertPos))
4879 return Existing;
4880
4881 // Nope it doesn't. Remove the node from its current place in the maps.
4882 if (InsertPos)
4883 if (!RemoveNodeFromCSEMaps(N))
4884 InsertPos = 0;
4885
4886 // Now we update the operands.
4887 for (unsigned i = 0; i != NumOps; ++i)
4888 if (N->OperandList[i] != Ops[i])
4889 N->OperandList[i].set(Ops[i]);
4890
4891 // If this gets put into a CSE map, add it.
4892 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
4893 return N;
4894 }
4895
4896 /// DropOperands - Release the operands and set this node to have
4897 /// zero operands.
DropOperands()4898 void SDNode::DropOperands() {
4899 // Unlike the code in MorphNodeTo that does this, we don't need to
4900 // watch for dead nodes here.
4901 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
4902 SDUse &Use = *I++;
4903 Use.set(SDValue());
4904 }
4905 }
4906
4907 /// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
4908 /// machine opcode.
4909 ///
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT)4910 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4911 EVT VT) {
4912 SDVTList VTs = getVTList(VT);
4913 return SelectNodeTo(N, MachineOpc, VTs, 0, 0);
4914 }
4915
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT,SDValue Op1)4916 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4917 EVT VT, SDValue Op1) {
4918 SDVTList VTs = getVTList(VT);
4919 SDValue Ops[] = { Op1 };
4920 return SelectNodeTo(N, MachineOpc, VTs, Ops, 1);
4921 }
4922
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT,SDValue Op1,SDValue Op2)4923 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4924 EVT VT, SDValue Op1,
4925 SDValue Op2) {
4926 SDVTList VTs = getVTList(VT);
4927 SDValue Ops[] = { Op1, Op2 };
4928 return SelectNodeTo(N, MachineOpc, VTs, Ops, 2);
4929 }
4930
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT,SDValue Op1,SDValue Op2,SDValue Op3)4931 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4932 EVT VT, SDValue Op1,
4933 SDValue Op2, SDValue Op3) {
4934 SDVTList VTs = getVTList(VT);
4935 SDValue Ops[] = { Op1, Op2, Op3 };
4936 return SelectNodeTo(N, MachineOpc, VTs, Ops, 3);
4937 }
4938
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT,const SDValue * Ops,unsigned NumOps)4939 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4940 EVT VT, const SDValue *Ops,
4941 unsigned NumOps) {
4942 SDVTList VTs = getVTList(VT);
4943 return SelectNodeTo(N, MachineOpc, VTs, Ops, NumOps);
4944 }
4945
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2,const SDValue * Ops,unsigned NumOps)4946 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4947 EVT VT1, EVT VT2, const SDValue *Ops,
4948 unsigned NumOps) {
4949 SDVTList VTs = getVTList(VT1, VT2);
4950 return SelectNodeTo(N, MachineOpc, VTs, Ops, NumOps);
4951 }
4952
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2)4953 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4954 EVT VT1, EVT VT2) {
4955 SDVTList VTs = getVTList(VT1, VT2);
4956 return SelectNodeTo(N, MachineOpc, VTs, (SDValue *)0, 0);
4957 }
4958
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2,EVT VT3,const SDValue * Ops,unsigned NumOps)4959 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4960 EVT VT1, EVT VT2, EVT VT3,
4961 const SDValue *Ops, unsigned NumOps) {
4962 SDVTList VTs = getVTList(VT1, VT2, VT3);
4963 return SelectNodeTo(N, MachineOpc, VTs, Ops, NumOps);
4964 }
4965
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2,EVT VT3,EVT VT4,const SDValue * Ops,unsigned NumOps)4966 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4967 EVT VT1, EVT VT2, EVT VT3, EVT VT4,
4968 const SDValue *Ops, unsigned NumOps) {
4969 SDVTList VTs = getVTList(VT1, VT2, VT3, VT4);
4970 return SelectNodeTo(N, MachineOpc, VTs, Ops, NumOps);
4971 }
4972
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2,SDValue Op1)4973 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4974 EVT VT1, EVT VT2,
4975 SDValue Op1) {
4976 SDVTList VTs = getVTList(VT1, VT2);
4977 SDValue Ops[] = { Op1 };
4978 return SelectNodeTo(N, MachineOpc, VTs, Ops, 1);
4979 }
4980
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2,SDValue Op1,SDValue Op2)4981 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4982 EVT VT1, EVT VT2,
4983 SDValue Op1, SDValue Op2) {
4984 SDVTList VTs = getVTList(VT1, VT2);
4985 SDValue Ops[] = { Op1, Op2 };
4986 return SelectNodeTo(N, MachineOpc, VTs, Ops, 2);
4987 }
4988
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2,SDValue Op1,SDValue Op2,SDValue Op3)4989 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4990 EVT VT1, EVT VT2,
4991 SDValue Op1, SDValue Op2,
4992 SDValue Op3) {
4993 SDVTList VTs = getVTList(VT1, VT2);
4994 SDValue Ops[] = { Op1, Op2, Op3 };
4995 return SelectNodeTo(N, MachineOpc, VTs, Ops, 3);
4996 }
4997
SelectNodeTo(SDNode * N,unsigned MachineOpc,EVT VT1,EVT VT2,EVT VT3,SDValue Op1,SDValue Op2,SDValue Op3)4998 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
4999 EVT VT1, EVT VT2, EVT VT3,
5000 SDValue Op1, SDValue Op2,
5001 SDValue Op3) {
5002 SDVTList VTs = getVTList(VT1, VT2, VT3);
5003 SDValue Ops[] = { Op1, Op2, Op3 };
5004 return SelectNodeTo(N, MachineOpc, VTs, Ops, 3);
5005 }
5006
SelectNodeTo(SDNode * N,unsigned MachineOpc,SDVTList VTs,const SDValue * Ops,unsigned NumOps)5007 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc,
5008 SDVTList VTs, const SDValue *Ops,
5009 unsigned NumOps) {
5010 N = MorphNodeTo(N, ~MachineOpc, VTs, Ops, NumOps);
5011 // Reset the NodeID to -1.
5012 N->setNodeId(-1);
5013 return N;
5014 }
5015
5016 /// UpdadeDebugLocOnMergedSDNode - If the opt level is -O0 then it throws away
5017 /// the line number information on the merged node since it is not possible to
5018 /// preserve the information that operation is associated with multiple lines.
5019 /// This will make the debugger working better at -O0, were there is a higher
5020 /// probability having other instructions associated with that line.
5021 ///
UpdadeDebugLocOnMergedSDNode(SDNode * N,DebugLoc OLoc)5022 SDNode *SelectionDAG::UpdadeDebugLocOnMergedSDNode(SDNode *N, DebugLoc OLoc) {
5023 DebugLoc NLoc = N->getDebugLoc();
5024 if (!(NLoc.isUnknown()) && (OptLevel == CodeGenOpt::None) && (OLoc != NLoc)) {
5025 N->setDebugLoc(DebugLoc());
5026 }
5027 return N;
5028 }
5029
5030 /// MorphNodeTo - This *mutates* the specified node to have the specified
5031 /// return type, opcode, and operands.
5032 ///
5033 /// Note that MorphNodeTo returns the resultant node. If there is already a
5034 /// node of the specified opcode and operands, it returns that node instead of
5035 /// the current one. Note that the DebugLoc need not be the same.
5036 ///
5037 /// Using MorphNodeTo is faster than creating a new node and swapping it in
5038 /// with ReplaceAllUsesWith both because it often avoids allocating a new
5039 /// node, and because it doesn't require CSE recalculation for any of
5040 /// the node's users.
5041 ///
MorphNodeTo(SDNode * N,unsigned Opc,SDVTList VTs,const SDValue * Ops,unsigned NumOps)5042 SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc,
5043 SDVTList VTs, const SDValue *Ops,
5044 unsigned NumOps) {
5045 // If an identical node already exists, use it.
5046 void *IP = 0;
5047 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
5048 FoldingSetNodeID ID;
5049 AddNodeIDNode(ID, Opc, VTs, Ops, NumOps);
5050 if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
5051 return UpdadeDebugLocOnMergedSDNode(ON, N->getDebugLoc());
5052 }
5053
5054 if (!RemoveNodeFromCSEMaps(N))
5055 IP = 0;
5056
5057 // Start the morphing.
5058 N->NodeType = Opc;
5059 N->ValueList = VTs.VTs;
5060 N->NumValues = VTs.NumVTs;
5061
5062 // Clear the operands list, updating used nodes to remove this from their
5063 // use list. Keep track of any operands that become dead as a result.
5064 SmallPtrSet<SDNode*, 16> DeadNodeSet;
5065 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
5066 SDUse &Use = *I++;
5067 SDNode *Used = Use.getNode();
5068 Use.set(SDValue());
5069 if (Used->use_empty())
5070 DeadNodeSet.insert(Used);
5071 }
5072
5073 if (MachineSDNode *MN = dyn_cast<MachineSDNode>(N)) {
5074 // Initialize the memory references information.
5075 MN->setMemRefs(0, 0);
5076 // If NumOps is larger than the # of operands we can have in a
5077 // MachineSDNode, reallocate the operand list.
5078 if (NumOps > MN->NumOperands || !MN->OperandsNeedDelete) {
5079 if (MN->OperandsNeedDelete)
5080 delete[] MN->OperandList;
5081 if (NumOps > array_lengthof(MN->LocalOperands))
5082 // We're creating a final node that will live unmorphed for the
5083 // remainder of the current SelectionDAG iteration, so we can allocate
5084 // the operands directly out of a pool with no recycling metadata.
5085 MN->InitOperands(OperandAllocator.Allocate<SDUse>(NumOps),
5086 Ops, NumOps);
5087 else
5088 MN->InitOperands(MN->LocalOperands, Ops, NumOps);
5089 MN->OperandsNeedDelete = false;
5090 } else
5091 MN->InitOperands(MN->OperandList, Ops, NumOps);
5092 } else {
5093 // If NumOps is larger than the # of operands we currently have, reallocate
5094 // the operand list.
5095 if (NumOps > N->NumOperands) {
5096 if (N->OperandsNeedDelete)
5097 delete[] N->OperandList;
5098 N->InitOperands(new SDUse[NumOps], Ops, NumOps);
5099 N->OperandsNeedDelete = true;
5100 } else
5101 N->InitOperands(N->OperandList, Ops, NumOps);
5102 }
5103
5104 // Delete any nodes that are still dead after adding the uses for the
5105 // new operands.
5106 if (!DeadNodeSet.empty()) {
5107 SmallVector<SDNode *, 16> DeadNodes;
5108 for (SmallPtrSet<SDNode *, 16>::iterator I = DeadNodeSet.begin(),
5109 E = DeadNodeSet.end(); I != E; ++I)
5110 if ((*I)->use_empty())
5111 DeadNodes.push_back(*I);
5112 RemoveDeadNodes(DeadNodes);
5113 }
5114
5115 if (IP)
5116 CSEMap.InsertNode(N, IP); // Memoize the new node.
5117 return N;
5118 }
5119
5120
5121 /// getMachineNode - These are used for target selectors to create a new node
5122 /// with specified return type(s), MachineInstr opcode, and operands.
5123 ///
5124 /// Note that getMachineNode returns the resultant node. If there is already a
5125 /// node of the specified opcode and operands, it returns that node instead of
5126 /// the current one.
5127 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT)5128 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT) {
5129 SDVTList VTs = getVTList(VT);
5130 return getMachineNode(Opcode, dl, VTs, 0, 0);
5131 }
5132
5133 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT,SDValue Op1)5134 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT, SDValue Op1) {
5135 SDVTList VTs = getVTList(VT);
5136 SDValue Ops[] = { Op1 };
5137 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5138 }
5139
5140 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT,SDValue Op1,SDValue Op2)5141 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
5142 SDValue Op1, SDValue Op2) {
5143 SDVTList VTs = getVTList(VT);
5144 SDValue Ops[] = { Op1, Op2 };
5145 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5146 }
5147
5148 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT,SDValue Op1,SDValue Op2,SDValue Op3)5149 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
5150 SDValue Op1, SDValue Op2, SDValue Op3) {
5151 SDVTList VTs = getVTList(VT);
5152 SDValue Ops[] = { Op1, Op2, Op3 };
5153 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5154 }
5155
5156 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT,const SDValue * Ops,unsigned NumOps)5157 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT,
5158 const SDValue *Ops, unsigned NumOps) {
5159 SDVTList VTs = getVTList(VT);
5160 return getMachineNode(Opcode, dl, VTs, Ops, NumOps);
5161 }
5162
5163 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2)5164 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1, EVT VT2) {
5165 SDVTList VTs = getVTList(VT1, VT2);
5166 return getMachineNode(Opcode, dl, VTs, 0, 0);
5167 }
5168
5169 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,SDValue Op1)5170 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5171 EVT VT1, EVT VT2, SDValue Op1) {
5172 SDVTList VTs = getVTList(VT1, VT2);
5173 SDValue Ops[] = { Op1 };
5174 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5175 }
5176
5177 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,SDValue Op1,SDValue Op2)5178 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5179 EVT VT1, EVT VT2, SDValue Op1, SDValue Op2) {
5180 SDVTList VTs = getVTList(VT1, VT2);
5181 SDValue Ops[] = { Op1, Op2 };
5182 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5183 }
5184
5185 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,SDValue Op1,SDValue Op2,SDValue Op3)5186 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5187 EVT VT1, EVT VT2, SDValue Op1,
5188 SDValue Op2, SDValue Op3) {
5189 SDVTList VTs = getVTList(VT1, VT2);
5190 SDValue Ops[] = { Op1, Op2, Op3 };
5191 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5192 }
5193
5194 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,const SDValue * Ops,unsigned NumOps)5195 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5196 EVT VT1, EVT VT2,
5197 const SDValue *Ops, unsigned NumOps) {
5198 SDVTList VTs = getVTList(VT1, VT2);
5199 return getMachineNode(Opcode, dl, VTs, Ops, NumOps);
5200 }
5201
5202 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,EVT VT3,SDValue Op1,SDValue Op2)5203 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5204 EVT VT1, EVT VT2, EVT VT3,
5205 SDValue Op1, SDValue Op2) {
5206 SDVTList VTs = getVTList(VT1, VT2, VT3);
5207 SDValue Ops[] = { Op1, Op2 };
5208 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5209 }
5210
5211 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,EVT VT3,SDValue Op1,SDValue Op2,SDValue Op3)5212 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5213 EVT VT1, EVT VT2, EVT VT3,
5214 SDValue Op1, SDValue Op2, SDValue Op3) {
5215 SDVTList VTs = getVTList(VT1, VT2, VT3);
5216 SDValue Ops[] = { Op1, Op2, Op3 };
5217 return getMachineNode(Opcode, dl, VTs, Ops, array_lengthof(Ops));
5218 }
5219
5220 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,EVT VT3,const SDValue * Ops,unsigned NumOps)5221 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5222 EVT VT1, EVT VT2, EVT VT3,
5223 const SDValue *Ops, unsigned NumOps) {
5224 SDVTList VTs = getVTList(VT1, VT2, VT3);
5225 return getMachineNode(Opcode, dl, VTs, Ops, NumOps);
5226 }
5227
5228 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,EVT VT1,EVT VT2,EVT VT3,EVT VT4,const SDValue * Ops,unsigned NumOps)5229 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl, EVT VT1,
5230 EVT VT2, EVT VT3, EVT VT4,
5231 const SDValue *Ops, unsigned NumOps) {
5232 SDVTList VTs = getVTList(VT1, VT2, VT3, VT4);
5233 return getMachineNode(Opcode, dl, VTs, Ops, NumOps);
5234 }
5235
5236 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc dl,const std::vector<EVT> & ResultTys,const SDValue * Ops,unsigned NumOps)5237 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc dl,
5238 const std::vector<EVT> &ResultTys,
5239 const SDValue *Ops, unsigned NumOps) {
5240 SDVTList VTs = getVTList(&ResultTys[0], ResultTys.size());
5241 return getMachineNode(Opcode, dl, VTs, Ops, NumOps);
5242 }
5243
5244 MachineSDNode *
getMachineNode(unsigned Opcode,DebugLoc DL,SDVTList VTs,const SDValue * Ops,unsigned NumOps)5245 SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
5246 const SDValue *Ops, unsigned NumOps) {
5247 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
5248 MachineSDNode *N;
5249 void *IP = 0;
5250
5251 if (DoCSE) {
5252 FoldingSetNodeID ID;
5253 AddNodeIDNode(ID, ~Opcode, VTs, Ops, NumOps);
5254 IP = 0;
5255 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
5256 return cast<MachineSDNode>(UpdadeDebugLocOnMergedSDNode(E, DL));
5257 }
5258 }
5259
5260 // Allocate a new MachineSDNode.
5261 N = new (NodeAllocator) MachineSDNode(~Opcode, DL, VTs);
5262
5263 // Initialize the operands list.
5264 if (NumOps > array_lengthof(N->LocalOperands))
5265 // We're creating a final node that will live unmorphed for the
5266 // remainder of the current SelectionDAG iteration, so we can allocate
5267 // the operands directly out of a pool with no recycling metadata.
5268 N->InitOperands(OperandAllocator.Allocate<SDUse>(NumOps),
5269 Ops, NumOps);
5270 else
5271 N->InitOperands(N->LocalOperands, Ops, NumOps);
5272 N->OperandsNeedDelete = false;
5273
5274 if (DoCSE)
5275 CSEMap.InsertNode(N, IP);
5276
5277 AllNodes.push_back(N);
5278 #ifndef NDEBUG
5279 VerifyMachineNode(N);
5280 #endif
5281 return N;
5282 }
5283
5284 /// getTargetExtractSubreg - A convenience function for creating
5285 /// TargetOpcode::EXTRACT_SUBREG nodes.
5286 SDValue
getTargetExtractSubreg(int SRIdx,DebugLoc DL,EVT VT,SDValue Operand)5287 SelectionDAG::getTargetExtractSubreg(int SRIdx, DebugLoc DL, EVT VT,
5288 SDValue Operand) {
5289 SDValue SRIdxVal = getTargetConstant(SRIdx, MVT::i32);
5290 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
5291 VT, Operand, SRIdxVal);
5292 return SDValue(Subreg, 0);
5293 }
5294
5295 /// getTargetInsertSubreg - A convenience function for creating
5296 /// TargetOpcode::INSERT_SUBREG nodes.
5297 SDValue
getTargetInsertSubreg(int SRIdx,DebugLoc DL,EVT VT,SDValue Operand,SDValue Subreg)5298 SelectionDAG::getTargetInsertSubreg(int SRIdx, DebugLoc DL, EVT VT,
5299 SDValue Operand, SDValue Subreg) {
5300 SDValue SRIdxVal = getTargetConstant(SRIdx, MVT::i32);
5301 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
5302 VT, Operand, Subreg, SRIdxVal);
5303 return SDValue(Result, 0);
5304 }
5305
5306 /// getNodeIfExists - Get the specified node if it's already available, or
5307 /// else return NULL.
getNodeIfExists(unsigned Opcode,SDVTList VTList,const SDValue * Ops,unsigned NumOps)5308 SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList,
5309 const SDValue *Ops, unsigned NumOps) {
5310 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
5311 FoldingSetNodeID ID;
5312 AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);
5313 void *IP = 0;
5314 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
5315 return E;
5316 }
5317 return NULL;
5318 }
5319
5320 /// getDbgValue - Creates a SDDbgValue node.
5321 ///
5322 SDDbgValue *
getDbgValue(MDNode * MDPtr,SDNode * N,unsigned R,uint64_t Off,DebugLoc DL,unsigned O)5323 SelectionDAG::getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R, uint64_t Off,
5324 DebugLoc DL, unsigned O) {
5325 return new (Allocator) SDDbgValue(MDPtr, N, R, Off, DL, O);
5326 }
5327
5328 SDDbgValue *
getDbgValue(MDNode * MDPtr,const Value * C,uint64_t Off,DebugLoc DL,unsigned O)5329 SelectionDAG::getDbgValue(MDNode *MDPtr, const Value *C, uint64_t Off,
5330 DebugLoc DL, unsigned O) {
5331 return new (Allocator) SDDbgValue(MDPtr, C, Off, DL, O);
5332 }
5333
5334 SDDbgValue *
getDbgValue(MDNode * MDPtr,unsigned FI,uint64_t Off,DebugLoc DL,unsigned O)5335 SelectionDAG::getDbgValue(MDNode *MDPtr, unsigned FI, uint64_t Off,
5336 DebugLoc DL, unsigned O) {
5337 return new (Allocator) SDDbgValue(MDPtr, FI, Off, DL, O);
5338 }
5339
5340 namespace {
5341
5342 /// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
5343 /// pointed to by a use iterator is deleted, increment the use iterator
5344 /// so that it doesn't dangle.
5345 ///
5346 class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
5347 SDNode::use_iterator &UI;
5348 SDNode::use_iterator &UE;
5349
NodeDeleted(SDNode * N,SDNode * E)5350 virtual void NodeDeleted(SDNode *N, SDNode *E) {
5351 // Increment the iterator as needed.
5352 while (UI != UE && N == *UI)
5353 ++UI;
5354 }
5355
5356 public:
RAUWUpdateListener(SelectionDAG & d,SDNode::use_iterator & ui,SDNode::use_iterator & ue)5357 RAUWUpdateListener(SelectionDAG &d,
5358 SDNode::use_iterator &ui,
5359 SDNode::use_iterator &ue)
5360 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
5361 };
5362
5363 }
5364
5365 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
5366 /// This can cause recursive merging of nodes in the DAG.
5367 ///
5368 /// This version assumes From has a single result value.
5369 ///
ReplaceAllUsesWith(SDValue FromN,SDValue To)5370 void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) {
5371 SDNode *From = FromN.getNode();
5372 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
5373 "Cannot replace with this method!");
5374 assert(From != To.getNode() && "Cannot replace uses of with self");
5375
5376 // Iterate over all the existing uses of From. New uses will be added
5377 // to the beginning of the use list, which we avoid visiting.
5378 // This specifically avoids visiting uses of From that arise while the
5379 // replacement is happening, because any such uses would be the result
5380 // of CSE: If an existing node looks like From after one of its operands
5381 // is replaced by To, we don't want to replace of all its users with To
5382 // too. See PR3018 for more info.
5383 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
5384 RAUWUpdateListener Listener(*this, UI, UE);
5385 while (UI != UE) {
5386 SDNode *User = *UI;
5387
5388 // This node is about to morph, remove its old self from the CSE maps.
5389 RemoveNodeFromCSEMaps(User);
5390
5391 // A user can appear in a use list multiple times, and when this
5392 // happens the uses are usually next to each other in the list.
5393 // To help reduce the number of CSE recomputations, process all
5394 // the uses of this user that we can find this way.
5395 do {
5396 SDUse &Use = UI.getUse();
5397 ++UI;
5398 Use.set(To);
5399 } while (UI != UE && *UI == User);
5400
5401 // Now that we have modified User, add it back to the CSE maps. If it
5402 // already exists there, recursively merge the results together.
5403 AddModifiedNodeToCSEMaps(User);
5404 }
5405
5406 // If we just RAUW'd the root, take note.
5407 if (FromN == getRoot())
5408 setRoot(To);
5409 }
5410
5411 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
5412 /// This can cause recursive merging of nodes in the DAG.
5413 ///
5414 /// This version assumes that for each value of From, there is a
5415 /// corresponding value in To in the same position with the same type.
5416 ///
ReplaceAllUsesWith(SDNode * From,SDNode * To)5417 void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To) {
5418 #ifndef NDEBUG
5419 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
5420 assert((!From->hasAnyUseOfValue(i) ||
5421 From->getValueType(i) == To->getValueType(i)) &&
5422 "Cannot use this version of ReplaceAllUsesWith!");
5423 #endif
5424
5425 // Handle the trivial case.
5426 if (From == To)
5427 return;
5428
5429 // Iterate over just the existing users of From. See the comments in
5430 // the ReplaceAllUsesWith above.
5431 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
5432 RAUWUpdateListener Listener(*this, UI, UE);
5433 while (UI != UE) {
5434 SDNode *User = *UI;
5435
5436 // This node is about to morph, remove its old self from the CSE maps.
5437 RemoveNodeFromCSEMaps(User);
5438
5439 // A user can appear in a use list multiple times, and when this
5440 // happens the uses are usually next to each other in the list.
5441 // To help reduce the number of CSE recomputations, process all
5442 // the uses of this user that we can find this way.
5443 do {
5444 SDUse &Use = UI.getUse();
5445 ++UI;
5446 Use.setNode(To);
5447 } while (UI != UE && *UI == User);
5448
5449 // Now that we have modified User, add it back to the CSE maps. If it
5450 // already exists there, recursively merge the results together.
5451 AddModifiedNodeToCSEMaps(User);
5452 }
5453
5454 // If we just RAUW'd the root, take note.
5455 if (From == getRoot().getNode())
5456 setRoot(SDValue(To, getRoot().getResNo()));
5457 }
5458
5459 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
5460 /// This can cause recursive merging of nodes in the DAG.
5461 ///
5462 /// This version can replace From with any result values. To must match the
5463 /// number and types of values returned by From.
ReplaceAllUsesWith(SDNode * From,const SDValue * To)5464 void SelectionDAG::ReplaceAllUsesWith(SDNode *From, const SDValue *To) {
5465 if (From->getNumValues() == 1) // Handle the simple case efficiently.
5466 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
5467
5468 // Iterate over just the existing users of From. See the comments in
5469 // the ReplaceAllUsesWith above.
5470 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
5471 RAUWUpdateListener Listener(*this, UI, UE);
5472 while (UI != UE) {
5473 SDNode *User = *UI;
5474
5475 // This node is about to morph, remove its old self from the CSE maps.
5476 RemoveNodeFromCSEMaps(User);
5477
5478 // A user can appear in a use list multiple times, and when this
5479 // happens the uses are usually next to each other in the list.
5480 // To help reduce the number of CSE recomputations, process all
5481 // the uses of this user that we can find this way.
5482 do {
5483 SDUse &Use = UI.getUse();
5484 const SDValue &ToOp = To[Use.getResNo()];
5485 ++UI;
5486 Use.set(ToOp);
5487 } while (UI != UE && *UI == User);
5488
5489 // Now that we have modified User, add it back to the CSE maps. If it
5490 // already exists there, recursively merge the results together.
5491 AddModifiedNodeToCSEMaps(User);
5492 }
5493
5494 // If we just RAUW'd the root, take note.
5495 if (From == getRoot().getNode())
5496 setRoot(SDValue(To[getRoot().getResNo()]));
5497 }
5498
5499 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
5500 /// uses of other values produced by From.getNode() alone. The Deleted
5501 /// vector is handled the same way as for ReplaceAllUsesWith.
ReplaceAllUsesOfValueWith(SDValue From,SDValue To)5502 void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){
5503 // Handle the really simple, really trivial case efficiently.
5504 if (From == To) return;
5505
5506 // Handle the simple, trivial, case efficiently.
5507 if (From.getNode()->getNumValues() == 1) {
5508 ReplaceAllUsesWith(From, To);
5509 return;
5510 }
5511
5512 // Iterate over just the existing users of From. See the comments in
5513 // the ReplaceAllUsesWith above.
5514 SDNode::use_iterator UI = From.getNode()->use_begin(),
5515 UE = From.getNode()->use_end();
5516 RAUWUpdateListener Listener(*this, UI, UE);
5517 while (UI != UE) {
5518 SDNode *User = *UI;
5519 bool UserRemovedFromCSEMaps = false;
5520
5521 // A user can appear in a use list multiple times, and when this
5522 // happens the uses are usually next to each other in the list.
5523 // To help reduce the number of CSE recomputations, process all
5524 // the uses of this user that we can find this way.
5525 do {
5526 SDUse &Use = UI.getUse();
5527
5528 // Skip uses of different values from the same node.
5529 if (Use.getResNo() != From.getResNo()) {
5530 ++UI;
5531 continue;
5532 }
5533
5534 // If this node hasn't been modified yet, it's still in the CSE maps,
5535 // so remove its old self from the CSE maps.
5536 if (!UserRemovedFromCSEMaps) {
5537 RemoveNodeFromCSEMaps(User);
5538 UserRemovedFromCSEMaps = true;
5539 }
5540
5541 ++UI;
5542 Use.set(To);
5543 } while (UI != UE && *UI == User);
5544
5545 // We are iterating over all uses of the From node, so if a use
5546 // doesn't use the specific value, no changes are made.
5547 if (!UserRemovedFromCSEMaps)
5548 continue;
5549
5550 // Now that we have modified User, add it back to the CSE maps. If it
5551 // already exists there, recursively merge the results together.
5552 AddModifiedNodeToCSEMaps(User);
5553 }
5554
5555 // If we just RAUW'd the root, take note.
5556 if (From == getRoot())
5557 setRoot(To);
5558 }
5559
5560 namespace {
5561 /// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
5562 /// to record information about a use.
5563 struct UseMemo {
5564 SDNode *User;
5565 unsigned Index;
5566 SDUse *Use;
5567 };
5568
5569 /// operator< - Sort Memos by User.
operator <(const UseMemo & L,const UseMemo & R)5570 bool operator<(const UseMemo &L, const UseMemo &R) {
5571 return (intptr_t)L.User < (intptr_t)R.User;
5572 }
5573 }
5574
5575 /// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
5576 /// uses of other values produced by From.getNode() alone. The same value
5577 /// may appear in both the From and To list. The Deleted vector is
5578 /// handled the same way as for ReplaceAllUsesWith.
ReplaceAllUsesOfValuesWith(const SDValue * From,const SDValue * To,unsigned Num)5579 void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From,
5580 const SDValue *To,
5581 unsigned Num){
5582 // Handle the simple, trivial case efficiently.
5583 if (Num == 1)
5584 return ReplaceAllUsesOfValueWith(*From, *To);
5585
5586 // Read up all the uses and make records of them. This helps
5587 // processing new uses that are introduced during the
5588 // replacement process.
5589 SmallVector<UseMemo, 4> Uses;
5590 for (unsigned i = 0; i != Num; ++i) {
5591 unsigned FromResNo = From[i].getResNo();
5592 SDNode *FromNode = From[i].getNode();
5593 for (SDNode::use_iterator UI = FromNode->use_begin(),
5594 E = FromNode->use_end(); UI != E; ++UI) {
5595 SDUse &Use = UI.getUse();
5596 if (Use.getResNo() == FromResNo) {
5597 UseMemo Memo = { *UI, i, &Use };
5598 Uses.push_back(Memo);
5599 }
5600 }
5601 }
5602
5603 // Sort the uses, so that all the uses from a given User are together.
5604 std::sort(Uses.begin(), Uses.end());
5605
5606 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
5607 UseIndex != UseIndexEnd; ) {
5608 // We know that this user uses some value of From. If it is the right
5609 // value, update it.
5610 SDNode *User = Uses[UseIndex].User;
5611
5612 // This node is about to morph, remove its old self from the CSE maps.
5613 RemoveNodeFromCSEMaps(User);
5614
5615 // The Uses array is sorted, so all the uses for a given User
5616 // are next to each other in the list.
5617 // To help reduce the number of CSE recomputations, process all
5618 // the uses of this user that we can find this way.
5619 do {
5620 unsigned i = Uses[UseIndex].Index;
5621 SDUse &Use = *Uses[UseIndex].Use;
5622 ++UseIndex;
5623
5624 Use.set(To[i]);
5625 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
5626
5627 // Now that we have modified User, add it back to the CSE maps. If it
5628 // already exists there, recursively merge the results together.
5629 AddModifiedNodeToCSEMaps(User);
5630 }
5631 }
5632
5633 /// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
5634 /// based on their topological order. It returns the maximum id and a vector
5635 /// of the SDNodes* in assigned order by reference.
AssignTopologicalOrder()5636 unsigned SelectionDAG::AssignTopologicalOrder() {
5637
5638 unsigned DAGSize = 0;
5639
5640 // SortedPos tracks the progress of the algorithm. Nodes before it are
5641 // sorted, nodes after it are unsorted. When the algorithm completes
5642 // it is at the end of the list.
5643 allnodes_iterator SortedPos = allnodes_begin();
5644
5645 // Visit all the nodes. Move nodes with no operands to the front of
5646 // the list immediately. Annotate nodes that do have operands with their
5647 // operand count. Before we do this, the Node Id fields of the nodes
5648 // may contain arbitrary values. After, the Node Id fields for nodes
5649 // before SortedPos will contain the topological sort index, and the
5650 // Node Id fields for nodes At SortedPos and after will contain the
5651 // count of outstanding operands.
5652 for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ) {
5653 SDNode *N = I++;
5654 checkForCycles(N);
5655 unsigned Degree = N->getNumOperands();
5656 if (Degree == 0) {
5657 // A node with no uses, add it to the result array immediately.
5658 N->setNodeId(DAGSize++);
5659 allnodes_iterator Q = N;
5660 if (Q != SortedPos)
5661 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
5662 assert(SortedPos != AllNodes.end() && "Overran node list");
5663 ++SortedPos;
5664 } else {
5665 // Temporarily use the Node Id as scratch space for the degree count.
5666 N->setNodeId(Degree);
5667 }
5668 }
5669
5670 // Visit all the nodes. As we iterate, move nodes into sorted order,
5671 // such that by the time the end is reached all nodes will be sorted.
5672 for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ++I) {
5673 SDNode *N = I;
5674 checkForCycles(N);
5675 // N is in sorted position, so all its uses have one less operand
5676 // that needs to be sorted.
5677 for (SDNode::use_iterator UI = N->use_begin(), UE = N->use_end();
5678 UI != UE; ++UI) {
5679 SDNode *P = *UI;
5680 unsigned Degree = P->getNodeId();
5681 assert(Degree != 0 && "Invalid node degree");
5682 --Degree;
5683 if (Degree == 0) {
5684 // All of P's operands are sorted, so P may sorted now.
5685 P->setNodeId(DAGSize++);
5686 if (P != SortedPos)
5687 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
5688 assert(SortedPos != AllNodes.end() && "Overran node list");
5689 ++SortedPos;
5690 } else {
5691 // Update P's outstanding operand count.
5692 P->setNodeId(Degree);
5693 }
5694 }
5695 if (I == SortedPos) {
5696 #ifndef NDEBUG
5697 SDNode *S = ++I;
5698 dbgs() << "Overran sorted position:\n";
5699 S->dumprFull();
5700 #endif
5701 llvm_unreachable(0);
5702 }
5703 }
5704
5705 assert(SortedPos == AllNodes.end() &&
5706 "Topological sort incomplete!");
5707 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
5708 "First node in topological sort is not the entry token!");
5709 assert(AllNodes.front().getNodeId() == 0 &&
5710 "First node in topological sort has non-zero id!");
5711 assert(AllNodes.front().getNumOperands() == 0 &&
5712 "First node in topological sort has operands!");
5713 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
5714 "Last node in topologic sort has unexpected id!");
5715 assert(AllNodes.back().use_empty() &&
5716 "Last node in topologic sort has users!");
5717 assert(DAGSize == allnodes_size() && "Node count mismatch!");
5718 return DAGSize;
5719 }
5720
5721 /// AssignOrdering - Assign an order to the SDNode.
AssignOrdering(const SDNode * SD,unsigned Order)5722 void SelectionDAG::AssignOrdering(const SDNode *SD, unsigned Order) {
5723 assert(SD && "Trying to assign an order to a null node!");
5724 Ordering->add(SD, Order);
5725 }
5726
5727 /// GetOrdering - Get the order for the SDNode.
GetOrdering(const SDNode * SD) const5728 unsigned SelectionDAG::GetOrdering(const SDNode *SD) const {
5729 assert(SD && "Trying to get the order of a null node!");
5730 return Ordering->getOrder(SD);
5731 }
5732
5733 /// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
5734 /// value is produced by SD.
AddDbgValue(SDDbgValue * DB,SDNode * SD,bool isParameter)5735 void SelectionDAG::AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter) {
5736 DbgInfo->add(DB, SD, isParameter);
5737 if (SD)
5738 SD->setHasDebugValue(true);
5739 }
5740
5741 /// TransferDbgValues - Transfer SDDbgValues.
TransferDbgValues(SDValue From,SDValue To)5742 void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) {
5743 if (From == To || !From.getNode()->getHasDebugValue())
5744 return;
5745 SDNode *FromNode = From.getNode();
5746 SDNode *ToNode = To.getNode();
5747 ArrayRef<SDDbgValue *> DVs = GetDbgValues(FromNode);
5748 SmallVector<SDDbgValue *, 2> ClonedDVs;
5749 for (ArrayRef<SDDbgValue *>::iterator I = DVs.begin(), E = DVs.end();
5750 I != E; ++I) {
5751 SDDbgValue *Dbg = *I;
5752 if (Dbg->getKind() == SDDbgValue::SDNODE) {
5753 SDDbgValue *Clone = getDbgValue(Dbg->getMDPtr(), ToNode, To.getResNo(),
5754 Dbg->getOffset(), Dbg->getDebugLoc(),
5755 Dbg->getOrder());
5756 ClonedDVs.push_back(Clone);
5757 }
5758 }
5759 for (SmallVector<SDDbgValue *, 2>::iterator I = ClonedDVs.begin(),
5760 E = ClonedDVs.end(); I != E; ++I)
5761 AddDbgValue(*I, ToNode, false);
5762 }
5763
5764 //===----------------------------------------------------------------------===//
5765 // SDNode Class
5766 //===----------------------------------------------------------------------===//
5767
~HandleSDNode()5768 HandleSDNode::~HandleSDNode() {
5769 DropOperands();
5770 }
5771
GlobalAddressSDNode(unsigned Opc,DebugLoc DL,const GlobalValue * GA,EVT VT,int64_t o,unsigned char TF)5772 GlobalAddressSDNode::GlobalAddressSDNode(unsigned Opc, DebugLoc DL,
5773 const GlobalValue *GA,
5774 EVT VT, int64_t o, unsigned char TF)
5775 : SDNode(Opc, DL, getSDVTList(VT)), Offset(o), TargetFlags(TF) {
5776 TheGlobal = GA;
5777 }
5778
MemSDNode(unsigned Opc,DebugLoc dl,SDVTList VTs,EVT memvt,MachineMemOperand * mmo)5779 MemSDNode::MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, EVT memvt,
5780 MachineMemOperand *mmo)
5781 : SDNode(Opc, dl, VTs), MemoryVT(memvt), MMO(mmo) {
5782 SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(),
5783 MMO->isNonTemporal(), MMO->isInvariant());
5784 assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!");
5785 assert(isNonTemporal() == MMO->isNonTemporal() &&
5786 "Non-temporal encoding error!");
5787 assert(memvt.getStoreSize() == MMO->getSize() && "Size mismatch!");
5788 }
5789
MemSDNode(unsigned Opc,DebugLoc dl,SDVTList VTs,const SDValue * Ops,unsigned NumOps,EVT memvt,MachineMemOperand * mmo)5790 MemSDNode::MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs,
5791 const SDValue *Ops, unsigned NumOps, EVT memvt,
5792 MachineMemOperand *mmo)
5793 : SDNode(Opc, dl, VTs, Ops, NumOps),
5794 MemoryVT(memvt), MMO(mmo) {
5795 SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(),
5796 MMO->isNonTemporal(), MMO->isInvariant());
5797 assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!");
5798 assert(memvt.getStoreSize() == MMO->getSize() && "Size mismatch!");
5799 }
5800
5801 /// Profile - Gather unique data for the node.
5802 ///
Profile(FoldingSetNodeID & ID) const5803 void SDNode::Profile(FoldingSetNodeID &ID) const {
5804 AddNodeIDNode(ID, this);
5805 }
5806
5807 namespace {
5808 struct EVTArray {
5809 std::vector<EVT> VTs;
5810
EVTArray__anon7f30170f0311::EVTArray5811 EVTArray() {
5812 VTs.reserve(MVT::LAST_VALUETYPE);
5813 for (unsigned i = 0; i < MVT::LAST_VALUETYPE; ++i)
5814 VTs.push_back(MVT((MVT::SimpleValueType)i));
5815 }
5816 };
5817 }
5818
5819 static ManagedStatic<std::set<EVT, EVT::compareRawBits> > EVTs;
5820 static ManagedStatic<EVTArray> SimpleVTArray;
5821 static ManagedStatic<sys::SmartMutex<true> > VTMutex;
5822
5823 /// getValueTypeList - Return a pointer to the specified value type.
5824 ///
getValueTypeList(EVT VT)5825 const EVT *SDNode::getValueTypeList(EVT VT) {
5826 if (VT.isExtended()) {
5827 sys::SmartScopedLock<true> Lock(*VTMutex);
5828 return &(*EVTs->insert(VT).first);
5829 } else {
5830 assert(VT.getSimpleVT() < MVT::LAST_VALUETYPE &&
5831 "Value type out of range!");
5832 return &SimpleVTArray->VTs[VT.getSimpleVT().SimpleTy];
5833 }
5834 }
5835
5836 /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
5837 /// indicated value. This method ignores uses of other values defined by this
5838 /// operation.
hasNUsesOfValue(unsigned NUses,unsigned Value) const5839 bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const {
5840 assert(Value < getNumValues() && "Bad value!");
5841
5842 // TODO: Only iterate over uses of a given value of the node
5843 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) {
5844 if (UI.getUse().getResNo() == Value) {
5845 if (NUses == 0)
5846 return false;
5847 --NUses;
5848 }
5849 }
5850
5851 // Found exactly the right number of uses?
5852 return NUses == 0;
5853 }
5854
5855
5856 /// hasAnyUseOfValue - Return true if there are any use of the indicated
5857 /// value. This method ignores uses of other values defined by this operation.
hasAnyUseOfValue(unsigned Value) const5858 bool SDNode::hasAnyUseOfValue(unsigned Value) const {
5859 assert(Value < getNumValues() && "Bad value!");
5860
5861 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI)
5862 if (UI.getUse().getResNo() == Value)
5863 return true;
5864
5865 return false;
5866 }
5867
5868
5869 /// isOnlyUserOf - Return true if this node is the only use of N.
5870 ///
isOnlyUserOf(SDNode * N) const5871 bool SDNode::isOnlyUserOf(SDNode *N) const {
5872 bool Seen = false;
5873 for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) {
5874 SDNode *User = *I;
5875 if (User == this)
5876 Seen = true;
5877 else
5878 return false;
5879 }
5880
5881 return Seen;
5882 }
5883
5884 /// isOperand - Return true if this node is an operand of N.
5885 ///
isOperandOf(SDNode * N) const5886 bool SDValue::isOperandOf(SDNode *N) const {
5887 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
5888 if (*this == N->getOperand(i))
5889 return true;
5890 return false;
5891 }
5892
isOperandOf(SDNode * N) const5893 bool SDNode::isOperandOf(SDNode *N) const {
5894 for (unsigned i = 0, e = N->NumOperands; i != e; ++i)
5895 if (this == N->OperandList[i].getNode())
5896 return true;
5897 return false;
5898 }
5899
5900 /// reachesChainWithoutSideEffects - Return true if this operand (which must
5901 /// be a chain) reaches the specified operand without crossing any
5902 /// side-effecting instructions on any chain path. In practice, this looks
5903 /// through token factors and non-volatile loads. In order to remain efficient,
5904 /// this only looks a couple of nodes in, it does not do an exhaustive search.
reachesChainWithoutSideEffects(SDValue Dest,unsigned Depth) const5905 bool SDValue::reachesChainWithoutSideEffects(SDValue Dest,
5906 unsigned Depth) const {
5907 if (*this == Dest) return true;
5908
5909 // Don't search too deeply, we just want to be able to see through
5910 // TokenFactor's etc.
5911 if (Depth == 0) return false;
5912
5913 // If this is a token factor, all inputs to the TF happen in parallel. If any
5914 // of the operands of the TF does not reach dest, then we cannot do the xform.
5915 if (getOpcode() == ISD::TokenFactor) {
5916 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
5917 if (!getOperand(i).reachesChainWithoutSideEffects(Dest, Depth-1))
5918 return false;
5919 return true;
5920 }
5921
5922 // Loads don't have side effects, look through them.
5923 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
5924 if (!Ld->isVolatile())
5925 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
5926 }
5927 return false;
5928 }
5929
5930 /// hasPredecessor - Return true if N is a predecessor of this node.
5931 /// N is either an operand of this node, or can be reached by recursively
5932 /// traversing up the operands.
5933 /// NOTE: This is an expensive method. Use it carefully.
hasPredecessor(const SDNode * N) const5934 bool SDNode::hasPredecessor(const SDNode *N) const {
5935 SmallPtrSet<const SDNode *, 32> Visited;
5936 SmallVector<const SDNode *, 16> Worklist;
5937 return hasPredecessorHelper(N, Visited, Worklist);
5938 }
5939
hasPredecessorHelper(const SDNode * N,SmallPtrSet<const SDNode *,32> & Visited,SmallVector<const SDNode *,16> & Worklist) const5940 bool SDNode::hasPredecessorHelper(const SDNode *N,
5941 SmallPtrSet<const SDNode *, 32> &Visited,
5942 SmallVector<const SDNode *, 16> &Worklist) const {
5943 if (Visited.empty()) {
5944 Worklist.push_back(this);
5945 } else {
5946 // Take a look in the visited set. If we've already encountered this node
5947 // we needn't search further.
5948 if (Visited.count(N))
5949 return true;
5950 }
5951
5952 // Haven't visited N yet. Continue the search.
5953 while (!Worklist.empty()) {
5954 const SDNode *M = Worklist.pop_back_val();
5955 for (unsigned i = 0, e = M->getNumOperands(); i != e; ++i) {
5956 SDNode *Op = M->getOperand(i).getNode();
5957 if (Visited.insert(Op))
5958 Worklist.push_back(Op);
5959 if (Op == N)
5960 return true;
5961 }
5962 }
5963
5964 return false;
5965 }
5966
getConstantOperandVal(unsigned Num) const5967 uint64_t SDNode::getConstantOperandVal(unsigned Num) const {
5968 assert(Num < NumOperands && "Invalid child # of SDNode!");
5969 return cast<ConstantSDNode>(OperandList[Num])->getZExtValue();
5970 }
5971
UnrollVectorOp(SDNode * N,unsigned ResNE)5972 SDValue SelectionDAG::UnrollVectorOp(SDNode *N, unsigned ResNE) {
5973 assert(N->getNumValues() == 1 &&
5974 "Can't unroll a vector with multiple results!");
5975
5976 EVT VT = N->getValueType(0);
5977 unsigned NE = VT.getVectorNumElements();
5978 EVT EltVT = VT.getVectorElementType();
5979 DebugLoc dl = N->getDebugLoc();
5980
5981 SmallVector<SDValue, 8> Scalars;
5982 SmallVector<SDValue, 4> Operands(N->getNumOperands());
5983
5984 // If ResNE is 0, fully unroll the vector op.
5985 if (ResNE == 0)
5986 ResNE = NE;
5987 else if (NE > ResNE)
5988 NE = ResNE;
5989
5990 unsigned i;
5991 for (i= 0; i != NE; ++i) {
5992 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
5993 SDValue Operand = N->getOperand(j);
5994 EVT OperandVT = Operand.getValueType();
5995 if (OperandVT.isVector()) {
5996 // A vector operand; extract a single element.
5997 EVT OperandEltVT = OperandVT.getVectorElementType();
5998 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl,
5999 OperandEltVT,
6000 Operand,
6001 getConstant(i, TLI.getPointerTy()));
6002 } else {
6003 // A scalar operand; just use it as is.
6004 Operands[j] = Operand;
6005 }
6006 }
6007
6008 switch (N->getOpcode()) {
6009 default:
6010 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
6011 &Operands[0], Operands.size()));
6012 break;
6013 case ISD::VSELECT:
6014 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT,
6015 &Operands[0], Operands.size()));
6016 break;
6017 case ISD::SHL:
6018 case ISD::SRA:
6019 case ISD::SRL:
6020 case ISD::ROTL:
6021 case ISD::ROTR:
6022 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
6023 getShiftAmountOperand(Operands[0].getValueType(),
6024 Operands[1])));
6025 break;
6026 case ISD::SIGN_EXTEND_INREG:
6027 case ISD::FP_ROUND_INREG: {
6028 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
6029 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
6030 Operands[0],
6031 getValueType(ExtVT)));
6032 }
6033 }
6034 }
6035
6036 for (; i < ResNE; ++i)
6037 Scalars.push_back(getUNDEF(EltVT));
6038
6039 return getNode(ISD::BUILD_VECTOR, dl,
6040 EVT::getVectorVT(*getContext(), EltVT, ResNE),
6041 &Scalars[0], Scalars.size());
6042 }
6043
6044
6045 /// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a
6046 /// location that is 'Dist' units away from the location that the 'Base' load
6047 /// is loading from.
isConsecutiveLoad(LoadSDNode * LD,LoadSDNode * Base,unsigned Bytes,int Dist) const6048 bool SelectionDAG::isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base,
6049 unsigned Bytes, int Dist) const {
6050 if (LD->getChain() != Base->getChain())
6051 return false;
6052 EVT VT = LD->getValueType(0);
6053 if (VT.getSizeInBits() / 8 != Bytes)
6054 return false;
6055
6056 SDValue Loc = LD->getOperand(1);
6057 SDValue BaseLoc = Base->getOperand(1);
6058 if (Loc.getOpcode() == ISD::FrameIndex) {
6059 if (BaseLoc.getOpcode() != ISD::FrameIndex)
6060 return false;
6061 const MachineFrameInfo *MFI = getMachineFunction().getFrameInfo();
6062 int FI = cast<FrameIndexSDNode>(Loc)->getIndex();
6063 int BFI = cast<FrameIndexSDNode>(BaseLoc)->getIndex();
6064 int FS = MFI->getObjectSize(FI);
6065 int BFS = MFI->getObjectSize(BFI);
6066 if (FS != BFS || FS != (int)Bytes) return false;
6067 return MFI->getObjectOffset(FI) == (MFI->getObjectOffset(BFI) + Dist*Bytes);
6068 }
6069
6070 // Handle X+C
6071 if (isBaseWithConstantOffset(Loc) && Loc.getOperand(0) == BaseLoc &&
6072 cast<ConstantSDNode>(Loc.getOperand(1))->getSExtValue() == Dist*Bytes)
6073 return true;
6074
6075 const GlobalValue *GV1 = NULL;
6076 const GlobalValue *GV2 = NULL;
6077 int64_t Offset1 = 0;
6078 int64_t Offset2 = 0;
6079 bool isGA1 = TLI.isGAPlusOffset(Loc.getNode(), GV1, Offset1);
6080 bool isGA2 = TLI.isGAPlusOffset(BaseLoc.getNode(), GV2, Offset2);
6081 if (isGA1 && isGA2 && GV1 == GV2)
6082 return Offset1 == (Offset2 + Dist*Bytes);
6083 return false;
6084 }
6085
6086
6087 /// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if
6088 /// it cannot be inferred.
InferPtrAlignment(SDValue Ptr) const6089 unsigned SelectionDAG::InferPtrAlignment(SDValue Ptr) const {
6090 // If this is a GlobalAddress + cst, return the alignment.
6091 const GlobalValue *GV;
6092 int64_t GVOffset = 0;
6093 if (TLI.isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
6094 unsigned PtrWidth = TLI.getPointerTy().getSizeInBits();
6095 APInt KnownZero(PtrWidth, 0), KnownOne(PtrWidth, 0);
6096 llvm::ComputeMaskedBits(const_cast<GlobalValue*>(GV), KnownZero, KnownOne,
6097 TLI.getTargetData());
6098 unsigned AlignBits = KnownZero.countTrailingOnes();
6099 unsigned Align = AlignBits ? 1 << std::min(31U, AlignBits) : 0;
6100 if (Align)
6101 return MinAlign(Align, GVOffset);
6102 }
6103
6104 // If this is a direct reference to a stack slot, use information about the
6105 // stack slot's alignment.
6106 int FrameIdx = 1 << 31;
6107 int64_t FrameOffset = 0;
6108 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) {
6109 FrameIdx = FI->getIndex();
6110 } else if (isBaseWithConstantOffset(Ptr) &&
6111 isa<FrameIndexSDNode>(Ptr.getOperand(0))) {
6112 // Handle FI+Cst
6113 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
6114 FrameOffset = Ptr.getConstantOperandVal(1);
6115 }
6116
6117 if (FrameIdx != (1 << 31)) {
6118 const MachineFrameInfo &MFI = *getMachineFunction().getFrameInfo();
6119 unsigned FIInfoAlign = MinAlign(MFI.getObjectAlignment(FrameIdx),
6120 FrameOffset);
6121 return FIInfoAlign;
6122 }
6123
6124 return 0;
6125 }
6126
6127 // getAddressSpace - Return the address space this GlobalAddress belongs to.
getAddressSpace() const6128 unsigned GlobalAddressSDNode::getAddressSpace() const {
6129 return getGlobal()->getType()->getAddressSpace();
6130 }
6131
6132
getType() const6133 Type *ConstantPoolSDNode::getType() const {
6134 if (isMachineConstantPoolEntry())
6135 return Val.MachineCPVal->getType();
6136 return Val.ConstVal->getType();
6137 }
6138
isConstantSplat(APInt & SplatValue,APInt & SplatUndef,unsigned & SplatBitSize,bool & HasAnyUndefs,unsigned MinSplatBits,bool isBigEndian)6139 bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue,
6140 APInt &SplatUndef,
6141 unsigned &SplatBitSize,
6142 bool &HasAnyUndefs,
6143 unsigned MinSplatBits,
6144 bool isBigEndian) {
6145 EVT VT = getValueType(0);
6146 assert(VT.isVector() && "Expected a vector type");
6147 unsigned sz = VT.getSizeInBits();
6148 if (MinSplatBits > sz)
6149 return false;
6150
6151 SplatValue = APInt(sz, 0);
6152 SplatUndef = APInt(sz, 0);
6153
6154 // Get the bits. Bits with undefined values (when the corresponding element
6155 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
6156 // in SplatValue. If any of the values are not constant, give up and return
6157 // false.
6158 unsigned int nOps = getNumOperands();
6159 assert(nOps > 0 && "isConstantSplat has 0-size build vector");
6160 unsigned EltBitSize = VT.getVectorElementType().getSizeInBits();
6161
6162 for (unsigned j = 0; j < nOps; ++j) {
6163 unsigned i = isBigEndian ? nOps-1-j : j;
6164 SDValue OpVal = getOperand(i);
6165 unsigned BitPos = j * EltBitSize;
6166
6167 if (OpVal.getOpcode() == ISD::UNDEF)
6168 SplatUndef |= APInt::getBitsSet(sz, BitPos, BitPos + EltBitSize);
6169 else if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(OpVal))
6170 SplatValue |= CN->getAPIntValue().zextOrTrunc(EltBitSize).
6171 zextOrTrunc(sz) << BitPos;
6172 else if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(OpVal))
6173 SplatValue |= CN->getValueAPF().bitcastToAPInt().zextOrTrunc(sz) <<BitPos;
6174 else
6175 return false;
6176 }
6177
6178 // The build_vector is all constants or undefs. Find the smallest element
6179 // size that splats the vector.
6180
6181 HasAnyUndefs = (SplatUndef != 0);
6182 while (sz > 8) {
6183
6184 unsigned HalfSize = sz / 2;
6185 APInt HighValue = SplatValue.lshr(HalfSize).trunc(HalfSize);
6186 APInt LowValue = SplatValue.trunc(HalfSize);
6187 APInt HighUndef = SplatUndef.lshr(HalfSize).trunc(HalfSize);
6188 APInt LowUndef = SplatUndef.trunc(HalfSize);
6189
6190 // If the two halves do not match (ignoring undef bits), stop here.
6191 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
6192 MinSplatBits > HalfSize)
6193 break;
6194
6195 SplatValue = HighValue | LowValue;
6196 SplatUndef = HighUndef & LowUndef;
6197
6198 sz = HalfSize;
6199 }
6200
6201 SplatBitSize = sz;
6202 return true;
6203 }
6204
isSplatMask(const int * Mask,EVT VT)6205 bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) {
6206 // Find the first non-undef value in the shuffle mask.
6207 unsigned i, e;
6208 for (i = 0, e = VT.getVectorNumElements(); i != e && Mask[i] < 0; ++i)
6209 /* search */;
6210
6211 assert(i != e && "VECTOR_SHUFFLE node with all undef indices!");
6212
6213 // Make sure all remaining elements are either undef or the same as the first
6214 // non-undef value.
6215 for (int Idx = Mask[i]; i != e; ++i)
6216 if (Mask[i] >= 0 && Mask[i] != Idx)
6217 return false;
6218 return true;
6219 }
6220
6221 #ifdef XDEBUG
checkForCyclesHelper(const SDNode * N,SmallPtrSet<const SDNode *,32> & Visited,SmallPtrSet<const SDNode *,32> & Checked)6222 static void checkForCyclesHelper(const SDNode *N,
6223 SmallPtrSet<const SDNode*, 32> &Visited,
6224 SmallPtrSet<const SDNode*, 32> &Checked) {
6225 // If this node has already been checked, don't check it again.
6226 if (Checked.count(N))
6227 return;
6228
6229 // If a node has already been visited on this depth-first walk, reject it as
6230 // a cycle.
6231 if (!Visited.insert(N)) {
6232 dbgs() << "Offending node:\n";
6233 N->dumprFull();
6234 errs() << "Detected cycle in SelectionDAG\n";
6235 abort();
6236 }
6237
6238 for(unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
6239 checkForCyclesHelper(N->getOperand(i).getNode(), Visited, Checked);
6240
6241 Checked.insert(N);
6242 Visited.erase(N);
6243 }
6244 #endif
6245
checkForCycles(const llvm::SDNode * N)6246 void llvm::checkForCycles(const llvm::SDNode *N) {
6247 #ifdef XDEBUG
6248 assert(N && "Checking nonexistant SDNode");
6249 SmallPtrSet<const SDNode*, 32> visited;
6250 SmallPtrSet<const SDNode*, 32> checked;
6251 checkForCyclesHelper(N, visited, checked);
6252 #endif
6253 }
6254
checkForCycles(const llvm::SelectionDAG * DAG)6255 void llvm::checkForCycles(const llvm::SelectionDAG *DAG) {
6256 checkForCycles(DAG->getRoot().getNode());
6257 }
6258