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