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