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 bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const { 2837 assert(A.getValueType() == B.getValueType() && 2838 "Values must have the same type"); 2839 APInt AZero, AOne; 2840 APInt BZero, BOne; 2841 computeKnownBits(A, AZero, AOne); 2842 computeKnownBits(B, BZero, BOne); 2843 return (AZero | BZero).isAllOnesValue(); 2844 } 2845 2846 /// getNode - Gets or creates the specified node. 2847 /// 2848 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT) { 2849 FoldingSetNodeID ID; 2850 AddNodeIDNode(ID, Opcode, getVTList(VT), None); 2851 void *IP = nullptr; 2852 if (SDNode *E = FindNodeOrInsertPos(ID, DL.getDebugLoc(), IP)) 2853 return SDValue(E, 0); 2854 2855 SDNode *N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), 2856 DL.getDebugLoc(), getVTList(VT)); 2857 CSEMap.InsertNode(N, IP); 2858 2859 InsertNode(N); 2860 return SDValue(N, 0); 2861 } 2862 2863 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, 2864 EVT VT, SDValue Operand) { 2865 // Constant fold unary operations with an integer constant operand. Even 2866 // opaque constant will be folded, because the folding of unary operations 2867 // doesn't create new constants with different values. Nevertheless, the 2868 // opaque flag is preserved during folding to prevent future folding with 2869 // other constants. 2870 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Operand)) { 2871 const APInt &Val = C->getAPIntValue(); 2872 switch (Opcode) { 2873 default: break; 2874 case ISD::SIGN_EXTEND: 2875 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT, 2876 C->isTargetOpcode(), C->isOpaque()); 2877 case ISD::ANY_EXTEND: 2878 case ISD::ZERO_EXTEND: 2879 case ISD::TRUNCATE: 2880 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT, 2881 C->isTargetOpcode(), C->isOpaque()); 2882 case ISD::UINT_TO_FP: 2883 case ISD::SINT_TO_FP: { 2884 APFloat apf(EVTToAPFloatSemantics(VT), 2885 APInt::getNullValue(VT.getSizeInBits())); 2886 (void)apf.convertFromAPInt(Val, 2887 Opcode==ISD::SINT_TO_FP, 2888 APFloat::rmNearestTiesToEven); 2889 return getConstantFP(apf, DL, VT); 2890 } 2891 case ISD::BITCAST: 2892 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16) 2893 return getConstantFP(APFloat(APFloat::IEEEhalf, Val), DL, VT); 2894 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32) 2895 return getConstantFP(APFloat(APFloat::IEEEsingle, Val), DL, VT); 2896 else if (VT == MVT::f64 && C->getValueType(0) == MVT::i64) 2897 return getConstantFP(APFloat(APFloat::IEEEdouble, Val), DL, VT); 2898 break; 2899 case ISD::BSWAP: 2900 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(), 2901 C->isOpaque()); 2902 case ISD::CTPOP: 2903 return getConstant(Val.countPopulation(), DL, VT, C->isTargetOpcode(), 2904 C->isOpaque()); 2905 case ISD::CTLZ: 2906 case ISD::CTLZ_ZERO_UNDEF: 2907 return getConstant(Val.countLeadingZeros(), DL, VT, C->isTargetOpcode(), 2908 C->isOpaque()); 2909 case ISD::CTTZ: 2910 case ISD::CTTZ_ZERO_UNDEF: 2911 return getConstant(Val.countTrailingZeros(), DL, VT, C->isTargetOpcode(), 2912 C->isOpaque()); 2913 } 2914 } 2915 2916 // Constant fold unary operations with a floating point constant operand. 2917 if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Operand)) { 2918 APFloat V = C->getValueAPF(); // make copy 2919 switch (Opcode) { 2920 case ISD::FNEG: 2921 V.changeSign(); 2922 return getConstantFP(V, DL, VT); 2923 case ISD::FABS: 2924 V.clearSign(); 2925 return getConstantFP(V, DL, VT); 2926 case ISD::FCEIL: { 2927 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive); 2928 if (fs == APFloat::opOK || fs == APFloat::opInexact) 2929 return getConstantFP(V, DL, VT); 2930 break; 2931 } 2932 case ISD::FTRUNC: { 2933 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero); 2934 if (fs == APFloat::opOK || fs == APFloat::opInexact) 2935 return getConstantFP(V, DL, VT); 2936 break; 2937 } 2938 case ISD::FFLOOR: { 2939 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative); 2940 if (fs == APFloat::opOK || fs == APFloat::opInexact) 2941 return getConstantFP(V, DL, VT); 2942 break; 2943 } 2944 case ISD::FP_EXTEND: { 2945 bool ignored; 2946 // This can return overflow, underflow, or inexact; we don't care. 2947 // FIXME need to be more flexible about rounding mode. 2948 (void)V.convert(EVTToAPFloatSemantics(VT), 2949 APFloat::rmNearestTiesToEven, &ignored); 2950 return getConstantFP(V, DL, VT); 2951 } 2952 case ISD::FP_TO_SINT: 2953 case ISD::FP_TO_UINT: { 2954 integerPart x[2]; 2955 bool ignored; 2956 static_assert(integerPartWidth >= 64, "APFloat parts too small!"); 2957 // FIXME need to be more flexible about rounding mode. 2958 APFloat::opStatus s = V.convertToInteger(x, VT.getSizeInBits(), 2959 Opcode==ISD::FP_TO_SINT, 2960 APFloat::rmTowardZero, &ignored); 2961 if (s==APFloat::opInvalidOp) // inexact is OK, in fact usual 2962 break; 2963 APInt api(VT.getSizeInBits(), x); 2964 return getConstant(api, DL, VT); 2965 } 2966 case ISD::BITCAST: 2967 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16) 2968 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL, VT); 2969 else if (VT == MVT::i32 && C->getValueType(0) == MVT::f32) 2970 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL, VT); 2971 else if (VT == MVT::i64 && C->getValueType(0) == MVT::f64) 2972 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT); 2973 break; 2974 } 2975 } 2976 2977 // Constant fold unary operations with a vector integer or float operand. 2978 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(Operand)) { 2979 if (BV->isConstant()) { 2980 switch (Opcode) { 2981 default: 2982 // FIXME: Entirely reasonable to perform folding of other unary 2983 // operations here as the need arises. 2984 break; 2985 case ISD::FNEG: 2986 case ISD::FABS: 2987 case ISD::FCEIL: 2988 case ISD::FTRUNC: 2989 case ISD::FFLOOR: 2990 case ISD::FP_EXTEND: 2991 case ISD::FP_TO_SINT: 2992 case ISD::FP_TO_UINT: 2993 case ISD::TRUNCATE: 2994 case ISD::UINT_TO_FP: 2995 case ISD::SINT_TO_FP: 2996 case ISD::BSWAP: 2997 case ISD::CTLZ: 2998 case ISD::CTLZ_ZERO_UNDEF: 2999 case ISD::CTTZ: 3000 case ISD::CTTZ_ZERO_UNDEF: 3001 case ISD::CTPOP: { 3002 SDValue Ops = { Operand }; 3003 if (SDValue Fold = FoldConstantVectorArithmetic(Opcode, DL, VT, Ops)) 3004 return Fold; 3005 } 3006 } 3007 } 3008 } 3009 3010 unsigned OpOpcode = Operand.getNode()->getOpcode(); 3011 switch (Opcode) { 3012 case ISD::TokenFactor: 3013 case ISD::MERGE_VALUES: 3014 case ISD::CONCAT_VECTORS: 3015 return Operand; // Factor, merge or concat of one node? No need. 3016 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node"); 3017 case ISD::FP_EXTEND: 3018 assert(VT.isFloatingPoint() && 3019 Operand.getValueType().isFloatingPoint() && "Invalid FP cast!"); 3020 if (Operand.getValueType() == VT) return Operand; // noop conversion. 3021 assert((!VT.isVector() || 3022 VT.getVectorNumElements() == 3023 Operand.getValueType().getVectorNumElements()) && 3024 "Vector element count mismatch!"); 3025 assert(Operand.getValueType().bitsLT(VT) && 3026 "Invalid fpext node, dst < src!"); 3027 if (Operand.getOpcode() == ISD::UNDEF) 3028 return getUNDEF(VT); 3029 break; 3030 case ISD::SIGN_EXTEND: 3031 assert(VT.isInteger() && Operand.getValueType().isInteger() && 3032 "Invalid SIGN_EXTEND!"); 3033 if (Operand.getValueType() == VT) return Operand; // noop extension 3034 assert((!VT.isVector() || 3035 VT.getVectorNumElements() == 3036 Operand.getValueType().getVectorNumElements()) && 3037 "Vector element count mismatch!"); 3038 assert(Operand.getValueType().bitsLT(VT) && 3039 "Invalid sext node, dst < src!"); 3040 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) 3041 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0)); 3042 else if (OpOpcode == ISD::UNDEF) 3043 // sext(undef) = 0, because the top bits will all be the same. 3044 return getConstant(0, DL, VT); 3045 break; 3046 case ISD::ZERO_EXTEND: 3047 assert(VT.isInteger() && Operand.getValueType().isInteger() && 3048 "Invalid ZERO_EXTEND!"); 3049 if (Operand.getValueType() == VT) return Operand; // noop extension 3050 assert((!VT.isVector() || 3051 VT.getVectorNumElements() == 3052 Operand.getValueType().getVectorNumElements()) && 3053 "Vector element count mismatch!"); 3054 assert(Operand.getValueType().bitsLT(VT) && 3055 "Invalid zext node, dst < src!"); 3056 if (OpOpcode == ISD::ZERO_EXTEND) // (zext (zext x)) -> (zext x) 3057 return getNode(ISD::ZERO_EXTEND, DL, VT, 3058 Operand.getNode()->getOperand(0)); 3059 else if (OpOpcode == ISD::UNDEF) 3060 // zext(undef) = 0, because the top bits will be zero. 3061 return getConstant(0, DL, VT); 3062 break; 3063 case ISD::ANY_EXTEND: 3064 assert(VT.isInteger() && Operand.getValueType().isInteger() && 3065 "Invalid ANY_EXTEND!"); 3066 if (Operand.getValueType() == VT) return Operand; // noop extension 3067 assert((!VT.isVector() || 3068 VT.getVectorNumElements() == 3069 Operand.getValueType().getVectorNumElements()) && 3070 "Vector element count mismatch!"); 3071 assert(Operand.getValueType().bitsLT(VT) && 3072 "Invalid anyext node, dst < src!"); 3073 3074 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND || 3075 OpOpcode == ISD::ANY_EXTEND) 3076 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x) 3077 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0)); 3078 else if (OpOpcode == ISD::UNDEF) 3079 return getUNDEF(VT); 3080 3081 // (ext (trunx x)) -> x 3082 if (OpOpcode == ISD::TRUNCATE) { 3083 SDValue OpOp = Operand.getNode()->getOperand(0); 3084 if (OpOp.getValueType() == VT) 3085 return OpOp; 3086 } 3087 break; 3088 case ISD::TRUNCATE: 3089 assert(VT.isInteger() && Operand.getValueType().isInteger() && 3090 "Invalid TRUNCATE!"); 3091 if (Operand.getValueType() == VT) return Operand; // noop truncate 3092 assert((!VT.isVector() || 3093 VT.getVectorNumElements() == 3094 Operand.getValueType().getVectorNumElements()) && 3095 "Vector element count mismatch!"); 3096 assert(Operand.getValueType().bitsGT(VT) && 3097 "Invalid truncate node, src < dst!"); 3098 if (OpOpcode == ISD::TRUNCATE) 3099 return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0)); 3100 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND || 3101 OpOpcode == ISD::ANY_EXTEND) { 3102 // If the source is smaller than the dest, we still need an extend. 3103 if (Operand.getNode()->getOperand(0).getValueType().getScalarType() 3104 .bitsLT(VT.getScalarType())) 3105 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0)); 3106 if (Operand.getNode()->getOperand(0).getValueType().bitsGT(VT)) 3107 return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0)); 3108 return Operand.getNode()->getOperand(0); 3109 } 3110 if (OpOpcode == ISD::UNDEF) 3111 return getUNDEF(VT); 3112 break; 3113 case ISD::BSWAP: 3114 assert(VT.isInteger() && VT == Operand.getValueType() && 3115 "Invalid BSWAP!"); 3116 assert((VT.getScalarSizeInBits() % 16 == 0) && 3117 "BSWAP types must be a multiple of 16 bits!"); 3118 if (OpOpcode == ISD::UNDEF) 3119 return getUNDEF(VT); 3120 break; 3121 case ISD::BITCAST: 3122 // Basic sanity checking. 3123 assert(VT.getSizeInBits() == Operand.getValueType().getSizeInBits() 3124 && "Cannot BITCAST between types of different sizes!"); 3125 if (VT == Operand.getValueType()) return Operand; // noop conversion. 3126 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x) 3127 return getNode(ISD::BITCAST, DL, VT, Operand.getOperand(0)); 3128 if (OpOpcode == ISD::UNDEF) 3129 return getUNDEF(VT); 3130 break; 3131 case ISD::SCALAR_TO_VECTOR: 3132 assert(VT.isVector() && !Operand.getValueType().isVector() && 3133 (VT.getVectorElementType() == Operand.getValueType() || 3134 (VT.getVectorElementType().isInteger() && 3135 Operand.getValueType().isInteger() && 3136 VT.getVectorElementType().bitsLE(Operand.getValueType()))) && 3137 "Illegal SCALAR_TO_VECTOR node!"); 3138 if (OpOpcode == ISD::UNDEF) 3139 return getUNDEF(VT); 3140 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined. 3141 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT && 3142 isa<ConstantSDNode>(Operand.getOperand(1)) && 3143 Operand.getConstantOperandVal(1) == 0 && 3144 Operand.getOperand(0).getValueType() == VT) 3145 return Operand.getOperand(0); 3146 break; 3147 case ISD::FNEG: 3148 // -(X-Y) -> (Y-X) is unsafe because when X==Y, -0.0 != +0.0 3149 if (getTarget().Options.UnsafeFPMath && OpOpcode == ISD::FSUB) 3150 // FIXME: FNEG has no fast-math-flags to propagate; use the FSUB's flags? 3151 return getNode(ISD::FSUB, DL, VT, Operand.getNode()->getOperand(1), 3152 Operand.getNode()->getOperand(0), 3153 &cast<BinaryWithFlagsSDNode>(Operand.getNode())->Flags); 3154 if (OpOpcode == ISD::FNEG) // --X -> X 3155 return Operand.getNode()->getOperand(0); 3156 break; 3157 case ISD::FABS: 3158 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X) 3159 return getNode(ISD::FABS, DL, VT, Operand.getNode()->getOperand(0)); 3160 break; 3161 } 3162 3163 SDNode *N; 3164 SDVTList VTs = getVTList(VT); 3165 if (VT != MVT::Glue) { // Don't CSE flag producing nodes 3166 FoldingSetNodeID ID; 3167 SDValue Ops[1] = { Operand }; 3168 AddNodeIDNode(ID, Opcode, VTs, Ops); 3169 void *IP = nullptr; 3170 if (SDNode *E = FindNodeOrInsertPos(ID, DL.getDebugLoc(), IP)) 3171 return SDValue(E, 0); 3172 3173 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 3174 DL.getDebugLoc(), VTs, Operand); 3175 CSEMap.InsertNode(N, IP); 3176 } else { 3177 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 3178 DL.getDebugLoc(), VTs, Operand); 3179 } 3180 3181 InsertNode(N); 3182 return SDValue(N, 0); 3183 } 3184 3185 static std::pair<APInt, bool> FoldValue(unsigned Opcode, const APInt &C1, 3186 const APInt &C2) { 3187 switch (Opcode) { 3188 case ISD::ADD: return std::make_pair(C1 + C2, true); 3189 case ISD::SUB: return std::make_pair(C1 - C2, true); 3190 case ISD::MUL: return std::make_pair(C1 * C2, true); 3191 case ISD::AND: return std::make_pair(C1 & C2, true); 3192 case ISD::OR: return std::make_pair(C1 | C2, true); 3193 case ISD::XOR: return std::make_pair(C1 ^ C2, true); 3194 case ISD::SHL: return std::make_pair(C1 << C2, true); 3195 case ISD::SRL: return std::make_pair(C1.lshr(C2), true); 3196 case ISD::SRA: return std::make_pair(C1.ashr(C2), true); 3197 case ISD::ROTL: return std::make_pair(C1.rotl(C2), true); 3198 case ISD::ROTR: return std::make_pair(C1.rotr(C2), true); 3199 case ISD::SMIN: return std::make_pair(C1.sle(C2) ? C1 : C2, true); 3200 case ISD::SMAX: return std::make_pair(C1.sge(C2) ? C1 : C2, true); 3201 case ISD::UMIN: return std::make_pair(C1.ule(C2) ? C1 : C2, true); 3202 case ISD::UMAX: return std::make_pair(C1.uge(C2) ? C1 : C2, true); 3203 case ISD::UDIV: 3204 if (!C2.getBoolValue()) 3205 break; 3206 return std::make_pair(C1.udiv(C2), true); 3207 case ISD::UREM: 3208 if (!C2.getBoolValue()) 3209 break; 3210 return std::make_pair(C1.urem(C2), true); 3211 case ISD::SDIV: 3212 if (!C2.getBoolValue()) 3213 break; 3214 return std::make_pair(C1.sdiv(C2), true); 3215 case ISD::SREM: 3216 if (!C2.getBoolValue()) 3217 break; 3218 return std::make_pair(C1.srem(C2), true); 3219 } 3220 return std::make_pair(APInt(1, 0), false); 3221 } 3222 3223 SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, SDLoc DL, EVT VT, 3224 const ConstantSDNode *Cst1, 3225 const ConstantSDNode *Cst2) { 3226 if (Cst1->isOpaque() || Cst2->isOpaque()) 3227 return SDValue(); 3228 3229 std::pair<APInt, bool> Folded = FoldValue(Opcode, Cst1->getAPIntValue(), 3230 Cst2->getAPIntValue()); 3231 if (!Folded.second) 3232 return SDValue(); 3233 return getConstant(Folded.first, DL, VT); 3234 } 3235 3236 SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, SDLoc DL, EVT VT, 3237 SDNode *Cst1, SDNode *Cst2) { 3238 // If the opcode is a target-specific ISD node, there's nothing we can 3239 // do here and the operand rules may not line up with the below, so 3240 // bail early. 3241 if (Opcode >= ISD::BUILTIN_OP_END) 3242 return SDValue(); 3243 3244 // Handle the case of two scalars. 3245 if (const ConstantSDNode *Scalar1 = dyn_cast<ConstantSDNode>(Cst1)) { 3246 if (const ConstantSDNode *Scalar2 = dyn_cast<ConstantSDNode>(Cst2)) { 3247 if (SDValue Folded = 3248 FoldConstantArithmetic(Opcode, DL, VT, Scalar1, Scalar2)) { 3249 if (!VT.isVector()) 3250 return Folded; 3251 SmallVector<SDValue, 4> Outputs; 3252 // We may have a vector type but a scalar result. Create a splat. 3253 Outputs.resize(VT.getVectorNumElements(), Outputs.back()); 3254 // Build a big vector out of the scalar elements we generated. 3255 return getNode(ISD::BUILD_VECTOR, SDLoc(), VT, Outputs); 3256 } else { 3257 return SDValue(); 3258 } 3259 } 3260 } 3261 3262 // For vectors extract each constant element into Inputs so we can constant 3263 // fold them individually. 3264 BuildVectorSDNode *BV1 = dyn_cast<BuildVectorSDNode>(Cst1); 3265 BuildVectorSDNode *BV2 = dyn_cast<BuildVectorSDNode>(Cst2); 3266 if (!BV1 || !BV2) 3267 return SDValue(); 3268 3269 assert(BV1->getNumOperands() == BV2->getNumOperands() && "Out of sync!"); 3270 3271 EVT SVT = VT.getScalarType(); 3272 SmallVector<SDValue, 4> Outputs; 3273 for (unsigned I = 0, E = BV1->getNumOperands(); I != E; ++I) { 3274 ConstantSDNode *V1 = dyn_cast<ConstantSDNode>(BV1->getOperand(I)); 3275 ConstantSDNode *V2 = dyn_cast<ConstantSDNode>(BV2->getOperand(I)); 3276 if (!V1 || !V2) // Not a constant, bail. 3277 return SDValue(); 3278 3279 if (V1->isOpaque() || V2->isOpaque()) 3280 return SDValue(); 3281 3282 // Avoid BUILD_VECTOR nodes that perform implicit truncation. 3283 // FIXME: This is valid and could be handled by truncating the APInts. 3284 if (V1->getValueType(0) != SVT || V2->getValueType(0) != SVT) 3285 return SDValue(); 3286 3287 // Fold one vector element. 3288 std::pair<APInt, bool> Folded = FoldValue(Opcode, V1->getAPIntValue(), 3289 V2->getAPIntValue()); 3290 if (!Folded.second) 3291 return SDValue(); 3292 Outputs.push_back(getConstant(Folded.first, DL, SVT)); 3293 } 3294 3295 assert(VT.getVectorNumElements() == Outputs.size() && 3296 "Vector size mismatch!"); 3297 3298 // We may have a vector type but a scalar result. Create a splat. 3299 Outputs.resize(VT.getVectorNumElements(), Outputs.back()); 3300 3301 // Build a big vector out of the scalar elements we generated. 3302 return getNode(ISD::BUILD_VECTOR, SDLoc(), VT, Outputs); 3303 } 3304 3305 SDValue SelectionDAG::FoldConstantVectorArithmetic(unsigned Opcode, SDLoc DL, 3306 EVT VT, 3307 ArrayRef<SDValue> Ops, 3308 const SDNodeFlags *Flags) { 3309 // If the opcode is a target-specific ISD node, there's nothing we can 3310 // do here and the operand rules may not line up with the below, so 3311 // bail early. 3312 if (Opcode >= ISD::BUILTIN_OP_END) 3313 return SDValue(); 3314 3315 // We can only fold vectors - maybe merge with FoldConstantArithmetic someday? 3316 if (!VT.isVector()) 3317 return SDValue(); 3318 3319 unsigned NumElts = VT.getVectorNumElements(); 3320 3321 auto IsSameVectorSize = [&](const SDValue &Op) { 3322 return Op.getValueType().isVector() && 3323 Op.getValueType().getVectorNumElements() == NumElts; 3324 }; 3325 3326 auto IsConstantBuildVectorOrUndef = [&](const SDValue &Op) { 3327 BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(Op); 3328 return (Op.getOpcode() == ISD::UNDEF) || (BV && BV->isConstant()); 3329 }; 3330 3331 // All operands must be vector types with the same number of elements as 3332 // the result type and must be either UNDEF or a build vector of constant 3333 // or UNDEF scalars. 3334 if (!std::all_of(Ops.begin(), Ops.end(), IsConstantBuildVectorOrUndef) || 3335 !std::all_of(Ops.begin(), Ops.end(), IsSameVectorSize)) 3336 return SDValue(); 3337 3338 // Find legal integer scalar type for constant promotion and 3339 // ensure that its scalar size is at least as large as source. 3340 EVT SVT = VT.getScalarType(); 3341 EVT LegalSVT = SVT; 3342 if (SVT.isInteger()) { 3343 LegalSVT = TLI->getTypeToTransformTo(*getContext(), SVT); 3344 if (LegalSVT.bitsLT(SVT)) 3345 return SDValue(); 3346 } 3347 3348 // Constant fold each scalar lane separately. 3349 SmallVector<SDValue, 4> ScalarResults; 3350 for (unsigned i = 0; i != NumElts; i++) { 3351 SmallVector<SDValue, 4> ScalarOps; 3352 for (SDValue Op : Ops) { 3353 EVT InSVT = Op.getValueType().getScalarType(); 3354 BuildVectorSDNode *InBV = dyn_cast<BuildVectorSDNode>(Op); 3355 if (!InBV) { 3356 // We've checked that this is UNDEF above. 3357 ScalarOps.push_back(getUNDEF(InSVT)); 3358 continue; 3359 } 3360 3361 SDValue ScalarOp = InBV->getOperand(i); 3362 EVT ScalarVT = ScalarOp.getValueType(); 3363 3364 // Build vector (integer) scalar operands may need implicit 3365 // truncation - do this before constant folding. 3366 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) 3367 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp); 3368 3369 ScalarOps.push_back(ScalarOp); 3370 } 3371 3372 // Constant fold the scalar operands. 3373 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags); 3374 3375 // Legalize the (integer) scalar constant if necessary. 3376 if (LegalSVT != SVT) 3377 ScalarResult = getNode(ISD::ANY_EXTEND, DL, LegalSVT, ScalarResult); 3378 3379 // Scalar folding only succeeded if the result is a constant or UNDEF. 3380 if (ScalarResult.getOpcode() != ISD::UNDEF && 3381 ScalarResult.getOpcode() != ISD::Constant && 3382 ScalarResult.getOpcode() != ISD::ConstantFP) 3383 return SDValue(); 3384 ScalarResults.push_back(ScalarResult); 3385 } 3386 3387 assert(ScalarResults.size() == NumElts && 3388 "Unexpected number of scalar results for BUILD_VECTOR"); 3389 return getNode(ISD::BUILD_VECTOR, DL, VT, ScalarResults); 3390 } 3391 3392 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, 3393 SDValue N2, const SDNodeFlags *Flags) { 3394 ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1); 3395 ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2); 3396 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1); 3397 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2); 3398 3399 // Canonicalize constant to RHS if commutative. 3400 if (isCommutativeBinOp(Opcode)) { 3401 if (N1C && !N2C) { 3402 std::swap(N1C, N2C); 3403 std::swap(N1, N2); 3404 } else if (N1CFP && !N2CFP) { 3405 std::swap(N1CFP, N2CFP); 3406 std::swap(N1, N2); 3407 } 3408 } 3409 3410 switch (Opcode) { 3411 default: break; 3412 case ISD::TokenFactor: 3413 assert(VT == MVT::Other && N1.getValueType() == MVT::Other && 3414 N2.getValueType() == MVT::Other && "Invalid token factor!"); 3415 // Fold trivial token factors. 3416 if (N1.getOpcode() == ISD::EntryToken) return N2; 3417 if (N2.getOpcode() == ISD::EntryToken) return N1; 3418 if (N1 == N2) return N1; 3419 break; 3420 case ISD::CONCAT_VECTORS: 3421 // Concat of UNDEFs is UNDEF. 3422 if (N1.getOpcode() == ISD::UNDEF && 3423 N2.getOpcode() == ISD::UNDEF) 3424 return getUNDEF(VT); 3425 3426 // A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to 3427 // one big BUILD_VECTOR. 3428 if (N1.getOpcode() == ISD::BUILD_VECTOR && 3429 N2.getOpcode() == ISD::BUILD_VECTOR) { 3430 SmallVector<SDValue, 16> Elts(N1.getNode()->op_begin(), 3431 N1.getNode()->op_end()); 3432 Elts.append(N2.getNode()->op_begin(), N2.getNode()->op_end()); 3433 3434 // BUILD_VECTOR requires all inputs to be of the same type, find the 3435 // maximum type and extend them all. 3436 EVT SVT = VT.getScalarType(); 3437 for (SDValue Op : Elts) 3438 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT); 3439 if (SVT.bitsGT(VT.getScalarType())) 3440 for (SDValue &Op : Elts) 3441 Op = TLI->isZExtFree(Op.getValueType(), SVT) 3442 ? getZExtOrTrunc(Op, DL, SVT) 3443 : getSExtOrTrunc(Op, DL, SVT); 3444 3445 return getNode(ISD::BUILD_VECTOR, DL, VT, Elts); 3446 } 3447 break; 3448 case ISD::AND: 3449 assert(VT.isInteger() && "This operator does not apply to FP types!"); 3450 assert(N1.getValueType() == N2.getValueType() && 3451 N1.getValueType() == VT && "Binary operator types must match!"); 3452 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's 3453 // worth handling here. 3454 if (N2C && N2C->isNullValue()) 3455 return N2; 3456 if (N2C && N2C->isAllOnesValue()) // X & -1 -> X 3457 return N1; 3458 break; 3459 case ISD::OR: 3460 case ISD::XOR: 3461 case ISD::ADD: 3462 case ISD::SUB: 3463 assert(VT.isInteger() && "This operator does not apply to FP types!"); 3464 assert(N1.getValueType() == N2.getValueType() && 3465 N1.getValueType() == VT && "Binary operator types must match!"); 3466 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so 3467 // it's worth handling here. 3468 if (N2C && N2C->isNullValue()) 3469 return N1; 3470 break; 3471 case ISD::UDIV: 3472 case ISD::UREM: 3473 case ISD::MULHU: 3474 case ISD::MULHS: 3475 case ISD::MUL: 3476 case ISD::SDIV: 3477 case ISD::SREM: 3478 case ISD::SMIN: 3479 case ISD::SMAX: 3480 case ISD::UMIN: 3481 case ISD::UMAX: 3482 assert(VT.isInteger() && "This operator does not apply to FP types!"); 3483 assert(N1.getValueType() == N2.getValueType() && 3484 N1.getValueType() == VT && "Binary operator types must match!"); 3485 break; 3486 case ISD::FADD: 3487 case ISD::FSUB: 3488 case ISD::FMUL: 3489 case ISD::FDIV: 3490 case ISD::FREM: 3491 if (getTarget().Options.UnsafeFPMath) { 3492 if (Opcode == ISD::FADD) { 3493 // x+0 --> x 3494 if (N2CFP && N2CFP->getValueAPF().isZero()) 3495 return N1; 3496 } else if (Opcode == ISD::FSUB) { 3497 // x-0 --> x 3498 if (N2CFP && N2CFP->getValueAPF().isZero()) 3499 return N1; 3500 } else if (Opcode == ISD::FMUL) { 3501 // x*0 --> 0 3502 if (N2CFP && N2CFP->isZero()) 3503 return N2; 3504 // x*1 --> x 3505 if (N2CFP && N2CFP->isExactlyValue(1.0)) 3506 return N1; 3507 } 3508 } 3509 assert(VT.isFloatingPoint() && "This operator only applies to FP types!"); 3510 assert(N1.getValueType() == N2.getValueType() && 3511 N1.getValueType() == VT && "Binary operator types must match!"); 3512 break; 3513 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match. 3514 assert(N1.getValueType() == VT && 3515 N1.getValueType().isFloatingPoint() && 3516 N2.getValueType().isFloatingPoint() && 3517 "Invalid FCOPYSIGN!"); 3518 break; 3519 case ISD::SHL: 3520 case ISD::SRA: 3521 case ISD::SRL: 3522 case ISD::ROTL: 3523 case ISD::ROTR: 3524 assert(VT == N1.getValueType() && 3525 "Shift operators return type must be the same as their first arg"); 3526 assert(VT.isInteger() && N2.getValueType().isInteger() && 3527 "Shifts only work on integers"); 3528 assert((!VT.isVector() || VT == N2.getValueType()) && 3529 "Vector shift amounts must be in the same as their first arg"); 3530 // Verify that the shift amount VT is bit enough to hold valid shift 3531 // amounts. This catches things like trying to shift an i1024 value by an 3532 // i8, which is easy to fall into in generic code that uses 3533 // TLI.getShiftAmount(). 3534 assert(N2.getValueType().getSizeInBits() >= 3535 Log2_32_Ceil(N1.getValueType().getSizeInBits()) && 3536 "Invalid use of small shift amount with oversized value!"); 3537 3538 // Always fold shifts of i1 values so the code generator doesn't need to 3539 // handle them. Since we know the size of the shift has to be less than the 3540 // size of the value, the shift/rotate count is guaranteed to be zero. 3541 if (VT == MVT::i1) 3542 return N1; 3543 if (N2C && N2C->isNullValue()) 3544 return N1; 3545 break; 3546 case ISD::FP_ROUND_INREG: { 3547 EVT EVT = cast<VTSDNode>(N2)->getVT(); 3548 assert(VT == N1.getValueType() && "Not an inreg round!"); 3549 assert(VT.isFloatingPoint() && EVT.isFloatingPoint() && 3550 "Cannot FP_ROUND_INREG integer types"); 3551 assert(EVT.isVector() == VT.isVector() && 3552 "FP_ROUND_INREG type should be vector iff the operand " 3553 "type is vector!"); 3554 assert((!EVT.isVector() || 3555 EVT.getVectorNumElements() == VT.getVectorNumElements()) && 3556 "Vector element counts must match in FP_ROUND_INREG"); 3557 assert(EVT.bitsLE(VT) && "Not rounding down!"); 3558 (void)EVT; 3559 if (cast<VTSDNode>(N2)->getVT() == VT) return N1; // Not actually rounding. 3560 break; 3561 } 3562 case ISD::FP_ROUND: 3563 assert(VT.isFloatingPoint() && 3564 N1.getValueType().isFloatingPoint() && 3565 VT.bitsLE(N1.getValueType()) && 3566 N2C && "Invalid FP_ROUND!"); 3567 if (N1.getValueType() == VT) return N1; // noop conversion. 3568 break; 3569 case ISD::AssertSext: 3570 case ISD::AssertZext: { 3571 EVT EVT = cast<VTSDNode>(N2)->getVT(); 3572 assert(VT == N1.getValueType() && "Not an inreg extend!"); 3573 assert(VT.isInteger() && EVT.isInteger() && 3574 "Cannot *_EXTEND_INREG FP types"); 3575 assert(!EVT.isVector() && 3576 "AssertSExt/AssertZExt type should be the vector element type " 3577 "rather than the vector type!"); 3578 assert(EVT.bitsLE(VT) && "Not extending!"); 3579 if (VT == EVT) return N1; // noop assertion. 3580 break; 3581 } 3582 case ISD::SIGN_EXTEND_INREG: { 3583 EVT EVT = cast<VTSDNode>(N2)->getVT(); 3584 assert(VT == N1.getValueType() && "Not an inreg extend!"); 3585 assert(VT.isInteger() && EVT.isInteger() && 3586 "Cannot *_EXTEND_INREG FP types"); 3587 assert(EVT.isVector() == VT.isVector() && 3588 "SIGN_EXTEND_INREG type should be vector iff the operand " 3589 "type is vector!"); 3590 assert((!EVT.isVector() || 3591 EVT.getVectorNumElements() == VT.getVectorNumElements()) && 3592 "Vector element counts must match in SIGN_EXTEND_INREG"); 3593 assert(EVT.bitsLE(VT) && "Not extending!"); 3594 if (EVT == VT) return N1; // Not actually extending 3595 3596 auto SignExtendInReg = [&](APInt Val) { 3597 unsigned FromBits = EVT.getScalarType().getSizeInBits(); 3598 Val <<= Val.getBitWidth() - FromBits; 3599 Val = Val.ashr(Val.getBitWidth() - FromBits); 3600 return getConstant(Val, DL, VT.getScalarType()); 3601 }; 3602 3603 if (N1C) { 3604 APInt Val = N1C->getAPIntValue(); 3605 return SignExtendInReg(Val); 3606 } 3607 if (ISD::isBuildVectorOfConstantSDNodes(N1.getNode())) { 3608 SmallVector<SDValue, 8> Ops; 3609 for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) { 3610 SDValue Op = N1.getOperand(i); 3611 if (Op.getOpcode() == ISD::UNDEF) { 3612 Ops.push_back(getUNDEF(VT.getScalarType())); 3613 continue; 3614 } 3615 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) { 3616 APInt Val = C->getAPIntValue(); 3617 Val = Val.zextOrTrunc(VT.getScalarSizeInBits()); 3618 Ops.push_back(SignExtendInReg(Val)); 3619 continue; 3620 } 3621 break; 3622 } 3623 if (Ops.size() == VT.getVectorNumElements()) 3624 return getNode(ISD::BUILD_VECTOR, DL, VT, Ops); 3625 } 3626 break; 3627 } 3628 case ISD::EXTRACT_VECTOR_ELT: 3629 // EXTRACT_VECTOR_ELT of an UNDEF is an UNDEF. 3630 if (N1.getOpcode() == ISD::UNDEF) 3631 return getUNDEF(VT); 3632 3633 // EXTRACT_VECTOR_ELT of out-of-bounds element is an UNDEF 3634 if (N2C && N2C->getZExtValue() >= N1.getValueType().getVectorNumElements()) 3635 return getUNDEF(VT); 3636 3637 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is 3638 // expanding copies of large vectors from registers. 3639 if (N2C && 3640 N1.getOpcode() == ISD::CONCAT_VECTORS && 3641 N1.getNumOperands() > 0) { 3642 unsigned Factor = 3643 N1.getOperand(0).getValueType().getVectorNumElements(); 3644 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, 3645 N1.getOperand(N2C->getZExtValue() / Factor), 3646 getConstant(N2C->getZExtValue() % Factor, DL, 3647 N2.getValueType())); 3648 } 3649 3650 // EXTRACT_VECTOR_ELT of BUILD_VECTOR is often formed while lowering is 3651 // expanding large vector constants. 3652 if (N2C && N1.getOpcode() == ISD::BUILD_VECTOR) { 3653 SDValue Elt = N1.getOperand(N2C->getZExtValue()); 3654 3655 if (VT != Elt.getValueType()) 3656 // If the vector element type is not legal, the BUILD_VECTOR operands 3657 // are promoted and implicitly truncated, and the result implicitly 3658 // extended. Make that explicit here. 3659 Elt = getAnyExtOrTrunc(Elt, DL, VT); 3660 3661 return Elt; 3662 } 3663 3664 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector 3665 // operations are lowered to scalars. 3666 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) { 3667 // If the indices are the same, return the inserted element else 3668 // if the indices are known different, extract the element from 3669 // the original vector. 3670 SDValue N1Op2 = N1.getOperand(2); 3671 ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2); 3672 3673 if (N1Op2C && N2C) { 3674 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) { 3675 if (VT == N1.getOperand(1).getValueType()) 3676 return N1.getOperand(1); 3677 else 3678 return getSExtOrTrunc(N1.getOperand(1), DL, VT); 3679 } 3680 3681 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2); 3682 } 3683 } 3684 break; 3685 case ISD::EXTRACT_ELEMENT: 3686 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!"); 3687 assert(!N1.getValueType().isVector() && !VT.isVector() && 3688 (N1.getValueType().isInteger() == VT.isInteger()) && 3689 N1.getValueType() != VT && 3690 "Wrong types for EXTRACT_ELEMENT!"); 3691 3692 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding 3693 // 64-bit integers into 32-bit parts. Instead of building the extract of 3694 // the BUILD_PAIR, only to have legalize rip it apart, just do it now. 3695 if (N1.getOpcode() == ISD::BUILD_PAIR) 3696 return N1.getOperand(N2C->getZExtValue()); 3697 3698 // EXTRACT_ELEMENT of a constant int is also very common. 3699 if (N1C) { 3700 unsigned ElementSize = VT.getSizeInBits(); 3701 unsigned Shift = ElementSize * N2C->getZExtValue(); 3702 APInt ShiftedVal = N1C->getAPIntValue().lshr(Shift); 3703 return getConstant(ShiftedVal.trunc(ElementSize), DL, VT); 3704 } 3705 break; 3706 case ISD::EXTRACT_SUBVECTOR: 3707 if (VT.isSimple() && N1.getValueType().isSimple()) { 3708 assert(VT.isVector() && N1.getValueType().isVector() && 3709 "Extract subvector VTs must be a vectors!"); 3710 assert(VT.getVectorElementType() == 3711 N1.getValueType().getVectorElementType() && 3712 "Extract subvector VTs must have the same element type!"); 3713 assert(VT.getSimpleVT() <= N1.getSimpleValueType() && 3714 "Extract subvector must be from larger vector to smaller vector!"); 3715 3716 if (N2C) { 3717 assert((VT.getVectorNumElements() + N2C->getZExtValue() 3718 <= N1.getValueType().getVectorNumElements()) 3719 && "Extract subvector overflow!"); 3720 } 3721 3722 // Trivial extraction. 3723 if (VT.getSimpleVT() == N1.getSimpleValueType()) 3724 return N1; 3725 } 3726 break; 3727 } 3728 3729 // Perform trivial constant folding. 3730 if (SDValue SV = 3731 FoldConstantArithmetic(Opcode, DL, VT, N1.getNode(), N2.getNode())) 3732 return SV; 3733 3734 // Constant fold FP operations. 3735 bool HasFPExceptions = TLI->hasFloatingPointExceptions(); 3736 if (N1CFP) { 3737 if (N2CFP) { 3738 APFloat V1 = N1CFP->getValueAPF(), V2 = N2CFP->getValueAPF(); 3739 APFloat::opStatus s; 3740 switch (Opcode) { 3741 case ISD::FADD: 3742 s = V1.add(V2, APFloat::rmNearestTiesToEven); 3743 if (!HasFPExceptions || s != APFloat::opInvalidOp) 3744 return getConstantFP(V1, DL, VT); 3745 break; 3746 case ISD::FSUB: 3747 s = V1.subtract(V2, APFloat::rmNearestTiesToEven); 3748 if (!HasFPExceptions || s!=APFloat::opInvalidOp) 3749 return getConstantFP(V1, DL, VT); 3750 break; 3751 case ISD::FMUL: 3752 s = V1.multiply(V2, APFloat::rmNearestTiesToEven); 3753 if (!HasFPExceptions || s!=APFloat::opInvalidOp) 3754 return getConstantFP(V1, DL, VT); 3755 break; 3756 case ISD::FDIV: 3757 s = V1.divide(V2, APFloat::rmNearestTiesToEven); 3758 if (!HasFPExceptions || (s!=APFloat::opInvalidOp && 3759 s!=APFloat::opDivByZero)) { 3760 return getConstantFP(V1, DL, VT); 3761 } 3762 break; 3763 case ISD::FREM : 3764 s = V1.mod(V2); 3765 if (!HasFPExceptions || (s!=APFloat::opInvalidOp && 3766 s!=APFloat::opDivByZero)) { 3767 return getConstantFP(V1, DL, VT); 3768 } 3769 break; 3770 case ISD::FCOPYSIGN: 3771 V1.copySign(V2); 3772 return getConstantFP(V1, DL, VT); 3773 default: break; 3774 } 3775 } 3776 3777 if (Opcode == ISD::FP_ROUND) { 3778 APFloat V = N1CFP->getValueAPF(); // make copy 3779 bool ignored; 3780 // This can return overflow, underflow, or inexact; we don't care. 3781 // FIXME need to be more flexible about rounding mode. 3782 (void)V.convert(EVTToAPFloatSemantics(VT), 3783 APFloat::rmNearestTiesToEven, &ignored); 3784 return getConstantFP(V, DL, VT); 3785 } 3786 } 3787 3788 // Canonicalize an UNDEF to the RHS, even over a constant. 3789 if (N1.getOpcode() == ISD::UNDEF) { 3790 if (isCommutativeBinOp(Opcode)) { 3791 std::swap(N1, N2); 3792 } else { 3793 switch (Opcode) { 3794 case ISD::FP_ROUND_INREG: 3795 case ISD::SIGN_EXTEND_INREG: 3796 case ISD::SUB: 3797 case ISD::FSUB: 3798 case ISD::FDIV: 3799 case ISD::FREM: 3800 case ISD::SRA: 3801 return N1; // fold op(undef, arg2) -> undef 3802 case ISD::UDIV: 3803 case ISD::SDIV: 3804 case ISD::UREM: 3805 case ISD::SREM: 3806 case ISD::SRL: 3807 case ISD::SHL: 3808 if (!VT.isVector()) 3809 return getConstant(0, DL, VT); // fold op(undef, arg2) -> 0 3810 // For vectors, we can't easily build an all zero vector, just return 3811 // the LHS. 3812 return N2; 3813 } 3814 } 3815 } 3816 3817 // Fold a bunch of operators when the RHS is undef. 3818 if (N2.getOpcode() == ISD::UNDEF) { 3819 switch (Opcode) { 3820 case ISD::XOR: 3821 if (N1.getOpcode() == ISD::UNDEF) 3822 // Handle undef ^ undef -> 0 special case. This is a common 3823 // idiom (misuse). 3824 return getConstant(0, DL, VT); 3825 // fallthrough 3826 case ISD::ADD: 3827 case ISD::ADDC: 3828 case ISD::ADDE: 3829 case ISD::SUB: 3830 case ISD::UDIV: 3831 case ISD::SDIV: 3832 case ISD::UREM: 3833 case ISD::SREM: 3834 return N2; // fold op(arg1, undef) -> undef 3835 case ISD::FADD: 3836 case ISD::FSUB: 3837 case ISD::FMUL: 3838 case ISD::FDIV: 3839 case ISD::FREM: 3840 if (getTarget().Options.UnsafeFPMath) 3841 return N2; 3842 break; 3843 case ISD::MUL: 3844 case ISD::AND: 3845 case ISD::SRL: 3846 case ISD::SHL: 3847 if (!VT.isVector()) 3848 return getConstant(0, DL, VT); // fold op(arg1, undef) -> 0 3849 // For vectors, we can't easily build an all zero vector, just return 3850 // the LHS. 3851 return N1; 3852 case ISD::OR: 3853 if (!VT.isVector()) 3854 return getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), DL, VT); 3855 // For vectors, we can't easily build an all one vector, just return 3856 // the LHS. 3857 return N1; 3858 case ISD::SRA: 3859 return N1; 3860 } 3861 } 3862 3863 // Memoize this node if possible. 3864 BinarySDNode *N; 3865 SDVTList VTs = getVTList(VT); 3866 if (VT != MVT::Glue) { 3867 SDValue Ops[] = {N1, N2}; 3868 FoldingSetNodeID ID; 3869 AddNodeIDNode(ID, Opcode, VTs, Ops); 3870 AddNodeIDFlags(ID, Opcode, Flags); 3871 void *IP = nullptr; 3872 if (SDNode *E = FindNodeOrInsertPos(ID, DL.getDebugLoc(), IP)) 3873 return SDValue(E, 0); 3874 3875 N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, Flags); 3876 3877 CSEMap.InsertNode(N, IP); 3878 } else { 3879 N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, Flags); 3880 } 3881 3882 InsertNode(N); 3883 return SDValue(N, 0); 3884 } 3885 3886 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 3887 SDValue N1, SDValue N2, SDValue N3) { 3888 // Perform various simplifications. 3889 switch (Opcode) { 3890 case ISD::FMA: { 3891 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1); 3892 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2); 3893 ConstantFPSDNode *N3CFP = dyn_cast<ConstantFPSDNode>(N3); 3894 if (N1CFP && N2CFP && N3CFP) { 3895 APFloat V1 = N1CFP->getValueAPF(); 3896 const APFloat &V2 = N2CFP->getValueAPF(); 3897 const APFloat &V3 = N3CFP->getValueAPF(); 3898 APFloat::opStatus s = 3899 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven); 3900 if (!TLI->hasFloatingPointExceptions() || s != APFloat::opInvalidOp) 3901 return getConstantFP(V1, DL, VT); 3902 } 3903 break; 3904 } 3905 case ISD::CONCAT_VECTORS: 3906 // A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to 3907 // one big BUILD_VECTOR. 3908 if (N1.getOpcode() == ISD::BUILD_VECTOR && 3909 N2.getOpcode() == ISD::BUILD_VECTOR && 3910 N3.getOpcode() == ISD::BUILD_VECTOR) { 3911 SmallVector<SDValue, 16> Elts(N1.getNode()->op_begin(), 3912 N1.getNode()->op_end()); 3913 Elts.append(N2.getNode()->op_begin(), N2.getNode()->op_end()); 3914 Elts.append(N3.getNode()->op_begin(), N3.getNode()->op_end()); 3915 return getNode(ISD::BUILD_VECTOR, DL, VT, Elts); 3916 } 3917 break; 3918 case ISD::SETCC: { 3919 // Use FoldSetCC to simplify SETCC's. 3920 if (SDValue V = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL)) 3921 return V; 3922 break; 3923 } 3924 case ISD::SELECT: 3925 if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1)) { 3926 if (N1C->getZExtValue()) 3927 return N2; // select true, X, Y -> X 3928 return N3; // select false, X, Y -> Y 3929 } 3930 3931 if (N2 == N3) return N2; // select C, X, X -> X 3932 break; 3933 case ISD::VECTOR_SHUFFLE: 3934 llvm_unreachable("should use getVectorShuffle constructor!"); 3935 case ISD::INSERT_SUBVECTOR: { 3936 SDValue Index = N3; 3937 if (VT.isSimple() && N1.getValueType().isSimple() 3938 && N2.getValueType().isSimple()) { 3939 assert(VT.isVector() && N1.getValueType().isVector() && 3940 N2.getValueType().isVector() && 3941 "Insert subvector VTs must be a vectors"); 3942 assert(VT == N1.getValueType() && 3943 "Dest and insert subvector source types must match!"); 3944 assert(N2.getSimpleValueType() <= N1.getSimpleValueType() && 3945 "Insert subvector must be from smaller vector to larger vector!"); 3946 if (isa<ConstantSDNode>(Index)) { 3947 assert((N2.getValueType().getVectorNumElements() + 3948 cast<ConstantSDNode>(Index)->getZExtValue() 3949 <= VT.getVectorNumElements()) 3950 && "Insert subvector overflow!"); 3951 } 3952 3953 // Trivial insertion. 3954 if (VT.getSimpleVT() == N2.getSimpleValueType()) 3955 return N2; 3956 } 3957 break; 3958 } 3959 case ISD::BITCAST: 3960 // Fold bit_convert nodes from a type to themselves. 3961 if (N1.getValueType() == VT) 3962 return N1; 3963 break; 3964 } 3965 3966 // Memoize node if it doesn't produce a flag. 3967 SDNode *N; 3968 SDVTList VTs = getVTList(VT); 3969 if (VT != MVT::Glue) { 3970 SDValue Ops[] = { N1, N2, N3 }; 3971 FoldingSetNodeID ID; 3972 AddNodeIDNode(ID, Opcode, VTs, Ops); 3973 void *IP = nullptr; 3974 if (SDNode *E = FindNodeOrInsertPos(ID, DL.getDebugLoc(), IP)) 3975 return SDValue(E, 0); 3976 3977 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 3978 DL.getDebugLoc(), VTs, N1, N2, N3); 3979 CSEMap.InsertNode(N, IP); 3980 } else { 3981 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 3982 DL.getDebugLoc(), VTs, N1, N2, N3); 3983 } 3984 3985 InsertNode(N); 3986 return SDValue(N, 0); 3987 } 3988 3989 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 3990 SDValue N1, SDValue N2, SDValue N3, 3991 SDValue N4) { 3992 SDValue Ops[] = { N1, N2, N3, N4 }; 3993 return getNode(Opcode, DL, VT, Ops); 3994 } 3995 3996 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 3997 SDValue N1, SDValue N2, SDValue N3, 3998 SDValue N4, SDValue N5) { 3999 SDValue Ops[] = { N1, N2, N3, N4, N5 }; 4000 return getNode(Opcode, DL, VT, Ops); 4001 } 4002 4003 /// getStackArgumentTokenFactor - Compute a TokenFactor to force all 4004 /// the incoming stack arguments to be loaded from the stack. 4005 SDValue SelectionDAG::getStackArgumentTokenFactor(SDValue Chain) { 4006 SmallVector<SDValue, 8> ArgChains; 4007 4008 // Include the original chain at the beginning of the list. When this is 4009 // used by target LowerCall hooks, this helps legalize find the 4010 // CALLSEQ_BEGIN node. 4011 ArgChains.push_back(Chain); 4012 4013 // Add a chain value for each stack argument. 4014 for (SDNode::use_iterator U = getEntryNode().getNode()->use_begin(), 4015 UE = getEntryNode().getNode()->use_end(); U != UE; ++U) 4016 if (LoadSDNode *L = dyn_cast<LoadSDNode>(*U)) 4017 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr())) 4018 if (FI->getIndex() < 0) 4019 ArgChains.push_back(SDValue(L, 1)); 4020 4021 // Build a tokenfactor for all the chains. 4022 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains); 4023 } 4024 4025 /// getMemsetValue - Vectorized representation of the memset value 4026 /// operand. 4027 static SDValue getMemsetValue(SDValue Value, EVT VT, SelectionDAG &DAG, 4028 SDLoc dl) { 4029 assert(Value.getOpcode() != ISD::UNDEF); 4030 4031 unsigned NumBits = VT.getScalarType().getSizeInBits(); 4032 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Value)) { 4033 assert(C->getAPIntValue().getBitWidth() == 8); 4034 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue()); 4035 if (VT.isInteger()) 4036 return DAG.getConstant(Val, dl, VT); 4037 return DAG.getConstantFP(APFloat(DAG.EVTToAPFloatSemantics(VT), Val), dl, 4038 VT); 4039 } 4040 4041 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?"); 4042 EVT IntVT = VT.getScalarType(); 4043 if (!IntVT.isInteger()) 4044 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits()); 4045 4046 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value); 4047 if (NumBits > 8) { 4048 // Use a multiplication with 0x010101... to extend the input to the 4049 // required length. 4050 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01)); 4051 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value, 4052 DAG.getConstant(Magic, dl, IntVT)); 4053 } 4054 4055 if (VT != Value.getValueType() && !VT.isInteger()) 4056 Value = DAG.getNode(ISD::BITCAST, dl, VT.getScalarType(), Value); 4057 if (VT != Value.getValueType()) { 4058 assert(VT.getVectorElementType() == Value.getValueType() && 4059 "value type should be one vector element here"); 4060 SmallVector<SDValue, 8> BVOps(VT.getVectorNumElements(), Value); 4061 Value = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, BVOps); 4062 } 4063 4064 return Value; 4065 } 4066 4067 /// getMemsetStringVal - Similar to getMemsetValue. Except this is only 4068 /// used when a memcpy is turned into a memset when the source is a constant 4069 /// string ptr. 4070 static SDValue getMemsetStringVal(EVT VT, SDLoc dl, SelectionDAG &DAG, 4071 const TargetLowering &TLI, StringRef Str) { 4072 // Handle vector with all elements zero. 4073 if (Str.empty()) { 4074 if (VT.isInteger()) 4075 return DAG.getConstant(0, dl, VT); 4076 else if (VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128) 4077 return DAG.getConstantFP(0.0, dl, VT); 4078 else if (VT.isVector()) { 4079 unsigned NumElts = VT.getVectorNumElements(); 4080 MVT EltVT = (VT.getVectorElementType() == MVT::f32) ? MVT::i32 : MVT::i64; 4081 return DAG.getNode(ISD::BITCAST, dl, VT, 4082 DAG.getConstant(0, dl, 4083 EVT::getVectorVT(*DAG.getContext(), 4084 EltVT, NumElts))); 4085 } else 4086 llvm_unreachable("Expected type!"); 4087 } 4088 4089 assert(!VT.isVector() && "Can't handle vector type here!"); 4090 unsigned NumVTBits = VT.getSizeInBits(); 4091 unsigned NumVTBytes = NumVTBits / 8; 4092 unsigned NumBytes = std::min(NumVTBytes, unsigned(Str.size())); 4093 4094 APInt Val(NumVTBits, 0); 4095 if (DAG.getDataLayout().isLittleEndian()) { 4096 for (unsigned i = 0; i != NumBytes; ++i) 4097 Val |= (uint64_t)(unsigned char)Str[i] << i*8; 4098 } else { 4099 for (unsigned i = 0; i != NumBytes; ++i) 4100 Val |= (uint64_t)(unsigned char)Str[i] << (NumVTBytes-i-1)*8; 4101 } 4102 4103 // If the "cost" of materializing the integer immediate is less than the cost 4104 // of a load, then it is cost effective to turn the load into the immediate. 4105 Type *Ty = VT.getTypeForEVT(*DAG.getContext()); 4106 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty)) 4107 return DAG.getConstant(Val, dl, VT); 4108 return SDValue(nullptr, 0); 4109 } 4110 4111 /// getMemBasePlusOffset - Returns base and offset node for the 4112 /// 4113 static SDValue getMemBasePlusOffset(SDValue Base, unsigned Offset, SDLoc dl, 4114 SelectionDAG &DAG) { 4115 EVT VT = Base.getValueType(); 4116 return DAG.getNode(ISD::ADD, dl, 4117 VT, Base, DAG.getConstant(Offset, dl, VT)); 4118 } 4119 4120 /// isMemSrcFromString - Returns true if memcpy source is a string constant. 4121 /// 4122 static bool isMemSrcFromString(SDValue Src, StringRef &Str) { 4123 unsigned SrcDelta = 0; 4124 GlobalAddressSDNode *G = nullptr; 4125 if (Src.getOpcode() == ISD::GlobalAddress) 4126 G = cast<GlobalAddressSDNode>(Src); 4127 else if (Src.getOpcode() == ISD::ADD && 4128 Src.getOperand(0).getOpcode() == ISD::GlobalAddress && 4129 Src.getOperand(1).getOpcode() == ISD::Constant) { 4130 G = cast<GlobalAddressSDNode>(Src.getOperand(0)); 4131 SrcDelta = cast<ConstantSDNode>(Src.getOperand(1))->getZExtValue(); 4132 } 4133 if (!G) 4134 return false; 4135 4136 return getConstantStringInfo(G->getGlobal(), Str, SrcDelta, false); 4137 } 4138 4139 /// Determines the optimal series of memory ops to replace the memset / memcpy. 4140 /// Return true if the number of memory ops is below the threshold (Limit). 4141 /// It returns the types of the sequence of memory ops to perform 4142 /// memset / memcpy by reference. 4143 static bool FindOptimalMemOpLowering(std::vector<EVT> &MemOps, 4144 unsigned Limit, uint64_t Size, 4145 unsigned DstAlign, unsigned SrcAlign, 4146 bool IsMemset, 4147 bool ZeroMemset, 4148 bool MemcpyStrSrc, 4149 bool AllowOverlap, 4150 SelectionDAG &DAG, 4151 const TargetLowering &TLI) { 4152 assert((SrcAlign == 0 || SrcAlign >= DstAlign) && 4153 "Expecting memcpy / memset source to meet alignment requirement!"); 4154 // If 'SrcAlign' is zero, that means the memory operation does not need to 4155 // load the value, i.e. memset or memcpy from constant string. Otherwise, 4156 // it's the inferred alignment of the source. 'DstAlign', on the other hand, 4157 // is the specified alignment of the memory operation. If it is zero, that 4158 // means it's possible to change the alignment of the destination. 4159 // 'MemcpyStrSrc' indicates whether the memcpy source is constant so it does 4160 // not need to be loaded. 4161 EVT VT = TLI.getOptimalMemOpType(Size, DstAlign, SrcAlign, 4162 IsMemset, ZeroMemset, MemcpyStrSrc, 4163 DAG.getMachineFunction()); 4164 4165 if (VT == MVT::Other) { 4166 unsigned AS = 0; 4167 if (DstAlign >= DAG.getDataLayout().getPointerPrefAlignment(AS) || 4168 TLI.allowsMisalignedMemoryAccesses(VT, AS, DstAlign)) { 4169 VT = TLI.getPointerTy(DAG.getDataLayout()); 4170 } else { 4171 switch (DstAlign & 7) { 4172 case 0: VT = MVT::i64; break; 4173 case 4: VT = MVT::i32; break; 4174 case 2: VT = MVT::i16; break; 4175 default: VT = MVT::i8; break; 4176 } 4177 } 4178 4179 MVT LVT = MVT::i64; 4180 while (!TLI.isTypeLegal(LVT)) 4181 LVT = (MVT::SimpleValueType)(LVT.SimpleTy - 1); 4182 assert(LVT.isInteger()); 4183 4184 if (VT.bitsGT(LVT)) 4185 VT = LVT; 4186 } 4187 4188 unsigned NumMemOps = 0; 4189 while (Size != 0) { 4190 unsigned VTSize = VT.getSizeInBits() / 8; 4191 while (VTSize > Size) { 4192 // For now, only use non-vector load / store's for the left-over pieces. 4193 EVT NewVT = VT; 4194 unsigned NewVTSize; 4195 4196 bool Found = false; 4197 if (VT.isVector() || VT.isFloatingPoint()) { 4198 NewVT = (VT.getSizeInBits() > 64) ? MVT::i64 : MVT::i32; 4199 if (TLI.isOperationLegalOrCustom(ISD::STORE, NewVT) && 4200 TLI.isSafeMemOpType(NewVT.getSimpleVT())) 4201 Found = true; 4202 else if (NewVT == MVT::i64 && 4203 TLI.isOperationLegalOrCustom(ISD::STORE, MVT::f64) && 4204 TLI.isSafeMemOpType(MVT::f64)) { 4205 // i64 is usually not legal on 32-bit targets, but f64 may be. 4206 NewVT = MVT::f64; 4207 Found = true; 4208 } 4209 } 4210 4211 if (!Found) { 4212 do { 4213 NewVT = (MVT::SimpleValueType)(NewVT.getSimpleVT().SimpleTy - 1); 4214 if (NewVT == MVT::i8) 4215 break; 4216 } while (!TLI.isSafeMemOpType(NewVT.getSimpleVT())); 4217 } 4218 NewVTSize = NewVT.getSizeInBits() / 8; 4219 4220 // If the new VT cannot cover all of the remaining bits, then consider 4221 // issuing a (or a pair of) unaligned and overlapping load / store. 4222 // FIXME: Only does this for 64-bit or more since we don't have proper 4223 // cost model for unaligned load / store. 4224 bool Fast; 4225 unsigned AS = 0; 4226 if (NumMemOps && AllowOverlap && 4227 VTSize >= 8 && NewVTSize < Size && 4228 TLI.allowsMisalignedMemoryAccesses(VT, AS, DstAlign, &Fast) && Fast) 4229 VTSize = Size; 4230 else { 4231 VT = NewVT; 4232 VTSize = NewVTSize; 4233 } 4234 } 4235 4236 if (++NumMemOps > Limit) 4237 return false; 4238 4239 MemOps.push_back(VT); 4240 Size -= VTSize; 4241 } 4242 4243 return true; 4244 } 4245 4246 static bool shouldLowerMemFuncForSize(const MachineFunction &MF) { 4247 // On Darwin, -Os means optimize for size without hurting performance, so 4248 // only really optimize for size when -Oz (MinSize) is used. 4249 if (MF.getTarget().getTargetTriple().isOSDarwin()) 4250 return MF.getFunction()->optForMinSize(); 4251 return MF.getFunction()->optForSize(); 4252 } 4253 4254 static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, SDLoc dl, 4255 SDValue Chain, SDValue Dst, 4256 SDValue Src, uint64_t Size, 4257 unsigned Align, bool isVol, 4258 bool AlwaysInline, 4259 MachinePointerInfo DstPtrInfo, 4260 MachinePointerInfo SrcPtrInfo) { 4261 // Turn a memcpy of undef to nop. 4262 if (Src.getOpcode() == ISD::UNDEF) 4263 return Chain; 4264 4265 // Expand memcpy to a series of load and store ops if the size operand falls 4266 // below a certain threshold. 4267 // TODO: In the AlwaysInline case, if the size is big then generate a loop 4268 // rather than maybe a humongous number of loads and stores. 4269 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 4270 std::vector<EVT> MemOps; 4271 bool DstAlignCanChange = false; 4272 MachineFunction &MF = DAG.getMachineFunction(); 4273 MachineFrameInfo *MFI = MF.getFrameInfo(); 4274 bool OptSize = shouldLowerMemFuncForSize(MF); 4275 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst); 4276 if (FI && !MFI->isFixedObjectIndex(FI->getIndex())) 4277 DstAlignCanChange = true; 4278 unsigned SrcAlign = DAG.InferPtrAlignment(Src); 4279 if (Align > SrcAlign) 4280 SrcAlign = Align; 4281 StringRef Str; 4282 bool CopyFromStr = isMemSrcFromString(Src, Str); 4283 bool isZeroStr = CopyFromStr && Str.empty(); 4284 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize); 4285 4286 if (!FindOptimalMemOpLowering(MemOps, Limit, Size, 4287 (DstAlignCanChange ? 0 : Align), 4288 (isZeroStr ? 0 : SrcAlign), 4289 false, false, CopyFromStr, true, DAG, TLI)) 4290 return SDValue(); 4291 4292 if (DstAlignCanChange) { 4293 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); 4294 unsigned NewAlign = (unsigned)DAG.getDataLayout().getABITypeAlignment(Ty); 4295 4296 // Don't promote to an alignment that would require dynamic stack 4297 // realignment. 4298 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); 4299 if (!TRI->needsStackRealignment(MF)) 4300 while (NewAlign > Align && 4301 DAG.getDataLayout().exceedsNaturalStackAlignment(NewAlign)) 4302 NewAlign /= 2; 4303 4304 if (NewAlign > Align) { 4305 // Give the stack frame object a larger alignment if needed. 4306 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) 4307 MFI->setObjectAlignment(FI->getIndex(), NewAlign); 4308 Align = NewAlign; 4309 } 4310 } 4311 4312 SmallVector<SDValue, 8> OutChains; 4313 unsigned NumMemOps = MemOps.size(); 4314 uint64_t SrcOff = 0, DstOff = 0; 4315 for (unsigned i = 0; i != NumMemOps; ++i) { 4316 EVT VT = MemOps[i]; 4317 unsigned VTSize = VT.getSizeInBits() / 8; 4318 SDValue Value, Store; 4319 4320 if (VTSize > Size) { 4321 // Issuing an unaligned load / store pair that overlaps with the previous 4322 // pair. Adjust the offset accordingly. 4323 assert(i == NumMemOps-1 && i != 0); 4324 SrcOff -= VTSize - Size; 4325 DstOff -= VTSize - Size; 4326 } 4327 4328 if (CopyFromStr && 4329 (isZeroStr || (VT.isInteger() && !VT.isVector()))) { 4330 // It's unlikely a store of a vector immediate can be done in a single 4331 // instruction. It would require a load from a constantpool first. 4332 // We only handle zero vectors here. 4333 // FIXME: Handle other cases where store of vector immediate is done in 4334 // a single instruction. 4335 Value = getMemsetStringVal(VT, dl, DAG, TLI, Str.substr(SrcOff)); 4336 if (Value.getNode()) 4337 Store = DAG.getStore(Chain, dl, Value, 4338 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 4339 DstPtrInfo.getWithOffset(DstOff), isVol, 4340 false, Align); 4341 } 4342 4343 if (!Store.getNode()) { 4344 // The type might not be legal for the target. This should only happen 4345 // if the type is smaller than a legal type, as on PPC, so the right 4346 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify 4347 // to Load/Store if NVT==VT. 4348 // FIXME does the case above also need this? 4349 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT); 4350 assert(NVT.bitsGE(VT)); 4351 Value = DAG.getExtLoad(ISD::EXTLOAD, dl, NVT, Chain, 4352 getMemBasePlusOffset(Src, SrcOff, dl, DAG), 4353 SrcPtrInfo.getWithOffset(SrcOff), VT, isVol, false, 4354 false, MinAlign(SrcAlign, SrcOff)); 4355 Store = DAG.getTruncStore(Chain, dl, Value, 4356 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 4357 DstPtrInfo.getWithOffset(DstOff), VT, isVol, 4358 false, Align); 4359 } 4360 OutChains.push_back(Store); 4361 SrcOff += VTSize; 4362 DstOff += VTSize; 4363 Size -= VTSize; 4364 } 4365 4366 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 4367 } 4368 4369 static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, SDLoc dl, 4370 SDValue Chain, SDValue Dst, 4371 SDValue Src, uint64_t Size, 4372 unsigned Align, bool isVol, 4373 bool AlwaysInline, 4374 MachinePointerInfo DstPtrInfo, 4375 MachinePointerInfo SrcPtrInfo) { 4376 // Turn a memmove of undef to nop. 4377 if (Src.getOpcode() == ISD::UNDEF) 4378 return Chain; 4379 4380 // Expand memmove to a series of load and store ops if the size operand falls 4381 // below a certain threshold. 4382 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 4383 std::vector<EVT> MemOps; 4384 bool DstAlignCanChange = false; 4385 MachineFunction &MF = DAG.getMachineFunction(); 4386 MachineFrameInfo *MFI = MF.getFrameInfo(); 4387 bool OptSize = shouldLowerMemFuncForSize(MF); 4388 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst); 4389 if (FI && !MFI->isFixedObjectIndex(FI->getIndex())) 4390 DstAlignCanChange = true; 4391 unsigned SrcAlign = DAG.InferPtrAlignment(Src); 4392 if (Align > SrcAlign) 4393 SrcAlign = Align; 4394 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize); 4395 4396 if (!FindOptimalMemOpLowering(MemOps, Limit, Size, 4397 (DstAlignCanChange ? 0 : Align), SrcAlign, 4398 false, false, false, false, DAG, TLI)) 4399 return SDValue(); 4400 4401 if (DstAlignCanChange) { 4402 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); 4403 unsigned NewAlign = (unsigned)DAG.getDataLayout().getABITypeAlignment(Ty); 4404 if (NewAlign > Align) { 4405 // Give the stack frame object a larger alignment if needed. 4406 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) 4407 MFI->setObjectAlignment(FI->getIndex(), NewAlign); 4408 Align = NewAlign; 4409 } 4410 } 4411 4412 uint64_t SrcOff = 0, DstOff = 0; 4413 SmallVector<SDValue, 8> LoadValues; 4414 SmallVector<SDValue, 8> LoadChains; 4415 SmallVector<SDValue, 8> OutChains; 4416 unsigned NumMemOps = MemOps.size(); 4417 for (unsigned i = 0; i < NumMemOps; i++) { 4418 EVT VT = MemOps[i]; 4419 unsigned VTSize = VT.getSizeInBits() / 8; 4420 SDValue Value; 4421 4422 Value = DAG.getLoad(VT, dl, Chain, 4423 getMemBasePlusOffset(Src, SrcOff, dl, DAG), 4424 SrcPtrInfo.getWithOffset(SrcOff), isVol, 4425 false, false, SrcAlign); 4426 LoadValues.push_back(Value); 4427 LoadChains.push_back(Value.getValue(1)); 4428 SrcOff += VTSize; 4429 } 4430 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains); 4431 OutChains.clear(); 4432 for (unsigned i = 0; i < NumMemOps; i++) { 4433 EVT VT = MemOps[i]; 4434 unsigned VTSize = VT.getSizeInBits() / 8; 4435 SDValue Store; 4436 4437 Store = DAG.getStore(Chain, dl, LoadValues[i], 4438 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 4439 DstPtrInfo.getWithOffset(DstOff), isVol, false, Align); 4440 OutChains.push_back(Store); 4441 DstOff += VTSize; 4442 } 4443 4444 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 4445 } 4446 4447 /// \brief Lower the call to 'memset' intrinsic function into a series of store 4448 /// operations. 4449 /// 4450 /// \param DAG Selection DAG where lowered code is placed. 4451 /// \param dl Link to corresponding IR location. 4452 /// \param Chain Control flow dependency. 4453 /// \param Dst Pointer to destination memory location. 4454 /// \param Src Value of byte to write into the memory. 4455 /// \param Size Number of bytes to write. 4456 /// \param Align Alignment of the destination in bytes. 4457 /// \param isVol True if destination is volatile. 4458 /// \param DstPtrInfo IR information on the memory pointer. 4459 /// \returns New head in the control flow, if lowering was successful, empty 4460 /// SDValue otherwise. 4461 /// 4462 /// The function tries to replace 'llvm.memset' intrinsic with several store 4463 /// operations and value calculation code. This is usually profitable for small 4464 /// memory size. 4465 static SDValue getMemsetStores(SelectionDAG &DAG, SDLoc dl, 4466 SDValue Chain, SDValue Dst, 4467 SDValue Src, uint64_t Size, 4468 unsigned Align, bool isVol, 4469 MachinePointerInfo DstPtrInfo) { 4470 // Turn a memset of undef to nop. 4471 if (Src.getOpcode() == ISD::UNDEF) 4472 return Chain; 4473 4474 // Expand memset to a series of load/store ops if the size operand 4475 // falls below a certain threshold. 4476 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 4477 std::vector<EVT> MemOps; 4478 bool DstAlignCanChange = false; 4479 MachineFunction &MF = DAG.getMachineFunction(); 4480 MachineFrameInfo *MFI = MF.getFrameInfo(); 4481 bool OptSize = shouldLowerMemFuncForSize(MF); 4482 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst); 4483 if (FI && !MFI->isFixedObjectIndex(FI->getIndex())) 4484 DstAlignCanChange = true; 4485 bool IsZeroVal = 4486 isa<ConstantSDNode>(Src) && cast<ConstantSDNode>(Src)->isNullValue(); 4487 if (!FindOptimalMemOpLowering(MemOps, TLI.getMaxStoresPerMemset(OptSize), 4488 Size, (DstAlignCanChange ? 0 : Align), 0, 4489 true, IsZeroVal, false, true, DAG, TLI)) 4490 return SDValue(); 4491 4492 if (DstAlignCanChange) { 4493 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); 4494 unsigned NewAlign = (unsigned)DAG.getDataLayout().getABITypeAlignment(Ty); 4495 if (NewAlign > Align) { 4496 // Give the stack frame object a larger alignment if needed. 4497 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) 4498 MFI->setObjectAlignment(FI->getIndex(), NewAlign); 4499 Align = NewAlign; 4500 } 4501 } 4502 4503 SmallVector<SDValue, 8> OutChains; 4504 uint64_t DstOff = 0; 4505 unsigned NumMemOps = MemOps.size(); 4506 4507 // Find the largest store and generate the bit pattern for it. 4508 EVT LargestVT = MemOps[0]; 4509 for (unsigned i = 1; i < NumMemOps; i++) 4510 if (MemOps[i].bitsGT(LargestVT)) 4511 LargestVT = MemOps[i]; 4512 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl); 4513 4514 for (unsigned i = 0; i < NumMemOps; i++) { 4515 EVT VT = MemOps[i]; 4516 unsigned VTSize = VT.getSizeInBits() / 8; 4517 if (VTSize > Size) { 4518 // Issuing an unaligned load / store pair that overlaps with the previous 4519 // pair. Adjust the offset accordingly. 4520 assert(i == NumMemOps-1 && i != 0); 4521 DstOff -= VTSize - Size; 4522 } 4523 4524 // If this store is smaller than the largest store see whether we can get 4525 // the smaller value for free with a truncate. 4526 SDValue Value = MemSetValue; 4527 if (VT.bitsLT(LargestVT)) { 4528 if (!LargestVT.isVector() && !VT.isVector() && 4529 TLI.isTruncateFree(LargestVT, VT)) 4530 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue); 4531 else 4532 Value = getMemsetValue(Src, VT, DAG, dl); 4533 } 4534 assert(Value.getValueType() == VT && "Value with wrong type."); 4535 SDValue Store = DAG.getStore(Chain, dl, Value, 4536 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 4537 DstPtrInfo.getWithOffset(DstOff), 4538 isVol, false, Align); 4539 OutChains.push_back(Store); 4540 DstOff += VT.getSizeInBits() / 8; 4541 Size -= VTSize; 4542 } 4543 4544 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 4545 } 4546 4547 SDValue SelectionDAG::getMemcpy(SDValue Chain, SDLoc dl, SDValue Dst, 4548 SDValue Src, SDValue Size, 4549 unsigned Align, bool isVol, bool AlwaysInline, 4550 bool isTailCall, MachinePointerInfo DstPtrInfo, 4551 MachinePointerInfo SrcPtrInfo) { 4552 assert(Align && "The SDAG layer expects explicit alignment and reserves 0"); 4553 4554 // Check to see if we should lower the memcpy to loads and stores first. 4555 // For cases within the target-specified limits, this is the best choice. 4556 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size); 4557 if (ConstantSize) { 4558 // Memcpy with size zero? Just return the original chain. 4559 if (ConstantSize->isNullValue()) 4560 return Chain; 4561 4562 SDValue Result = getMemcpyLoadsAndStores(*this, dl, Chain, Dst, Src, 4563 ConstantSize->getZExtValue(),Align, 4564 isVol, false, DstPtrInfo, SrcPtrInfo); 4565 if (Result.getNode()) 4566 return Result; 4567 } 4568 4569 // Then check to see if we should lower the memcpy with target-specific 4570 // code. If the target chooses to do this, this is the next best. 4571 if (TSI) { 4572 SDValue Result = TSI->EmitTargetCodeForMemcpy( 4573 *this, dl, Chain, Dst, Src, Size, Align, isVol, AlwaysInline, 4574 DstPtrInfo, SrcPtrInfo); 4575 if (Result.getNode()) 4576 return Result; 4577 } 4578 4579 // If we really need inline code and the target declined to provide it, 4580 // use a (potentially long) sequence of loads and stores. 4581 if (AlwaysInline) { 4582 assert(ConstantSize && "AlwaysInline requires a constant size!"); 4583 return getMemcpyLoadsAndStores(*this, dl, Chain, Dst, Src, 4584 ConstantSize->getZExtValue(), Align, isVol, 4585 true, DstPtrInfo, SrcPtrInfo); 4586 } 4587 4588 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc 4589 // memcpy is not guaranteed to be safe. libc memcpys aren't required to 4590 // respect volatile, so they may do things like read or write memory 4591 // beyond the given memory regions. But fixing this isn't easy, and most 4592 // people don't care. 4593 4594 // Emit a library call. 4595 TargetLowering::ArgListTy Args; 4596 TargetLowering::ArgListEntry Entry; 4597 Entry.Ty = getDataLayout().getIntPtrType(*getContext()); 4598 Entry.Node = Dst; Args.push_back(Entry); 4599 Entry.Node = Src; Args.push_back(Entry); 4600 Entry.Node = Size; Args.push_back(Entry); 4601 // FIXME: pass in SDLoc 4602 TargetLowering::CallLoweringInfo CLI(*this); 4603 CLI.setDebugLoc(dl) 4604 .setChain(Chain) 4605 .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY), 4606 Type::getVoidTy(*getContext()), 4607 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY), 4608 TLI->getPointerTy(getDataLayout())), 4609 std::move(Args), 0) 4610 .setDiscardResult() 4611 .setTailCall(isTailCall); 4612 4613 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI); 4614 return CallResult.second; 4615 } 4616 4617 SDValue SelectionDAG::getMemmove(SDValue Chain, SDLoc dl, SDValue Dst, 4618 SDValue Src, SDValue Size, 4619 unsigned Align, bool isVol, bool isTailCall, 4620 MachinePointerInfo DstPtrInfo, 4621 MachinePointerInfo SrcPtrInfo) { 4622 assert(Align && "The SDAG layer expects explicit alignment and reserves 0"); 4623 4624 // Check to see if we should lower the memmove to loads and stores first. 4625 // For cases within the target-specified limits, this is the best choice. 4626 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size); 4627 if (ConstantSize) { 4628 // Memmove with size zero? Just return the original chain. 4629 if (ConstantSize->isNullValue()) 4630 return Chain; 4631 4632 SDValue Result = 4633 getMemmoveLoadsAndStores(*this, dl, Chain, Dst, Src, 4634 ConstantSize->getZExtValue(), Align, isVol, 4635 false, DstPtrInfo, SrcPtrInfo); 4636 if (Result.getNode()) 4637 return Result; 4638 } 4639 4640 // Then check to see if we should lower the memmove with target-specific 4641 // code. If the target chooses to do this, this is the next best. 4642 if (TSI) { 4643 SDValue Result = TSI->EmitTargetCodeForMemmove( 4644 *this, dl, Chain, Dst, Src, Size, Align, isVol, DstPtrInfo, SrcPtrInfo); 4645 if (Result.getNode()) 4646 return Result; 4647 } 4648 4649 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may 4650 // not be safe. See memcpy above for more details. 4651 4652 // Emit a library call. 4653 TargetLowering::ArgListTy Args; 4654 TargetLowering::ArgListEntry Entry; 4655 Entry.Ty = getDataLayout().getIntPtrType(*getContext()); 4656 Entry.Node = Dst; Args.push_back(Entry); 4657 Entry.Node = Src; Args.push_back(Entry); 4658 Entry.Node = Size; Args.push_back(Entry); 4659 // FIXME: pass in SDLoc 4660 TargetLowering::CallLoweringInfo CLI(*this); 4661 CLI.setDebugLoc(dl) 4662 .setChain(Chain) 4663 .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE), 4664 Type::getVoidTy(*getContext()), 4665 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE), 4666 TLI->getPointerTy(getDataLayout())), 4667 std::move(Args), 0) 4668 .setDiscardResult() 4669 .setTailCall(isTailCall); 4670 4671 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI); 4672 return CallResult.second; 4673 } 4674 4675 SDValue SelectionDAG::getMemset(SDValue Chain, SDLoc dl, SDValue Dst, 4676 SDValue Src, SDValue Size, 4677 unsigned Align, bool isVol, bool isTailCall, 4678 MachinePointerInfo DstPtrInfo) { 4679 assert(Align && "The SDAG layer expects explicit alignment and reserves 0"); 4680 4681 // Check to see if we should lower the memset to stores first. 4682 // For cases within the target-specified limits, this is the best choice. 4683 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size); 4684 if (ConstantSize) { 4685 // Memset with size zero? Just return the original chain. 4686 if (ConstantSize->isNullValue()) 4687 return Chain; 4688 4689 SDValue Result = 4690 getMemsetStores(*this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), 4691 Align, isVol, DstPtrInfo); 4692 4693 if (Result.getNode()) 4694 return Result; 4695 } 4696 4697 // Then check to see if we should lower the memset with target-specific 4698 // code. If the target chooses to do this, this is the next best. 4699 if (TSI) { 4700 SDValue Result = TSI->EmitTargetCodeForMemset( 4701 *this, dl, Chain, Dst, Src, Size, Align, isVol, DstPtrInfo); 4702 if (Result.getNode()) 4703 return Result; 4704 } 4705 4706 // Emit a library call. 4707 Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext()); 4708 TargetLowering::ArgListTy Args; 4709 TargetLowering::ArgListEntry Entry; 4710 Entry.Node = Dst; Entry.Ty = IntPtrTy; 4711 Args.push_back(Entry); 4712 Entry.Node = Src; 4713 Entry.Ty = Src.getValueType().getTypeForEVT(*getContext()); 4714 Args.push_back(Entry); 4715 Entry.Node = Size; 4716 Entry.Ty = IntPtrTy; 4717 Args.push_back(Entry); 4718 4719 // FIXME: pass in SDLoc 4720 TargetLowering::CallLoweringInfo CLI(*this); 4721 CLI.setDebugLoc(dl) 4722 .setChain(Chain) 4723 .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET), 4724 Type::getVoidTy(*getContext()), 4725 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET), 4726 TLI->getPointerTy(getDataLayout())), 4727 std::move(Args), 0) 4728 .setDiscardResult() 4729 .setTailCall(isTailCall); 4730 4731 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI); 4732 return CallResult.second; 4733 } 4734 4735 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 4736 SDVTList VTList, ArrayRef<SDValue> Ops, 4737 MachineMemOperand *MMO, 4738 AtomicOrdering SuccessOrdering, 4739 AtomicOrdering FailureOrdering, 4740 SynchronizationScope SynchScope) { 4741 FoldingSetNodeID ID; 4742 ID.AddInteger(MemVT.getRawBits()); 4743 AddNodeIDNode(ID, Opcode, VTList, Ops); 4744 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 4745 void* IP = nullptr; 4746 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 4747 cast<AtomicSDNode>(E)->refineAlignment(MMO); 4748 return SDValue(E, 0); 4749 } 4750 4751 // Allocate the operands array for the node out of the BumpPtrAllocator, since 4752 // SDNode doesn't have access to it. This memory will be "leaked" when 4753 // the node is deallocated, but recovered when the allocator is released. 4754 // If the number of operands is less than 5 we use AtomicSDNode's internal 4755 // storage. 4756 unsigned NumOps = Ops.size(); 4757 SDUse *DynOps = NumOps > 4 ? OperandAllocator.Allocate<SDUse>(NumOps) 4758 : nullptr; 4759 4760 SDNode *N = new (NodeAllocator) AtomicSDNode(Opcode, dl.getIROrder(), 4761 dl.getDebugLoc(), VTList, MemVT, 4762 Ops.data(), DynOps, NumOps, MMO, 4763 SuccessOrdering, FailureOrdering, 4764 SynchScope); 4765 CSEMap.InsertNode(N, IP); 4766 InsertNode(N); 4767 return SDValue(N, 0); 4768 } 4769 4770 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 4771 SDVTList VTList, ArrayRef<SDValue> Ops, 4772 MachineMemOperand *MMO, 4773 AtomicOrdering Ordering, 4774 SynchronizationScope SynchScope) { 4775 return getAtomic(Opcode, dl, MemVT, VTList, Ops, MMO, Ordering, 4776 Ordering, SynchScope); 4777 } 4778 4779 SDValue SelectionDAG::getAtomicCmpSwap( 4780 unsigned Opcode, SDLoc dl, EVT MemVT, SDVTList VTs, SDValue Chain, 4781 SDValue Ptr, SDValue Cmp, SDValue Swp, MachinePointerInfo PtrInfo, 4782 unsigned Alignment, AtomicOrdering SuccessOrdering, 4783 AtomicOrdering FailureOrdering, SynchronizationScope SynchScope) { 4784 assert(Opcode == ISD::ATOMIC_CMP_SWAP || 4785 Opcode == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS); 4786 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types"); 4787 4788 if (Alignment == 0) // Ensure that codegen never sees alignment 0 4789 Alignment = getEVTAlignment(MemVT); 4790 4791 MachineFunction &MF = getMachineFunction(); 4792 4793 // FIXME: Volatile isn't really correct; we should keep track of atomic 4794 // orderings in the memoperand. 4795 unsigned Flags = MachineMemOperand::MOVolatile; 4796 Flags |= MachineMemOperand::MOLoad; 4797 Flags |= MachineMemOperand::MOStore; 4798 4799 MachineMemOperand *MMO = 4800 MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment); 4801 4802 return getAtomicCmpSwap(Opcode, dl, MemVT, VTs, Chain, Ptr, Cmp, Swp, MMO, 4803 SuccessOrdering, FailureOrdering, SynchScope); 4804 } 4805 4806 SDValue SelectionDAG::getAtomicCmpSwap(unsigned Opcode, SDLoc dl, EVT MemVT, 4807 SDVTList VTs, SDValue Chain, SDValue Ptr, 4808 SDValue Cmp, SDValue Swp, 4809 MachineMemOperand *MMO, 4810 AtomicOrdering SuccessOrdering, 4811 AtomicOrdering FailureOrdering, 4812 SynchronizationScope SynchScope) { 4813 assert(Opcode == ISD::ATOMIC_CMP_SWAP || 4814 Opcode == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS); 4815 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types"); 4816 4817 SDValue Ops[] = {Chain, Ptr, Cmp, Swp}; 4818 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO, 4819 SuccessOrdering, FailureOrdering, SynchScope); 4820 } 4821 4822 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 4823 SDValue Chain, 4824 SDValue Ptr, SDValue Val, 4825 const Value* PtrVal, 4826 unsigned Alignment, 4827 AtomicOrdering Ordering, 4828 SynchronizationScope SynchScope) { 4829 if (Alignment == 0) // Ensure that codegen never sees alignment 0 4830 Alignment = getEVTAlignment(MemVT); 4831 4832 MachineFunction &MF = getMachineFunction(); 4833 // An atomic store does not load. An atomic load does not store. 4834 // (An atomicrmw obviously both loads and stores.) 4835 // For now, atomics are considered to be volatile always, and they are 4836 // chained as such. 4837 // FIXME: Volatile isn't really correct; we should keep track of atomic 4838 // orderings in the memoperand. 4839 unsigned Flags = MachineMemOperand::MOVolatile; 4840 if (Opcode != ISD::ATOMIC_STORE) 4841 Flags |= MachineMemOperand::MOLoad; 4842 if (Opcode != ISD::ATOMIC_LOAD) 4843 Flags |= MachineMemOperand::MOStore; 4844 4845 MachineMemOperand *MMO = 4846 MF.getMachineMemOperand(MachinePointerInfo(PtrVal), Flags, 4847 MemVT.getStoreSize(), Alignment); 4848 4849 return getAtomic(Opcode, dl, MemVT, Chain, Ptr, Val, MMO, 4850 Ordering, SynchScope); 4851 } 4852 4853 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 4854 SDValue Chain, 4855 SDValue Ptr, SDValue Val, 4856 MachineMemOperand *MMO, 4857 AtomicOrdering Ordering, 4858 SynchronizationScope SynchScope) { 4859 assert((Opcode == ISD::ATOMIC_LOAD_ADD || 4860 Opcode == ISD::ATOMIC_LOAD_SUB || 4861 Opcode == ISD::ATOMIC_LOAD_AND || 4862 Opcode == ISD::ATOMIC_LOAD_OR || 4863 Opcode == ISD::ATOMIC_LOAD_XOR || 4864 Opcode == ISD::ATOMIC_LOAD_NAND || 4865 Opcode == ISD::ATOMIC_LOAD_MIN || 4866 Opcode == ISD::ATOMIC_LOAD_MAX || 4867 Opcode == ISD::ATOMIC_LOAD_UMIN || 4868 Opcode == ISD::ATOMIC_LOAD_UMAX || 4869 Opcode == ISD::ATOMIC_SWAP || 4870 Opcode == ISD::ATOMIC_STORE) && 4871 "Invalid Atomic Op"); 4872 4873 EVT VT = Val.getValueType(); 4874 4875 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) : 4876 getVTList(VT, MVT::Other); 4877 SDValue Ops[] = {Chain, Ptr, Val}; 4878 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO, Ordering, SynchScope); 4879 } 4880 4881 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 4882 EVT VT, SDValue Chain, 4883 SDValue Ptr, 4884 MachineMemOperand *MMO, 4885 AtomicOrdering Ordering, 4886 SynchronizationScope SynchScope) { 4887 assert(Opcode == ISD::ATOMIC_LOAD && "Invalid Atomic Op"); 4888 4889 SDVTList VTs = getVTList(VT, MVT::Other); 4890 SDValue Ops[] = {Chain, Ptr}; 4891 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO, Ordering, SynchScope); 4892 } 4893 4894 /// getMergeValues - Create a MERGE_VALUES node from the given operands. 4895 SDValue SelectionDAG::getMergeValues(ArrayRef<SDValue> Ops, SDLoc dl) { 4896 if (Ops.size() == 1) 4897 return Ops[0]; 4898 4899 SmallVector<EVT, 4> VTs; 4900 VTs.reserve(Ops.size()); 4901 for (unsigned i = 0; i < Ops.size(); ++i) 4902 VTs.push_back(Ops[i].getValueType()); 4903 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops); 4904 } 4905 4906 SDValue 4907 SelectionDAG::getMemIntrinsicNode(unsigned Opcode, SDLoc dl, SDVTList VTList, 4908 ArrayRef<SDValue> Ops, 4909 EVT MemVT, MachinePointerInfo PtrInfo, 4910 unsigned Align, bool Vol, 4911 bool ReadMem, bool WriteMem, unsigned Size) { 4912 if (Align == 0) // Ensure that codegen never sees alignment 0 4913 Align = getEVTAlignment(MemVT); 4914 4915 MachineFunction &MF = getMachineFunction(); 4916 unsigned Flags = 0; 4917 if (WriteMem) 4918 Flags |= MachineMemOperand::MOStore; 4919 if (ReadMem) 4920 Flags |= MachineMemOperand::MOLoad; 4921 if (Vol) 4922 Flags |= MachineMemOperand::MOVolatile; 4923 if (!Size) 4924 Size = MemVT.getStoreSize(); 4925 MachineMemOperand *MMO = 4926 MF.getMachineMemOperand(PtrInfo, Flags, Size, Align); 4927 4928 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO); 4929 } 4930 4931 SDValue 4932 SelectionDAG::getMemIntrinsicNode(unsigned Opcode, SDLoc dl, SDVTList VTList, 4933 ArrayRef<SDValue> Ops, EVT MemVT, 4934 MachineMemOperand *MMO) { 4935 assert((Opcode == ISD::INTRINSIC_VOID || 4936 Opcode == ISD::INTRINSIC_W_CHAIN || 4937 Opcode == ISD::PREFETCH || 4938 Opcode == ISD::LIFETIME_START || 4939 Opcode == ISD::LIFETIME_END || 4940 (Opcode <= INT_MAX && 4941 (int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) && 4942 "Opcode is not a memory-accessing opcode!"); 4943 4944 // Memoize the node unless it returns a flag. 4945 MemIntrinsicSDNode *N; 4946 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) { 4947 FoldingSetNodeID ID; 4948 AddNodeIDNode(ID, Opcode, VTList, Ops); 4949 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 4950 void *IP = nullptr; 4951 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 4952 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO); 4953 return SDValue(E, 0); 4954 } 4955 4956 N = new (NodeAllocator) MemIntrinsicSDNode(Opcode, dl.getIROrder(), 4957 dl.getDebugLoc(), VTList, Ops, 4958 MemVT, MMO); 4959 CSEMap.InsertNode(N, IP); 4960 } else { 4961 N = new (NodeAllocator) MemIntrinsicSDNode(Opcode, dl.getIROrder(), 4962 dl.getDebugLoc(), VTList, Ops, 4963 MemVT, MMO); 4964 } 4965 InsertNode(N); 4966 return SDValue(N, 0); 4967 } 4968 4969 /// InferPointerInfo - If the specified ptr/offset is a frame index, infer a 4970 /// MachinePointerInfo record from it. This is particularly useful because the 4971 /// code generator has many cases where it doesn't bother passing in a 4972 /// MachinePointerInfo to getLoad or getStore when it has "FI+Cst". 4973 static MachinePointerInfo InferPointerInfo(SelectionDAG &DAG, SDValue Ptr, 4974 int64_t Offset = 0) { 4975 // If this is FI+Offset, we can model it. 4976 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) 4977 return MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), 4978 FI->getIndex(), Offset); 4979 4980 // If this is (FI+Offset1)+Offset2, we can model it. 4981 if (Ptr.getOpcode() != ISD::ADD || 4982 !isa<ConstantSDNode>(Ptr.getOperand(1)) || 4983 !isa<FrameIndexSDNode>(Ptr.getOperand(0))) 4984 return MachinePointerInfo(); 4985 4986 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex(); 4987 return MachinePointerInfo::getFixedStack( 4988 DAG.getMachineFunction(), FI, 4989 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue()); 4990 } 4991 4992 /// InferPointerInfo - If the specified ptr/offset is a frame index, infer a 4993 /// MachinePointerInfo record from it. This is particularly useful because the 4994 /// code generator has many cases where it doesn't bother passing in a 4995 /// MachinePointerInfo to getLoad or getStore when it has "FI+Cst". 4996 static MachinePointerInfo InferPointerInfo(SelectionDAG &DAG, SDValue Ptr, 4997 SDValue OffsetOp) { 4998 // If the 'Offset' value isn't a constant, we can't handle this. 4999 if (ConstantSDNode *OffsetNode = dyn_cast<ConstantSDNode>(OffsetOp)) 5000 return InferPointerInfo(DAG, Ptr, OffsetNode->getSExtValue()); 5001 if (OffsetOp.getOpcode() == ISD::UNDEF) 5002 return InferPointerInfo(DAG, Ptr); 5003 return MachinePointerInfo(); 5004 } 5005 5006 5007 SDValue 5008 SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, 5009 EVT VT, SDLoc dl, SDValue Chain, 5010 SDValue Ptr, SDValue Offset, 5011 MachinePointerInfo PtrInfo, EVT MemVT, 5012 bool isVolatile, bool isNonTemporal, bool isInvariant, 5013 unsigned Alignment, const AAMDNodes &AAInfo, 5014 const MDNode *Ranges) { 5015 assert(Chain.getValueType() == MVT::Other && 5016 "Invalid chain type"); 5017 if (Alignment == 0) // Ensure that codegen never sees alignment 0 5018 Alignment = getEVTAlignment(VT); 5019 5020 unsigned Flags = MachineMemOperand::MOLoad; 5021 if (isVolatile) 5022 Flags |= MachineMemOperand::MOVolatile; 5023 if (isNonTemporal) 5024 Flags |= MachineMemOperand::MONonTemporal; 5025 if (isInvariant) 5026 Flags |= MachineMemOperand::MOInvariant; 5027 5028 // If we don't have a PtrInfo, infer the trivial frame index case to simplify 5029 // clients. 5030 if (PtrInfo.V.isNull()) 5031 PtrInfo = InferPointerInfo(*this, Ptr, Offset); 5032 5033 MachineFunction &MF = getMachineFunction(); 5034 MachineMemOperand *MMO = 5035 MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment, 5036 AAInfo, Ranges); 5037 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO); 5038 } 5039 5040 SDValue 5041 SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, 5042 EVT VT, SDLoc dl, SDValue Chain, 5043 SDValue Ptr, SDValue Offset, EVT MemVT, 5044 MachineMemOperand *MMO) { 5045 if (VT == MemVT) { 5046 ExtType = ISD::NON_EXTLOAD; 5047 } else if (ExtType == ISD::NON_EXTLOAD) { 5048 assert(VT == MemVT && "Non-extending load from different memory type!"); 5049 } else { 5050 // Extending load. 5051 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) && 5052 "Should only be an extending load, not truncating!"); 5053 assert(VT.isInteger() == MemVT.isInteger() && 5054 "Cannot convert from FP to Int or Int -> FP!"); 5055 assert(VT.isVector() == MemVT.isVector() && 5056 "Cannot use an ext load to convert to or from a vector!"); 5057 assert((!VT.isVector() || 5058 VT.getVectorNumElements() == MemVT.getVectorNumElements()) && 5059 "Cannot use an ext load to change the number of vector elements!"); 5060 } 5061 5062 bool Indexed = AM != ISD::UNINDEXED; 5063 assert((Indexed || Offset.getOpcode() == ISD::UNDEF) && 5064 "Unindexed load with an offset!"); 5065 5066 SDVTList VTs = Indexed ? 5067 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other); 5068 SDValue Ops[] = { Chain, Ptr, Offset }; 5069 FoldingSetNodeID ID; 5070 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops); 5071 ID.AddInteger(MemVT.getRawBits()); 5072 ID.AddInteger(encodeMemSDNodeFlags(ExtType, AM, MMO->isVolatile(), 5073 MMO->isNonTemporal(), 5074 MMO->isInvariant())); 5075 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 5076 void *IP = nullptr; 5077 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 5078 cast<LoadSDNode>(E)->refineAlignment(MMO); 5079 return SDValue(E, 0); 5080 } 5081 SDNode *N = new (NodeAllocator) LoadSDNode(Ops, dl.getIROrder(), 5082 dl.getDebugLoc(), VTs, AM, ExtType, 5083 MemVT, MMO); 5084 CSEMap.InsertNode(N, IP); 5085 InsertNode(N); 5086 return SDValue(N, 0); 5087 } 5088 5089 SDValue SelectionDAG::getLoad(EVT VT, SDLoc dl, 5090 SDValue Chain, SDValue Ptr, 5091 MachinePointerInfo PtrInfo, 5092 bool isVolatile, bool isNonTemporal, 5093 bool isInvariant, unsigned Alignment, 5094 const AAMDNodes &AAInfo, 5095 const MDNode *Ranges) { 5096 SDValue Undef = getUNDEF(Ptr.getValueType()); 5097 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef, 5098 PtrInfo, VT, isVolatile, isNonTemporal, isInvariant, Alignment, 5099 AAInfo, Ranges); 5100 } 5101 5102 SDValue SelectionDAG::getLoad(EVT VT, SDLoc dl, 5103 SDValue Chain, SDValue Ptr, 5104 MachineMemOperand *MMO) { 5105 SDValue Undef = getUNDEF(Ptr.getValueType()); 5106 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef, 5107 VT, MMO); 5108 } 5109 5110 SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT, 5111 SDValue Chain, SDValue Ptr, 5112 MachinePointerInfo PtrInfo, EVT MemVT, 5113 bool isVolatile, bool isNonTemporal, 5114 bool isInvariant, unsigned Alignment, 5115 const AAMDNodes &AAInfo) { 5116 SDValue Undef = getUNDEF(Ptr.getValueType()); 5117 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, 5118 PtrInfo, MemVT, isVolatile, isNonTemporal, isInvariant, 5119 Alignment, AAInfo); 5120 } 5121 5122 5123 SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT, 5124 SDValue Chain, SDValue Ptr, EVT MemVT, 5125 MachineMemOperand *MMO) { 5126 SDValue Undef = getUNDEF(Ptr.getValueType()); 5127 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, 5128 MemVT, MMO); 5129 } 5130 5131 SDValue 5132 SelectionDAG::getIndexedLoad(SDValue OrigLoad, SDLoc dl, SDValue Base, 5133 SDValue Offset, ISD::MemIndexedMode AM) { 5134 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad); 5135 assert(LD->getOffset().getOpcode() == ISD::UNDEF && 5136 "Load is already a indexed load!"); 5137 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl, 5138 LD->getChain(), Base, Offset, LD->getPointerInfo(), 5139 LD->getMemoryVT(), LD->isVolatile(), LD->isNonTemporal(), 5140 false, LD->getAlignment()); 5141 } 5142 5143 SDValue SelectionDAG::getStore(SDValue Chain, SDLoc dl, SDValue Val, 5144 SDValue Ptr, MachinePointerInfo PtrInfo, 5145 bool isVolatile, bool isNonTemporal, 5146 unsigned Alignment, const AAMDNodes &AAInfo) { 5147 assert(Chain.getValueType() == MVT::Other && 5148 "Invalid chain type"); 5149 if (Alignment == 0) // Ensure that codegen never sees alignment 0 5150 Alignment = getEVTAlignment(Val.getValueType()); 5151 5152 unsigned Flags = MachineMemOperand::MOStore; 5153 if (isVolatile) 5154 Flags |= MachineMemOperand::MOVolatile; 5155 if (isNonTemporal) 5156 Flags |= MachineMemOperand::MONonTemporal; 5157 5158 if (PtrInfo.V.isNull()) 5159 PtrInfo = InferPointerInfo(*this, Ptr); 5160 5161 MachineFunction &MF = getMachineFunction(); 5162 MachineMemOperand *MMO = 5163 MF.getMachineMemOperand(PtrInfo, Flags, 5164 Val.getValueType().getStoreSize(), Alignment, 5165 AAInfo); 5166 5167 return getStore(Chain, dl, Val, Ptr, MMO); 5168 } 5169 5170 SDValue SelectionDAG::getStore(SDValue Chain, SDLoc dl, SDValue Val, 5171 SDValue Ptr, MachineMemOperand *MMO) { 5172 assert(Chain.getValueType() == MVT::Other && 5173 "Invalid chain type"); 5174 EVT VT = Val.getValueType(); 5175 SDVTList VTs = getVTList(MVT::Other); 5176 SDValue Undef = getUNDEF(Ptr.getValueType()); 5177 SDValue Ops[] = { Chain, Val, Ptr, Undef }; 5178 FoldingSetNodeID ID; 5179 AddNodeIDNode(ID, ISD::STORE, VTs, Ops); 5180 ID.AddInteger(VT.getRawBits()); 5181 ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile(), 5182 MMO->isNonTemporal(), MMO->isInvariant())); 5183 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 5184 void *IP = nullptr; 5185 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 5186 cast<StoreSDNode>(E)->refineAlignment(MMO); 5187 return SDValue(E, 0); 5188 } 5189 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl.getIROrder(), 5190 dl.getDebugLoc(), VTs, 5191 ISD::UNINDEXED, false, VT, MMO); 5192 CSEMap.InsertNode(N, IP); 5193 InsertNode(N); 5194 return SDValue(N, 0); 5195 } 5196 5197 SDValue SelectionDAG::getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, 5198 SDValue Ptr, MachinePointerInfo PtrInfo, 5199 EVT SVT,bool isVolatile, bool isNonTemporal, 5200 unsigned Alignment, 5201 const AAMDNodes &AAInfo) { 5202 assert(Chain.getValueType() == MVT::Other && 5203 "Invalid chain type"); 5204 if (Alignment == 0) // Ensure that codegen never sees alignment 0 5205 Alignment = getEVTAlignment(SVT); 5206 5207 unsigned Flags = MachineMemOperand::MOStore; 5208 if (isVolatile) 5209 Flags |= MachineMemOperand::MOVolatile; 5210 if (isNonTemporal) 5211 Flags |= MachineMemOperand::MONonTemporal; 5212 5213 if (PtrInfo.V.isNull()) 5214 PtrInfo = InferPointerInfo(*this, Ptr); 5215 5216 MachineFunction &MF = getMachineFunction(); 5217 MachineMemOperand *MMO = 5218 MF.getMachineMemOperand(PtrInfo, Flags, SVT.getStoreSize(), Alignment, 5219 AAInfo); 5220 5221 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO); 5222 } 5223 5224 SDValue SelectionDAG::getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, 5225 SDValue Ptr, EVT SVT, 5226 MachineMemOperand *MMO) { 5227 EVT VT = Val.getValueType(); 5228 5229 assert(Chain.getValueType() == MVT::Other && 5230 "Invalid chain type"); 5231 if (VT == SVT) 5232 return getStore(Chain, dl, Val, Ptr, MMO); 5233 5234 assert(SVT.getScalarType().bitsLT(VT.getScalarType()) && 5235 "Should only be a truncating store, not extending!"); 5236 assert(VT.isInteger() == SVT.isInteger() && 5237 "Can't do FP-INT conversion!"); 5238 assert(VT.isVector() == SVT.isVector() && 5239 "Cannot use trunc store to convert to or from a vector!"); 5240 assert((!VT.isVector() || 5241 VT.getVectorNumElements() == SVT.getVectorNumElements()) && 5242 "Cannot use trunc store to change the number of vector elements!"); 5243 5244 SDVTList VTs = getVTList(MVT::Other); 5245 SDValue Undef = getUNDEF(Ptr.getValueType()); 5246 SDValue Ops[] = { Chain, Val, Ptr, Undef }; 5247 FoldingSetNodeID ID; 5248 AddNodeIDNode(ID, ISD::STORE, VTs, Ops); 5249 ID.AddInteger(SVT.getRawBits()); 5250 ID.AddInteger(encodeMemSDNodeFlags(true, ISD::UNINDEXED, MMO->isVolatile(), 5251 MMO->isNonTemporal(), MMO->isInvariant())); 5252 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 5253 void *IP = nullptr; 5254 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 5255 cast<StoreSDNode>(E)->refineAlignment(MMO); 5256 return SDValue(E, 0); 5257 } 5258 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl.getIROrder(), 5259 dl.getDebugLoc(), VTs, 5260 ISD::UNINDEXED, true, SVT, MMO); 5261 CSEMap.InsertNode(N, IP); 5262 InsertNode(N); 5263 return SDValue(N, 0); 5264 } 5265 5266 SDValue 5267 SelectionDAG::getIndexedStore(SDValue OrigStore, SDLoc dl, SDValue Base, 5268 SDValue Offset, ISD::MemIndexedMode AM) { 5269 StoreSDNode *ST = cast<StoreSDNode>(OrigStore); 5270 assert(ST->getOffset().getOpcode() == ISD::UNDEF && 5271 "Store is already a indexed store!"); 5272 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other); 5273 SDValue Ops[] = { ST->getChain(), ST->getValue(), Base, Offset }; 5274 FoldingSetNodeID ID; 5275 AddNodeIDNode(ID, ISD::STORE, VTs, Ops); 5276 ID.AddInteger(ST->getMemoryVT().getRawBits()); 5277 ID.AddInteger(ST->getRawSubclassData()); 5278 ID.AddInteger(ST->getPointerInfo().getAddrSpace()); 5279 void *IP = nullptr; 5280 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) 5281 return SDValue(E, 0); 5282 5283 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl.getIROrder(), 5284 dl.getDebugLoc(), VTs, AM, 5285 ST->isTruncatingStore(), 5286 ST->getMemoryVT(), 5287 ST->getMemOperand()); 5288 CSEMap.InsertNode(N, IP); 5289 InsertNode(N); 5290 return SDValue(N, 0); 5291 } 5292 5293 SDValue 5294 SelectionDAG::getMaskedLoad(EVT VT, SDLoc dl, SDValue Chain, 5295 SDValue Ptr, SDValue Mask, SDValue Src0, EVT MemVT, 5296 MachineMemOperand *MMO, ISD::LoadExtType ExtTy) { 5297 5298 SDVTList VTs = getVTList(VT, MVT::Other); 5299 SDValue Ops[] = { Chain, Ptr, Mask, Src0 }; 5300 FoldingSetNodeID ID; 5301 AddNodeIDNode(ID, ISD::MLOAD, VTs, Ops); 5302 ID.AddInteger(VT.getRawBits()); 5303 ID.AddInteger(encodeMemSDNodeFlags(ExtTy, ISD::UNINDEXED, 5304 MMO->isVolatile(), 5305 MMO->isNonTemporal(), 5306 MMO->isInvariant())); 5307 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 5308 void *IP = nullptr; 5309 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 5310 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO); 5311 return SDValue(E, 0); 5312 } 5313 SDNode *N = new (NodeAllocator) MaskedLoadSDNode(dl.getIROrder(), 5314 dl.getDebugLoc(), Ops, 4, VTs, 5315 ExtTy, MemVT, MMO); 5316 CSEMap.InsertNode(N, IP); 5317 InsertNode(N); 5318 return SDValue(N, 0); 5319 } 5320 5321 SDValue SelectionDAG::getMaskedStore(SDValue Chain, SDLoc dl, SDValue Val, 5322 SDValue Ptr, SDValue Mask, EVT MemVT, 5323 MachineMemOperand *MMO, bool isTrunc) { 5324 assert(Chain.getValueType() == MVT::Other && 5325 "Invalid chain type"); 5326 EVT VT = Val.getValueType(); 5327 SDVTList VTs = getVTList(MVT::Other); 5328 SDValue Ops[] = { Chain, Ptr, Mask, Val }; 5329 FoldingSetNodeID ID; 5330 AddNodeIDNode(ID, ISD::MSTORE, VTs, Ops); 5331 ID.AddInteger(VT.getRawBits()); 5332 ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile(), 5333 MMO->isNonTemporal(), MMO->isInvariant())); 5334 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 5335 void *IP = nullptr; 5336 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 5337 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO); 5338 return SDValue(E, 0); 5339 } 5340 SDNode *N = new (NodeAllocator) MaskedStoreSDNode(dl.getIROrder(), 5341 dl.getDebugLoc(), Ops, 4, 5342 VTs, isTrunc, MemVT, MMO); 5343 CSEMap.InsertNode(N, IP); 5344 InsertNode(N); 5345 return SDValue(N, 0); 5346 } 5347 5348 SDValue 5349 SelectionDAG::getMaskedGather(SDVTList VTs, EVT VT, SDLoc dl, 5350 ArrayRef<SDValue> Ops, 5351 MachineMemOperand *MMO) { 5352 5353 FoldingSetNodeID ID; 5354 AddNodeIDNode(ID, ISD::MGATHER, VTs, Ops); 5355 ID.AddInteger(VT.getRawBits()); 5356 ID.AddInteger(encodeMemSDNodeFlags(ISD::NON_EXTLOAD, ISD::UNINDEXED, 5357 MMO->isVolatile(), 5358 MMO->isNonTemporal(), 5359 MMO->isInvariant())); 5360 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 5361 void *IP = nullptr; 5362 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 5363 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO); 5364 return SDValue(E, 0); 5365 } 5366 MaskedGatherSDNode *N = 5367 new (NodeAllocator) MaskedGatherSDNode(dl.getIROrder(), dl.getDebugLoc(), 5368 Ops, VTs, VT, MMO); 5369 CSEMap.InsertNode(N, IP); 5370 InsertNode(N); 5371 return SDValue(N, 0); 5372 } 5373 5374 SDValue SelectionDAG::getMaskedScatter(SDVTList VTs, EVT VT, SDLoc dl, 5375 ArrayRef<SDValue> Ops, 5376 MachineMemOperand *MMO) { 5377 FoldingSetNodeID ID; 5378 AddNodeIDNode(ID, ISD::MSCATTER, VTs, Ops); 5379 ID.AddInteger(VT.getRawBits()); 5380 ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile(), 5381 MMO->isNonTemporal(), 5382 MMO->isInvariant())); 5383 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 5384 void *IP = nullptr; 5385 if (SDNode *E = FindNodeOrInsertPos(ID, dl.getDebugLoc(), IP)) { 5386 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO); 5387 return SDValue(E, 0); 5388 } 5389 SDNode *N = 5390 new (NodeAllocator) MaskedScatterSDNode(dl.getIROrder(), dl.getDebugLoc(), 5391 Ops, VTs, VT, MMO); 5392 CSEMap.InsertNode(N, IP); 5393 InsertNode(N); 5394 return SDValue(N, 0); 5395 } 5396 5397 SDValue SelectionDAG::getVAArg(EVT VT, SDLoc dl, 5398 SDValue Chain, SDValue Ptr, 5399 SDValue SV, 5400 unsigned Align) { 5401 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) }; 5402 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops); 5403 } 5404 5405 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 5406 ArrayRef<SDUse> Ops) { 5407 switch (Ops.size()) { 5408 case 0: return getNode(Opcode, DL, VT); 5409 case 1: return getNode(Opcode, DL, VT, static_cast<const SDValue>(Ops[0])); 5410 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]); 5411 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]); 5412 default: break; 5413 } 5414 5415 // Copy from an SDUse array into an SDValue array for use with 5416 // the regular getNode logic. 5417 SmallVector<SDValue, 8> NewOps(Ops.begin(), Ops.end()); 5418 return getNode(Opcode, DL, VT, NewOps); 5419 } 5420 5421 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 5422 ArrayRef<SDValue> Ops, const SDNodeFlags *Flags) { 5423 unsigned NumOps = Ops.size(); 5424 switch (NumOps) { 5425 case 0: return getNode(Opcode, DL, VT); 5426 case 1: return getNode(Opcode, DL, VT, Ops[0]); 5427 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags); 5428 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]); 5429 default: break; 5430 } 5431 5432 switch (Opcode) { 5433 default: break; 5434 case ISD::SELECT_CC: { 5435 assert(NumOps == 5 && "SELECT_CC takes 5 operands!"); 5436 assert(Ops[0].getValueType() == Ops[1].getValueType() && 5437 "LHS and RHS of condition must have same type!"); 5438 assert(Ops[2].getValueType() == Ops[3].getValueType() && 5439 "True and False arms of SelectCC must have same type!"); 5440 assert(Ops[2].getValueType() == VT && 5441 "select_cc node must be of same type as true and false value!"); 5442 break; 5443 } 5444 case ISD::BR_CC: { 5445 assert(NumOps == 5 && "BR_CC takes 5 operands!"); 5446 assert(Ops[2].getValueType() == Ops[3].getValueType() && 5447 "LHS/RHS of comparison should match types!"); 5448 break; 5449 } 5450 } 5451 5452 // Memoize nodes. 5453 SDNode *N; 5454 SDVTList VTs = getVTList(VT); 5455 5456 if (VT != MVT::Glue) { 5457 FoldingSetNodeID ID; 5458 AddNodeIDNode(ID, Opcode, VTs, Ops); 5459 void *IP = nullptr; 5460 5461 if (SDNode *E = FindNodeOrInsertPos(ID, DL.getDebugLoc(), IP)) 5462 return SDValue(E, 0); 5463 5464 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 5465 VTs, Ops); 5466 CSEMap.InsertNode(N, IP); 5467 } else { 5468 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 5469 VTs, Ops); 5470 } 5471 5472 InsertNode(N); 5473 return SDValue(N, 0); 5474 } 5475 5476 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, 5477 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) { 5478 return getNode(Opcode, DL, getVTList(ResultTys), Ops); 5479 } 5480 5481 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 5482 ArrayRef<SDValue> Ops) { 5483 if (VTList.NumVTs == 1) 5484 return getNode(Opcode, DL, VTList.VTs[0], Ops); 5485 5486 #if 0 5487 switch (Opcode) { 5488 // FIXME: figure out how to safely handle things like 5489 // int foo(int x) { return 1 << (x & 255); } 5490 // int bar() { return foo(256); } 5491 case ISD::SRA_PARTS: 5492 case ISD::SRL_PARTS: 5493 case ISD::SHL_PARTS: 5494 if (N3.getOpcode() == ISD::SIGN_EXTEND_INREG && 5495 cast<VTSDNode>(N3.getOperand(1))->getVT() != MVT::i1) 5496 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0)); 5497 else if (N3.getOpcode() == ISD::AND) 5498 if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N3.getOperand(1))) { 5499 // If the and is only masking out bits that cannot effect the shift, 5500 // eliminate the and. 5501 unsigned NumBits = VT.getScalarType().getSizeInBits()*2; 5502 if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1) 5503 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0)); 5504 } 5505 break; 5506 } 5507 #endif 5508 5509 // Memoize the node unless it returns a flag. 5510 SDNode *N; 5511 unsigned NumOps = Ops.size(); 5512 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) { 5513 FoldingSetNodeID ID; 5514 AddNodeIDNode(ID, Opcode, VTList, Ops); 5515 void *IP = nullptr; 5516 if (SDNode *E = FindNodeOrInsertPos(ID, DL.getDebugLoc(), IP)) 5517 return SDValue(E, 0); 5518 5519 if (NumOps == 1) { 5520 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 5521 DL.getDebugLoc(), VTList, Ops[0]); 5522 } else if (NumOps == 2) { 5523 N = new (NodeAllocator) BinarySDNode(Opcode, DL.getIROrder(), 5524 DL.getDebugLoc(), VTList, Ops[0], 5525 Ops[1]); 5526 } else if (NumOps == 3) { 5527 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 5528 DL.getDebugLoc(), VTList, Ops[0], 5529 Ops[1], Ops[2]); 5530 } else { 5531 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 5532 VTList, Ops); 5533 } 5534 CSEMap.InsertNode(N, IP); 5535 } else { 5536 if (NumOps == 1) { 5537 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 5538 DL.getDebugLoc(), VTList, Ops[0]); 5539 } else if (NumOps == 2) { 5540 N = new (NodeAllocator) BinarySDNode(Opcode, DL.getIROrder(), 5541 DL.getDebugLoc(), VTList, Ops[0], 5542 Ops[1]); 5543 } else if (NumOps == 3) { 5544 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 5545 DL.getDebugLoc(), VTList, Ops[0], 5546 Ops[1], Ops[2]); 5547 } else { 5548 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 5549 VTList, Ops); 5550 } 5551 } 5552 InsertNode(N); 5553 return SDValue(N, 0); 5554 } 5555 5556 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList) { 5557 return getNode(Opcode, DL, VTList, None); 5558 } 5559 5560 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 5561 SDValue N1) { 5562 SDValue Ops[] = { N1 }; 5563 return getNode(Opcode, DL, VTList, Ops); 5564 } 5565 5566 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 5567 SDValue N1, SDValue N2) { 5568 SDValue Ops[] = { N1, N2 }; 5569 return getNode(Opcode, DL, VTList, Ops); 5570 } 5571 5572 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 5573 SDValue N1, SDValue N2, SDValue N3) { 5574 SDValue Ops[] = { N1, N2, N3 }; 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) { 5581 SDValue Ops[] = { N1, N2, N3, N4 }; 5582 return getNode(Opcode, DL, VTList, Ops); 5583 } 5584 5585 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 5586 SDValue N1, SDValue N2, SDValue N3, 5587 SDValue N4, SDValue N5) { 5588 SDValue Ops[] = { N1, N2, N3, N4, N5 }; 5589 return getNode(Opcode, DL, VTList, Ops); 5590 } 5591 5592 SDVTList SelectionDAG::getVTList(EVT VT) { 5593 return makeVTList(SDNode::getValueTypeList(VT), 1); 5594 } 5595 5596 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2) { 5597 FoldingSetNodeID ID; 5598 ID.AddInteger(2U); 5599 ID.AddInteger(VT1.getRawBits()); 5600 ID.AddInteger(VT2.getRawBits()); 5601 5602 void *IP = nullptr; 5603 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 5604 if (!Result) { 5605 EVT *Array = Allocator.Allocate<EVT>(2); 5606 Array[0] = VT1; 5607 Array[1] = VT2; 5608 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2); 5609 VTListMap.InsertNode(Result, IP); 5610 } 5611 return Result->getSDVTList(); 5612 } 5613 5614 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2, EVT VT3) { 5615 FoldingSetNodeID ID; 5616 ID.AddInteger(3U); 5617 ID.AddInteger(VT1.getRawBits()); 5618 ID.AddInteger(VT2.getRawBits()); 5619 ID.AddInteger(VT3.getRawBits()); 5620 5621 void *IP = nullptr; 5622 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 5623 if (!Result) { 5624 EVT *Array = Allocator.Allocate<EVT>(3); 5625 Array[0] = VT1; 5626 Array[1] = VT2; 5627 Array[2] = VT3; 5628 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3); 5629 VTListMap.InsertNode(Result, IP); 5630 } 5631 return Result->getSDVTList(); 5632 } 5633 5634 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2, EVT VT3, EVT VT4) { 5635 FoldingSetNodeID ID; 5636 ID.AddInteger(4U); 5637 ID.AddInteger(VT1.getRawBits()); 5638 ID.AddInteger(VT2.getRawBits()); 5639 ID.AddInteger(VT3.getRawBits()); 5640 ID.AddInteger(VT4.getRawBits()); 5641 5642 void *IP = nullptr; 5643 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 5644 if (!Result) { 5645 EVT *Array = Allocator.Allocate<EVT>(4); 5646 Array[0] = VT1; 5647 Array[1] = VT2; 5648 Array[2] = VT3; 5649 Array[3] = VT4; 5650 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4); 5651 VTListMap.InsertNode(Result, IP); 5652 } 5653 return Result->getSDVTList(); 5654 } 5655 5656 SDVTList SelectionDAG::getVTList(ArrayRef<EVT> VTs) { 5657 unsigned NumVTs = VTs.size(); 5658 FoldingSetNodeID ID; 5659 ID.AddInteger(NumVTs); 5660 for (unsigned index = 0; index < NumVTs; index++) { 5661 ID.AddInteger(VTs[index].getRawBits()); 5662 } 5663 5664 void *IP = nullptr; 5665 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 5666 if (!Result) { 5667 EVT *Array = Allocator.Allocate<EVT>(NumVTs); 5668 std::copy(VTs.begin(), VTs.end(), Array); 5669 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs); 5670 VTListMap.InsertNode(Result, IP); 5671 } 5672 return Result->getSDVTList(); 5673 } 5674 5675 5676 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the 5677 /// specified operands. If the resultant node already exists in the DAG, 5678 /// this does not modify the specified node, instead it returns the node that 5679 /// already exists. If the resultant node does not exist in the DAG, the 5680 /// input node is returned. As a degenerate case, if you specify the same 5681 /// input operands as the node already has, the input node is returned. 5682 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op) { 5683 assert(N->getNumOperands() == 1 && "Update with wrong number of operands"); 5684 5685 // Check to see if there is no change. 5686 if (Op == N->getOperand(0)) return N; 5687 5688 // See if the modified node already exists. 5689 void *InsertPos = nullptr; 5690 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos)) 5691 return Existing; 5692 5693 // Nope it doesn't. Remove the node from its current place in the maps. 5694 if (InsertPos) 5695 if (!RemoveNodeFromCSEMaps(N)) 5696 InsertPos = nullptr; 5697 5698 // Now we update the operands. 5699 N->OperandList[0].set(Op); 5700 5701 // If this gets put into a CSE map, add it. 5702 if (InsertPos) CSEMap.InsertNode(N, InsertPos); 5703 return N; 5704 } 5705 5706 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2) { 5707 assert(N->getNumOperands() == 2 && "Update with wrong number of operands"); 5708 5709 // Check to see if there is no change. 5710 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1)) 5711 return N; // No operands changed, just return the input node. 5712 5713 // See if the modified node already exists. 5714 void *InsertPos = nullptr; 5715 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos)) 5716 return Existing; 5717 5718 // Nope it doesn't. Remove the node from its current place in the maps. 5719 if (InsertPos) 5720 if (!RemoveNodeFromCSEMaps(N)) 5721 InsertPos = nullptr; 5722 5723 // Now we update the operands. 5724 if (N->OperandList[0] != Op1) 5725 N->OperandList[0].set(Op1); 5726 if (N->OperandList[1] != Op2) 5727 N->OperandList[1].set(Op2); 5728 5729 // If this gets put into a CSE map, add it. 5730 if (InsertPos) CSEMap.InsertNode(N, InsertPos); 5731 return N; 5732 } 5733 5734 SDNode *SelectionDAG:: 5735 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, SDValue Op3) { 5736 SDValue Ops[] = { Op1, Op2, Op3 }; 5737 return UpdateNodeOperands(N, Ops); 5738 } 5739 5740 SDNode *SelectionDAG:: 5741 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, 5742 SDValue Op3, SDValue Op4) { 5743 SDValue Ops[] = { Op1, Op2, Op3, Op4 }; 5744 return UpdateNodeOperands(N, Ops); 5745 } 5746 5747 SDNode *SelectionDAG:: 5748 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, 5749 SDValue Op3, SDValue Op4, SDValue Op5) { 5750 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 }; 5751 return UpdateNodeOperands(N, Ops); 5752 } 5753 5754 SDNode *SelectionDAG:: 5755 UpdateNodeOperands(SDNode *N, ArrayRef<SDValue> Ops) { 5756 unsigned NumOps = Ops.size(); 5757 assert(N->getNumOperands() == NumOps && 5758 "Update with wrong number of operands"); 5759 5760 // If no operands changed just return the input node. 5761 if (std::equal(Ops.begin(), Ops.end(), N->op_begin())) 5762 return N; 5763 5764 // See if the modified node already exists. 5765 void *InsertPos = nullptr; 5766 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos)) 5767 return Existing; 5768 5769 // Nope it doesn't. Remove the node from its current place in the maps. 5770 if (InsertPos) 5771 if (!RemoveNodeFromCSEMaps(N)) 5772 InsertPos = nullptr; 5773 5774 // Now we update the operands. 5775 for (unsigned i = 0; i != NumOps; ++i) 5776 if (N->OperandList[i] != Ops[i]) 5777 N->OperandList[i].set(Ops[i]); 5778 5779 // If this gets put into a CSE map, add it. 5780 if (InsertPos) CSEMap.InsertNode(N, InsertPos); 5781 return N; 5782 } 5783 5784 /// DropOperands - Release the operands and set this node to have 5785 /// zero operands. 5786 void SDNode::DropOperands() { 5787 // Unlike the code in MorphNodeTo that does this, we don't need to 5788 // watch for dead nodes here. 5789 for (op_iterator I = op_begin(), E = op_end(); I != E; ) { 5790 SDUse &Use = *I++; 5791 Use.set(SDValue()); 5792 } 5793 } 5794 5795 /// SelectNodeTo - These are wrappers around MorphNodeTo that accept a 5796 /// machine opcode. 5797 /// 5798 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5799 EVT VT) { 5800 SDVTList VTs = getVTList(VT); 5801 return SelectNodeTo(N, MachineOpc, VTs, None); 5802 } 5803 5804 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5805 EVT VT, SDValue Op1) { 5806 SDVTList VTs = getVTList(VT); 5807 SDValue Ops[] = { Op1 }; 5808 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5809 } 5810 5811 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5812 EVT VT, SDValue Op1, 5813 SDValue Op2) { 5814 SDVTList VTs = getVTList(VT); 5815 SDValue Ops[] = { Op1, Op2 }; 5816 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5817 } 5818 5819 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5820 EVT VT, SDValue Op1, 5821 SDValue Op2, SDValue Op3) { 5822 SDVTList VTs = getVTList(VT); 5823 SDValue Ops[] = { Op1, Op2, Op3 }; 5824 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5825 } 5826 5827 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5828 EVT VT, ArrayRef<SDValue> Ops) { 5829 SDVTList VTs = getVTList(VT); 5830 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5831 } 5832 5833 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5834 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) { 5835 SDVTList VTs = getVTList(VT1, VT2); 5836 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5837 } 5838 5839 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5840 EVT VT1, EVT VT2) { 5841 SDVTList VTs = getVTList(VT1, VT2); 5842 return SelectNodeTo(N, MachineOpc, VTs, None); 5843 } 5844 5845 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5846 EVT VT1, EVT VT2, EVT VT3, 5847 ArrayRef<SDValue> Ops) { 5848 SDVTList VTs = getVTList(VT1, VT2, VT3); 5849 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5850 } 5851 5852 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5853 EVT VT1, EVT VT2, EVT VT3, EVT VT4, 5854 ArrayRef<SDValue> Ops) { 5855 SDVTList VTs = getVTList(VT1, VT2, VT3, VT4); 5856 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5857 } 5858 5859 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5860 EVT VT1, EVT VT2, 5861 SDValue Op1) { 5862 SDVTList VTs = getVTList(VT1, VT2); 5863 SDValue Ops[] = { Op1 }; 5864 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5865 } 5866 5867 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5868 EVT VT1, EVT VT2, 5869 SDValue Op1, SDValue Op2) { 5870 SDVTList VTs = getVTList(VT1, VT2); 5871 SDValue Ops[] = { Op1, Op2 }; 5872 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5873 } 5874 5875 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5876 EVT VT1, EVT VT2, 5877 SDValue Op1, SDValue Op2, 5878 SDValue Op3) { 5879 SDVTList VTs = getVTList(VT1, VT2); 5880 SDValue Ops[] = { Op1, Op2, Op3 }; 5881 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5882 } 5883 5884 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5885 EVT VT1, EVT VT2, EVT VT3, 5886 SDValue Op1, SDValue Op2, 5887 SDValue Op3) { 5888 SDVTList VTs = getVTList(VT1, VT2, VT3); 5889 SDValue Ops[] = { Op1, Op2, Op3 }; 5890 return SelectNodeTo(N, MachineOpc, VTs, Ops); 5891 } 5892 5893 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 5894 SDVTList VTs,ArrayRef<SDValue> Ops) { 5895 N = MorphNodeTo(N, ~MachineOpc, VTs, Ops); 5896 // Reset the NodeID to -1. 5897 N->setNodeId(-1); 5898 return N; 5899 } 5900 5901 /// UpdadeSDLocOnMergedSDNode - If the opt level is -O0 then it throws away 5902 /// the line number information on the merged node since it is not possible to 5903 /// preserve the information that operation is associated with multiple lines. 5904 /// This will make the debugger working better at -O0, were there is a higher 5905 /// probability having other instructions associated with that line. 5906 /// 5907 /// For IROrder, we keep the smaller of the two 5908 SDNode *SelectionDAG::UpdadeSDLocOnMergedSDNode(SDNode *N, SDLoc OLoc) { 5909 DebugLoc NLoc = N->getDebugLoc(); 5910 if (NLoc && OptLevel == CodeGenOpt::None && OLoc.getDebugLoc() != NLoc) { 5911 N->setDebugLoc(DebugLoc()); 5912 } 5913 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder()); 5914 N->setIROrder(Order); 5915 return N; 5916 } 5917 5918 /// MorphNodeTo - This *mutates* the specified node to have the specified 5919 /// return type, opcode, and operands. 5920 /// 5921 /// Note that MorphNodeTo returns the resultant node. If there is already a 5922 /// node of the specified opcode and operands, it returns that node instead of 5923 /// the current one. Note that the SDLoc need not be the same. 5924 /// 5925 /// Using MorphNodeTo is faster than creating a new node and swapping it in 5926 /// with ReplaceAllUsesWith both because it often avoids allocating a new 5927 /// node, and because it doesn't require CSE recalculation for any of 5928 /// the node's users. 5929 /// 5930 /// However, note that MorphNodeTo recursively deletes dead nodes from the DAG. 5931 /// As a consequence it isn't appropriate to use from within the DAG combiner or 5932 /// the legalizer which maintain worklists that would need to be updated when 5933 /// deleting things. 5934 SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc, 5935 SDVTList VTs, ArrayRef<SDValue> Ops) { 5936 unsigned NumOps = Ops.size(); 5937 // If an identical node already exists, use it. 5938 void *IP = nullptr; 5939 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) { 5940 FoldingSetNodeID ID; 5941 AddNodeIDNode(ID, Opc, VTs, Ops); 5942 if (SDNode *ON = FindNodeOrInsertPos(ID, N->getDebugLoc(), IP)) 5943 return UpdadeSDLocOnMergedSDNode(ON, SDLoc(N)); 5944 } 5945 5946 if (!RemoveNodeFromCSEMaps(N)) 5947 IP = nullptr; 5948 5949 // Start the morphing. 5950 N->NodeType = Opc; 5951 N->ValueList = VTs.VTs; 5952 N->NumValues = VTs.NumVTs; 5953 5954 // Clear the operands list, updating used nodes to remove this from their 5955 // use list. Keep track of any operands that become dead as a result. 5956 SmallPtrSet<SDNode*, 16> DeadNodeSet; 5957 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) { 5958 SDUse &Use = *I++; 5959 SDNode *Used = Use.getNode(); 5960 Use.set(SDValue()); 5961 if (Used->use_empty()) 5962 DeadNodeSet.insert(Used); 5963 } 5964 5965 if (MachineSDNode *MN = dyn_cast<MachineSDNode>(N)) { 5966 // Initialize the memory references information. 5967 MN->setMemRefs(nullptr, nullptr); 5968 // If NumOps is larger than the # of operands we can have in a 5969 // MachineSDNode, reallocate the operand list. 5970 if (NumOps > MN->NumOperands || !MN->OperandsNeedDelete) { 5971 if (MN->OperandsNeedDelete) 5972 delete[] MN->OperandList; 5973 if (NumOps > array_lengthof(MN->LocalOperands)) 5974 // We're creating a final node that will live unmorphed for the 5975 // remainder of the current SelectionDAG iteration, so we can allocate 5976 // the operands directly out of a pool with no recycling metadata. 5977 MN->InitOperands(OperandAllocator.Allocate<SDUse>(NumOps), 5978 Ops.data(), NumOps); 5979 else 5980 MN->InitOperands(MN->LocalOperands, Ops.data(), NumOps); 5981 MN->OperandsNeedDelete = false; 5982 } else 5983 MN->InitOperands(MN->OperandList, Ops.data(), NumOps); 5984 } else { 5985 // If NumOps is larger than the # of operands we currently have, reallocate 5986 // the operand list. 5987 if (NumOps > N->NumOperands) { 5988 if (N->OperandsNeedDelete) 5989 delete[] N->OperandList; 5990 N->InitOperands(new SDUse[NumOps], Ops.data(), NumOps); 5991 N->OperandsNeedDelete = true; 5992 } else 5993 N->InitOperands(N->OperandList, Ops.data(), NumOps); 5994 } 5995 5996 // Delete any nodes that are still dead after adding the uses for the 5997 // new operands. 5998 if (!DeadNodeSet.empty()) { 5999 SmallVector<SDNode *, 16> DeadNodes; 6000 for (SDNode *N : DeadNodeSet) 6001 if (N->use_empty()) 6002 DeadNodes.push_back(N); 6003 RemoveDeadNodes(DeadNodes); 6004 } 6005 6006 if (IP) 6007 CSEMap.InsertNode(N, IP); // Memoize the new node. 6008 return N; 6009 } 6010 6011 6012 /// getMachineNode - These are used for target selectors to create a new node 6013 /// with specified return type(s), MachineInstr opcode, and operands. 6014 /// 6015 /// Note that getMachineNode returns the resultant node. If there is already a 6016 /// node of the specified opcode and operands, it returns that node instead of 6017 /// the current one. 6018 MachineSDNode * 6019 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT) { 6020 SDVTList VTs = getVTList(VT); 6021 return getMachineNode(Opcode, dl, VTs, None); 6022 } 6023 6024 MachineSDNode * 6025 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, SDValue Op1) { 6026 SDVTList VTs = getVTList(VT); 6027 SDValue Ops[] = { Op1 }; 6028 return getMachineNode(Opcode, dl, VTs, Ops); 6029 } 6030 6031 MachineSDNode * 6032 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, 6033 SDValue Op1, SDValue Op2) { 6034 SDVTList VTs = getVTList(VT); 6035 SDValue Ops[] = { Op1, Op2 }; 6036 return getMachineNode(Opcode, dl, VTs, Ops); 6037 } 6038 6039 MachineSDNode * 6040 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, 6041 SDValue Op1, SDValue Op2, SDValue Op3) { 6042 SDVTList VTs = getVTList(VT); 6043 SDValue Ops[] = { Op1, Op2, Op3 }; 6044 return getMachineNode(Opcode, dl, VTs, Ops); 6045 } 6046 6047 MachineSDNode * 6048 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, 6049 ArrayRef<SDValue> Ops) { 6050 SDVTList VTs = getVTList(VT); 6051 return getMachineNode(Opcode, dl, VTs, Ops); 6052 } 6053 6054 MachineSDNode * 6055 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2) { 6056 SDVTList VTs = getVTList(VT1, VT2); 6057 return getMachineNode(Opcode, dl, VTs, None); 6058 } 6059 6060 MachineSDNode * 6061 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6062 EVT VT1, EVT VT2, SDValue Op1) { 6063 SDVTList VTs = getVTList(VT1, VT2); 6064 SDValue Ops[] = { Op1 }; 6065 return getMachineNode(Opcode, dl, VTs, Ops); 6066 } 6067 6068 MachineSDNode * 6069 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6070 EVT VT1, EVT VT2, SDValue Op1, SDValue Op2) { 6071 SDVTList VTs = getVTList(VT1, VT2); 6072 SDValue Ops[] = { Op1, Op2 }; 6073 return getMachineNode(Opcode, dl, VTs, Ops); 6074 } 6075 6076 MachineSDNode * 6077 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6078 EVT VT1, EVT VT2, SDValue Op1, 6079 SDValue Op2, SDValue Op3) { 6080 SDVTList VTs = getVTList(VT1, VT2); 6081 SDValue Ops[] = { Op1, Op2, Op3 }; 6082 return getMachineNode(Opcode, dl, VTs, Ops); 6083 } 6084 6085 MachineSDNode * 6086 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6087 EVT VT1, EVT VT2, 6088 ArrayRef<SDValue> Ops) { 6089 SDVTList VTs = getVTList(VT1, VT2); 6090 return getMachineNode(Opcode, dl, VTs, Ops); 6091 } 6092 6093 MachineSDNode * 6094 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6095 EVT VT1, EVT VT2, EVT VT3, 6096 SDValue Op1, SDValue Op2) { 6097 SDVTList VTs = getVTList(VT1, VT2, VT3); 6098 SDValue Ops[] = { Op1, Op2 }; 6099 return getMachineNode(Opcode, dl, VTs, Ops); 6100 } 6101 6102 MachineSDNode * 6103 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6104 EVT VT1, EVT VT2, EVT VT3, 6105 SDValue Op1, SDValue Op2, SDValue Op3) { 6106 SDVTList VTs = getVTList(VT1, VT2, VT3); 6107 SDValue Ops[] = { Op1, Op2, Op3 }; 6108 return getMachineNode(Opcode, dl, VTs, Ops); 6109 } 6110 6111 MachineSDNode * 6112 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6113 EVT VT1, EVT VT2, EVT VT3, 6114 ArrayRef<SDValue> Ops) { 6115 SDVTList VTs = getVTList(VT1, VT2, VT3); 6116 return getMachineNode(Opcode, dl, VTs, Ops); 6117 } 6118 6119 MachineSDNode * 6120 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, 6121 EVT VT2, EVT VT3, EVT VT4, 6122 ArrayRef<SDValue> Ops) { 6123 SDVTList VTs = getVTList(VT1, VT2, VT3, VT4); 6124 return getMachineNode(Opcode, dl, VTs, Ops); 6125 } 6126 6127 MachineSDNode * 6128 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 6129 ArrayRef<EVT> ResultTys, 6130 ArrayRef<SDValue> Ops) { 6131 SDVTList VTs = getVTList(ResultTys); 6132 return getMachineNode(Opcode, dl, VTs, Ops); 6133 } 6134 6135 MachineSDNode * 6136 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc DL, SDVTList VTs, 6137 ArrayRef<SDValue> OpsArray) { 6138 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue; 6139 MachineSDNode *N; 6140 void *IP = nullptr; 6141 const SDValue *Ops = OpsArray.data(); 6142 unsigned NumOps = OpsArray.size(); 6143 6144 if (DoCSE) { 6145 FoldingSetNodeID ID; 6146 AddNodeIDNode(ID, ~Opcode, VTs, OpsArray); 6147 IP = nullptr; 6148 if (SDNode *E = FindNodeOrInsertPos(ID, DL.getDebugLoc(), IP)) { 6149 return cast<MachineSDNode>(UpdadeSDLocOnMergedSDNode(E, DL)); 6150 } 6151 } 6152 6153 // Allocate a new MachineSDNode. 6154 N = new (NodeAllocator) MachineSDNode(~Opcode, DL.getIROrder(), 6155 DL.getDebugLoc(), VTs); 6156 6157 // Initialize the operands list. 6158 if (NumOps > array_lengthof(N->LocalOperands)) 6159 // We're creating a final node that will live unmorphed for the 6160 // remainder of the current SelectionDAG iteration, so we can allocate 6161 // the operands directly out of a pool with no recycling metadata. 6162 N->InitOperands(OperandAllocator.Allocate<SDUse>(NumOps), 6163 Ops, NumOps); 6164 else 6165 N->InitOperands(N->LocalOperands, Ops, NumOps); 6166 N->OperandsNeedDelete = false; 6167 6168 if (DoCSE) 6169 CSEMap.InsertNode(N, IP); 6170 6171 InsertNode(N); 6172 return N; 6173 } 6174 6175 /// getTargetExtractSubreg - A convenience function for creating 6176 /// TargetOpcode::EXTRACT_SUBREG nodes. 6177 SDValue 6178 SelectionDAG::getTargetExtractSubreg(int SRIdx, SDLoc DL, EVT VT, 6179 SDValue Operand) { 6180 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32); 6181 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL, 6182 VT, Operand, SRIdxVal); 6183 return SDValue(Subreg, 0); 6184 } 6185 6186 /// getTargetInsertSubreg - A convenience function for creating 6187 /// TargetOpcode::INSERT_SUBREG nodes. 6188 SDValue 6189 SelectionDAG::getTargetInsertSubreg(int SRIdx, SDLoc DL, EVT VT, 6190 SDValue Operand, SDValue Subreg) { 6191 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32); 6192 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL, 6193 VT, Operand, Subreg, SRIdxVal); 6194 return SDValue(Result, 0); 6195 } 6196 6197 /// getNodeIfExists - Get the specified node if it's already available, or 6198 /// else return NULL. 6199 SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList, 6200 ArrayRef<SDValue> Ops, 6201 const SDNodeFlags *Flags) { 6202 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) { 6203 FoldingSetNodeID ID; 6204 AddNodeIDNode(ID, Opcode, VTList, Ops); 6205 AddNodeIDFlags(ID, Opcode, Flags); 6206 void *IP = nullptr; 6207 if (SDNode *E = FindNodeOrInsertPos(ID, DebugLoc(), IP)) 6208 return E; 6209 } 6210 return nullptr; 6211 } 6212 6213 /// getDbgValue - Creates a SDDbgValue node. 6214 /// 6215 /// SDNode 6216 SDDbgValue *SelectionDAG::getDbgValue(MDNode *Var, MDNode *Expr, SDNode *N, 6217 unsigned R, bool IsIndirect, uint64_t Off, 6218 DebugLoc DL, unsigned O) { 6219 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) && 6220 "Expected inlined-at fields to agree"); 6221 return new (DbgInfo->getAlloc()) 6222 SDDbgValue(Var, Expr, N, R, IsIndirect, Off, DL, O); 6223 } 6224 6225 /// Constant 6226 SDDbgValue *SelectionDAG::getConstantDbgValue(MDNode *Var, MDNode *Expr, 6227 const Value *C, uint64_t Off, 6228 DebugLoc DL, unsigned O) { 6229 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) && 6230 "Expected inlined-at fields to agree"); 6231 return new (DbgInfo->getAlloc()) SDDbgValue(Var, Expr, C, Off, DL, O); 6232 } 6233 6234 /// FrameIndex 6235 SDDbgValue *SelectionDAG::getFrameIndexDbgValue(MDNode *Var, MDNode *Expr, 6236 unsigned FI, uint64_t Off, 6237 DebugLoc DL, unsigned O) { 6238 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) && 6239 "Expected inlined-at fields to agree"); 6240 return new (DbgInfo->getAlloc()) SDDbgValue(Var, Expr, FI, Off, DL, O); 6241 } 6242 6243 namespace { 6244 6245 /// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node 6246 /// pointed to by a use iterator is deleted, increment the use iterator 6247 /// so that it doesn't dangle. 6248 /// 6249 class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener { 6250 SDNode::use_iterator &UI; 6251 SDNode::use_iterator &UE; 6252 6253 void NodeDeleted(SDNode *N, SDNode *E) override { 6254 // Increment the iterator as needed. 6255 while (UI != UE && N == *UI) 6256 ++UI; 6257 } 6258 6259 public: 6260 RAUWUpdateListener(SelectionDAG &d, 6261 SDNode::use_iterator &ui, 6262 SDNode::use_iterator &ue) 6263 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {} 6264 }; 6265 6266 } 6267 6268 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 6269 /// This can cause recursive merging of nodes in the DAG. 6270 /// 6271 /// This version assumes From has a single result value. 6272 /// 6273 void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) { 6274 SDNode *From = FromN.getNode(); 6275 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 && 6276 "Cannot replace with this method!"); 6277 assert(From != To.getNode() && "Cannot replace uses of with self"); 6278 6279 // Iterate over all the existing uses of From. New uses will be added 6280 // to the beginning of the use list, which we avoid visiting. 6281 // This specifically avoids visiting uses of From that arise while the 6282 // replacement is happening, because any such uses would be the result 6283 // of CSE: If an existing node looks like From after one of its operands 6284 // is replaced by To, we don't want to replace of all its users with To 6285 // too. See PR3018 for more info. 6286 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end(); 6287 RAUWUpdateListener Listener(*this, UI, UE); 6288 while (UI != UE) { 6289 SDNode *User = *UI; 6290 6291 // This node is about to morph, remove its old self from the CSE maps. 6292 RemoveNodeFromCSEMaps(User); 6293 6294 // A user can appear in a use list multiple times, and when this 6295 // happens the uses are usually next to each other in the list. 6296 // To help reduce the number of CSE recomputations, process all 6297 // the uses of this user that we can find this way. 6298 do { 6299 SDUse &Use = UI.getUse(); 6300 ++UI; 6301 Use.set(To); 6302 } while (UI != UE && *UI == User); 6303 6304 // Now that we have modified User, add it back to the CSE maps. If it 6305 // already exists there, recursively merge the results together. 6306 AddModifiedNodeToCSEMaps(User); 6307 } 6308 6309 // If we just RAUW'd the root, take note. 6310 if (FromN == getRoot()) 6311 setRoot(To); 6312 } 6313 6314 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 6315 /// This can cause recursive merging of nodes in the DAG. 6316 /// 6317 /// This version assumes that for each value of From, there is a 6318 /// corresponding value in To in the same position with the same type. 6319 /// 6320 void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To) { 6321 #ifndef NDEBUG 6322 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) 6323 assert((!From->hasAnyUseOfValue(i) || 6324 From->getValueType(i) == To->getValueType(i)) && 6325 "Cannot use this version of ReplaceAllUsesWith!"); 6326 #endif 6327 6328 // Handle the trivial case. 6329 if (From == To) 6330 return; 6331 6332 // Iterate over just the existing users of From. See the comments in 6333 // the ReplaceAllUsesWith above. 6334 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end(); 6335 RAUWUpdateListener Listener(*this, UI, UE); 6336 while (UI != UE) { 6337 SDNode *User = *UI; 6338 6339 // This node is about to morph, remove its old self from the CSE maps. 6340 RemoveNodeFromCSEMaps(User); 6341 6342 // A user can appear in a use list multiple times, and when this 6343 // happens the uses are usually next to each other in the list. 6344 // To help reduce the number of CSE recomputations, process all 6345 // the uses of this user that we can find this way. 6346 do { 6347 SDUse &Use = UI.getUse(); 6348 ++UI; 6349 Use.setNode(To); 6350 } while (UI != UE && *UI == User); 6351 6352 // Now that we have modified User, add it back to the CSE maps. If it 6353 // already exists there, recursively merge the results together. 6354 AddModifiedNodeToCSEMaps(User); 6355 } 6356 6357 // If we just RAUW'd the root, take note. 6358 if (From == getRoot().getNode()) 6359 setRoot(SDValue(To, getRoot().getResNo())); 6360 } 6361 6362 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 6363 /// This can cause recursive merging of nodes in the DAG. 6364 /// 6365 /// This version can replace From with any result values. To must match the 6366 /// number and types of values returned by From. 6367 void SelectionDAG::ReplaceAllUsesWith(SDNode *From, const SDValue *To) { 6368 if (From->getNumValues() == 1) // Handle the simple case efficiently. 6369 return ReplaceAllUsesWith(SDValue(From, 0), To[0]); 6370 6371 // Iterate over just the existing users of From. See the comments in 6372 // the ReplaceAllUsesWith above. 6373 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end(); 6374 RAUWUpdateListener Listener(*this, UI, UE); 6375 while (UI != UE) { 6376 SDNode *User = *UI; 6377 6378 // This node is about to morph, remove its old self from the CSE maps. 6379 RemoveNodeFromCSEMaps(User); 6380 6381 // A user can appear in a use list multiple times, and when this 6382 // happens the uses are usually next to each other in the list. 6383 // To help reduce the number of CSE recomputations, process all 6384 // the uses of this user that we can find this way. 6385 do { 6386 SDUse &Use = UI.getUse(); 6387 const SDValue &ToOp = To[Use.getResNo()]; 6388 ++UI; 6389 Use.set(ToOp); 6390 } while (UI != UE && *UI == User); 6391 6392 // Now that we have modified User, add it back to the CSE maps. If it 6393 // already exists there, recursively merge the results together. 6394 AddModifiedNodeToCSEMaps(User); 6395 } 6396 6397 // If we just RAUW'd the root, take note. 6398 if (From == getRoot().getNode()) 6399 setRoot(SDValue(To[getRoot().getResNo()])); 6400 } 6401 6402 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving 6403 /// uses of other values produced by From.getNode() alone. The Deleted 6404 /// vector is handled the same way as for ReplaceAllUsesWith. 6405 void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){ 6406 // Handle the really simple, really trivial case efficiently. 6407 if (From == To) return; 6408 6409 // Handle the simple, trivial, case efficiently. 6410 if (From.getNode()->getNumValues() == 1) { 6411 ReplaceAllUsesWith(From, To); 6412 return; 6413 } 6414 6415 // Iterate over just the existing users of From. See the comments in 6416 // the ReplaceAllUsesWith above. 6417 SDNode::use_iterator UI = From.getNode()->use_begin(), 6418 UE = From.getNode()->use_end(); 6419 RAUWUpdateListener Listener(*this, UI, UE); 6420 while (UI != UE) { 6421 SDNode *User = *UI; 6422 bool UserRemovedFromCSEMaps = false; 6423 6424 // A user can appear in a use list multiple times, and when this 6425 // happens the uses are usually next to each other in the list. 6426 // To help reduce the number of CSE recomputations, process all 6427 // the uses of this user that we can find this way. 6428 do { 6429 SDUse &Use = UI.getUse(); 6430 6431 // Skip uses of different values from the same node. 6432 if (Use.getResNo() != From.getResNo()) { 6433 ++UI; 6434 continue; 6435 } 6436 6437 // If this node hasn't been modified yet, it's still in the CSE maps, 6438 // so remove its old self from the CSE maps. 6439 if (!UserRemovedFromCSEMaps) { 6440 RemoveNodeFromCSEMaps(User); 6441 UserRemovedFromCSEMaps = true; 6442 } 6443 6444 ++UI; 6445 Use.set(To); 6446 } while (UI != UE && *UI == User); 6447 6448 // We are iterating over all uses of the From node, so if a use 6449 // doesn't use the specific value, no changes are made. 6450 if (!UserRemovedFromCSEMaps) 6451 continue; 6452 6453 // Now that we have modified User, add it back to the CSE maps. If it 6454 // already exists there, recursively merge the results together. 6455 AddModifiedNodeToCSEMaps(User); 6456 } 6457 6458 // If we just RAUW'd the root, take note. 6459 if (From == getRoot()) 6460 setRoot(To); 6461 } 6462 6463 namespace { 6464 /// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith 6465 /// to record information about a use. 6466 struct UseMemo { 6467 SDNode *User; 6468 unsigned Index; 6469 SDUse *Use; 6470 }; 6471 6472 /// operator< - Sort Memos by User. 6473 bool operator<(const UseMemo &L, const UseMemo &R) { 6474 return (intptr_t)L.User < (intptr_t)R.User; 6475 } 6476 } 6477 6478 /// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving 6479 /// uses of other values produced by From.getNode() alone. The same value 6480 /// may appear in both the From and To list. The Deleted vector is 6481 /// handled the same way as for ReplaceAllUsesWith. 6482 void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From, 6483 const SDValue *To, 6484 unsigned Num){ 6485 // Handle the simple, trivial case efficiently. 6486 if (Num == 1) 6487 return ReplaceAllUsesOfValueWith(*From, *To); 6488 6489 // Read up all the uses and make records of them. This helps 6490 // processing new uses that are introduced during the 6491 // replacement process. 6492 SmallVector<UseMemo, 4> Uses; 6493 for (unsigned i = 0; i != Num; ++i) { 6494 unsigned FromResNo = From[i].getResNo(); 6495 SDNode *FromNode = From[i].getNode(); 6496 for (SDNode::use_iterator UI = FromNode->use_begin(), 6497 E = FromNode->use_end(); UI != E; ++UI) { 6498 SDUse &Use = UI.getUse(); 6499 if (Use.getResNo() == FromResNo) { 6500 UseMemo Memo = { *UI, i, &Use }; 6501 Uses.push_back(Memo); 6502 } 6503 } 6504 } 6505 6506 // Sort the uses, so that all the uses from a given User are together. 6507 std::sort(Uses.begin(), Uses.end()); 6508 6509 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size(); 6510 UseIndex != UseIndexEnd; ) { 6511 // We know that this user uses some value of From. If it is the right 6512 // value, update it. 6513 SDNode *User = Uses[UseIndex].User; 6514 6515 // This node is about to morph, remove its old self from the CSE maps. 6516 RemoveNodeFromCSEMaps(User); 6517 6518 // The Uses array is sorted, so all the uses for a given User 6519 // are next to each other in the list. 6520 // To help reduce the number of CSE recomputations, process all 6521 // the uses of this user that we can find this way. 6522 do { 6523 unsigned i = Uses[UseIndex].Index; 6524 SDUse &Use = *Uses[UseIndex].Use; 6525 ++UseIndex; 6526 6527 Use.set(To[i]); 6528 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User); 6529 6530 // Now that we have modified User, add it back to the CSE maps. If it 6531 // already exists there, recursively merge the results together. 6532 AddModifiedNodeToCSEMaps(User); 6533 } 6534 } 6535 6536 /// AssignTopologicalOrder - Assign a unique node id for each node in the DAG 6537 /// based on their topological order. It returns the maximum id and a vector 6538 /// of the SDNodes* in assigned order by reference. 6539 unsigned SelectionDAG::AssignTopologicalOrder() { 6540 6541 unsigned DAGSize = 0; 6542 6543 // SortedPos tracks the progress of the algorithm. Nodes before it are 6544 // sorted, nodes after it are unsorted. When the algorithm completes 6545 // it is at the end of the list. 6546 allnodes_iterator SortedPos = allnodes_begin(); 6547 6548 // Visit all the nodes. Move nodes with no operands to the front of 6549 // the list immediately. Annotate nodes that do have operands with their 6550 // operand count. Before we do this, the Node Id fields of the nodes 6551 // may contain arbitrary values. After, the Node Id fields for nodes 6552 // before SortedPos will contain the topological sort index, and the 6553 // Node Id fields for nodes At SortedPos and after will contain the 6554 // count of outstanding operands. 6555 for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ) { 6556 SDNode *N = &*I++; 6557 checkForCycles(N, this); 6558 unsigned Degree = N->getNumOperands(); 6559 if (Degree == 0) { 6560 // A node with no uses, add it to the result array immediately. 6561 N->setNodeId(DAGSize++); 6562 allnodes_iterator Q(N); 6563 if (Q != SortedPos) 6564 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q)); 6565 assert(SortedPos != AllNodes.end() && "Overran node list"); 6566 ++SortedPos; 6567 } else { 6568 // Temporarily use the Node Id as scratch space for the degree count. 6569 N->setNodeId(Degree); 6570 } 6571 } 6572 6573 // Visit all the nodes. As we iterate, move nodes into sorted order, 6574 // such that by the time the end is reached all nodes will be sorted. 6575 for (SDNode &Node : allnodes()) { 6576 SDNode *N = &Node; 6577 checkForCycles(N, this); 6578 // N is in sorted position, so all its uses have one less operand 6579 // that needs to be sorted. 6580 for (SDNode::use_iterator UI = N->use_begin(), UE = N->use_end(); 6581 UI != UE; ++UI) { 6582 SDNode *P = *UI; 6583 unsigned Degree = P->getNodeId(); 6584 assert(Degree != 0 && "Invalid node degree"); 6585 --Degree; 6586 if (Degree == 0) { 6587 // All of P's operands are sorted, so P may sorted now. 6588 P->setNodeId(DAGSize++); 6589 if (P != SortedPos) 6590 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P)); 6591 assert(SortedPos != AllNodes.end() && "Overran node list"); 6592 ++SortedPos; 6593 } else { 6594 // Update P's outstanding operand count. 6595 P->setNodeId(Degree); 6596 } 6597 } 6598 if (&Node == SortedPos) { 6599 #ifndef NDEBUG 6600 allnodes_iterator I(N); 6601 SDNode *S = &*++I; 6602 dbgs() << "Overran sorted position:\n"; 6603 S->dumprFull(this); dbgs() << "\n"; 6604 dbgs() << "Checking if this is due to cycles\n"; 6605 checkForCycles(this, true); 6606 #endif 6607 llvm_unreachable(nullptr); 6608 } 6609 } 6610 6611 assert(SortedPos == AllNodes.end() && 6612 "Topological sort incomplete!"); 6613 assert(AllNodes.front().getOpcode() == ISD::EntryToken && 6614 "First node in topological sort is not the entry token!"); 6615 assert(AllNodes.front().getNodeId() == 0 && 6616 "First node in topological sort has non-zero id!"); 6617 assert(AllNodes.front().getNumOperands() == 0 && 6618 "First node in topological sort has operands!"); 6619 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 && 6620 "Last node in topologic sort has unexpected id!"); 6621 assert(AllNodes.back().use_empty() && 6622 "Last node in topologic sort has users!"); 6623 assert(DAGSize == allnodes_size() && "Node count mismatch!"); 6624 return DAGSize; 6625 } 6626 6627 /// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the 6628 /// value is produced by SD. 6629 void SelectionDAG::AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter) { 6630 if (SD) { 6631 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue()); 6632 SD->setHasDebugValue(true); 6633 } 6634 DbgInfo->add(DB, SD, isParameter); 6635 } 6636 6637 /// TransferDbgValues - Transfer SDDbgValues. 6638 void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) { 6639 if (From == To || !From.getNode()->getHasDebugValue()) 6640 return; 6641 SDNode *FromNode = From.getNode(); 6642 SDNode *ToNode = To.getNode(); 6643 ArrayRef<SDDbgValue *> DVs = GetDbgValues(FromNode); 6644 SmallVector<SDDbgValue *, 2> ClonedDVs; 6645 for (ArrayRef<SDDbgValue *>::iterator I = DVs.begin(), E = DVs.end(); 6646 I != E; ++I) { 6647 SDDbgValue *Dbg = *I; 6648 if (Dbg->getKind() == SDDbgValue::SDNODE) { 6649 SDDbgValue *Clone = 6650 getDbgValue(Dbg->getVariable(), Dbg->getExpression(), ToNode, 6651 To.getResNo(), Dbg->isIndirect(), Dbg->getOffset(), 6652 Dbg->getDebugLoc(), Dbg->getOrder()); 6653 ClonedDVs.push_back(Clone); 6654 } 6655 } 6656 for (SmallVectorImpl<SDDbgValue *>::iterator I = ClonedDVs.begin(), 6657 E = ClonedDVs.end(); I != E; ++I) 6658 AddDbgValue(*I, ToNode, false); 6659 } 6660 6661 //===----------------------------------------------------------------------===// 6662 // SDNode Class 6663 //===----------------------------------------------------------------------===// 6664 6665 HandleSDNode::~HandleSDNode() { 6666 DropOperands(); 6667 } 6668 6669 GlobalAddressSDNode::GlobalAddressSDNode(unsigned Opc, unsigned Order, 6670 DebugLoc DL, const GlobalValue *GA, 6671 EVT VT, int64_t o, unsigned char TF) 6672 : SDNode(Opc, Order, DL, getSDVTList(VT)), Offset(o), TargetFlags(TF) { 6673 TheGlobal = GA; 6674 } 6675 6676 AddrSpaceCastSDNode::AddrSpaceCastSDNode(unsigned Order, DebugLoc dl, EVT VT, 6677 SDValue X, unsigned SrcAS, 6678 unsigned DestAS) 6679 : UnarySDNode(ISD::ADDRSPACECAST, Order, dl, getSDVTList(VT), X), 6680 SrcAddrSpace(SrcAS), DestAddrSpace(DestAS) {} 6681 6682 MemSDNode::MemSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 6683 EVT memvt, MachineMemOperand *mmo) 6684 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MMO(mmo) { 6685 SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(), 6686 MMO->isNonTemporal(), MMO->isInvariant()); 6687 assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!"); 6688 assert(isNonTemporal() == MMO->isNonTemporal() && 6689 "Non-temporal encoding error!"); 6690 // We check here that the size of the memory operand fits within the size of 6691 // the MMO. This is because the MMO might indicate only a possible address 6692 // range instead of specifying the affected memory addresses precisely. 6693 assert(memvt.getStoreSize() <= MMO->getSize() && "Size mismatch!"); 6694 } 6695 6696 MemSDNode::MemSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 6697 ArrayRef<SDValue> Ops, EVT memvt, MachineMemOperand *mmo) 6698 : SDNode(Opc, Order, dl, VTs, Ops), 6699 MemoryVT(memvt), MMO(mmo) { 6700 SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(), 6701 MMO->isNonTemporal(), MMO->isInvariant()); 6702 assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!"); 6703 assert(memvt.getStoreSize() <= MMO->getSize() && "Size mismatch!"); 6704 } 6705 6706 /// Profile - Gather unique data for the node. 6707 /// 6708 void SDNode::Profile(FoldingSetNodeID &ID) const { 6709 AddNodeIDNode(ID, this); 6710 } 6711 6712 namespace { 6713 struct EVTArray { 6714 std::vector<EVT> VTs; 6715 6716 EVTArray() { 6717 VTs.reserve(MVT::LAST_VALUETYPE); 6718 for (unsigned i = 0; i < MVT::LAST_VALUETYPE; ++i) 6719 VTs.push_back(MVT((MVT::SimpleValueType)i)); 6720 } 6721 }; 6722 } 6723 6724 static ManagedStatic<std::set<EVT, EVT::compareRawBits> > EVTs; 6725 static ManagedStatic<EVTArray> SimpleVTArray; 6726 static ManagedStatic<sys::SmartMutex<true> > VTMutex; 6727 6728 /// getValueTypeList - Return a pointer to the specified value type. 6729 /// 6730 const EVT *SDNode::getValueTypeList(EVT VT) { 6731 if (VT.isExtended()) { 6732 sys::SmartScopedLock<true> Lock(*VTMutex); 6733 return &(*EVTs->insert(VT).first); 6734 } else { 6735 assert(VT.getSimpleVT() < MVT::LAST_VALUETYPE && 6736 "Value type out of range!"); 6737 return &SimpleVTArray->VTs[VT.getSimpleVT().SimpleTy]; 6738 } 6739 } 6740 6741 /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the 6742 /// indicated value. This method ignores uses of other values defined by this 6743 /// operation. 6744 bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const { 6745 assert(Value < getNumValues() && "Bad value!"); 6746 6747 // TODO: Only iterate over uses of a given value of the node 6748 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) { 6749 if (UI.getUse().getResNo() == Value) { 6750 if (NUses == 0) 6751 return false; 6752 --NUses; 6753 } 6754 } 6755 6756 // Found exactly the right number of uses? 6757 return NUses == 0; 6758 } 6759 6760 6761 /// hasAnyUseOfValue - Return true if there are any use of the indicated 6762 /// value. This method ignores uses of other values defined by this operation. 6763 bool SDNode::hasAnyUseOfValue(unsigned Value) const { 6764 assert(Value < getNumValues() && "Bad value!"); 6765 6766 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) 6767 if (UI.getUse().getResNo() == Value) 6768 return true; 6769 6770 return false; 6771 } 6772 6773 6774 /// isOnlyUserOf - Return true if this node is the only use of N. 6775 /// 6776 bool SDNode::isOnlyUserOf(const SDNode *N) const { 6777 bool Seen = false; 6778 for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) { 6779 SDNode *User = *I; 6780 if (User == this) 6781 Seen = true; 6782 else 6783 return false; 6784 } 6785 6786 return Seen; 6787 } 6788 6789 /// isOperand - Return true if this node is an operand of N. 6790 /// 6791 bool SDValue::isOperandOf(const SDNode *N) const { 6792 for (const SDValue &Op : N->op_values()) 6793 if (*this == Op) 6794 return true; 6795 return false; 6796 } 6797 6798 bool SDNode::isOperandOf(const SDNode *N) const { 6799 for (const SDValue &Op : N->op_values()) 6800 if (this == Op.getNode()) 6801 return true; 6802 return false; 6803 } 6804 6805 /// reachesChainWithoutSideEffects - Return true if this operand (which must 6806 /// be a chain) reaches the specified operand without crossing any 6807 /// side-effecting instructions on any chain path. In practice, this looks 6808 /// through token factors and non-volatile loads. In order to remain efficient, 6809 /// this only looks a couple of nodes in, it does not do an exhaustive search. 6810 bool SDValue::reachesChainWithoutSideEffects(SDValue Dest, 6811 unsigned Depth) const { 6812 if (*this == Dest) return true; 6813 6814 // Don't search too deeply, we just want to be able to see through 6815 // TokenFactor's etc. 6816 if (Depth == 0) return false; 6817 6818 // If this is a token factor, all inputs to the TF happen in parallel. If any 6819 // of the operands of the TF does not reach dest, then we cannot do the xform. 6820 if (getOpcode() == ISD::TokenFactor) { 6821 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) 6822 if (!getOperand(i).reachesChainWithoutSideEffects(Dest, Depth-1)) 6823 return false; 6824 return true; 6825 } 6826 6827 // Loads don't have side effects, look through them. 6828 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) { 6829 if (!Ld->isVolatile()) 6830 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1); 6831 } 6832 return false; 6833 } 6834 6835 /// hasPredecessor - Return true if N is a predecessor of this node. 6836 /// N is either an operand of this node, or can be reached by recursively 6837 /// traversing up the operands. 6838 /// NOTE: This is an expensive method. Use it carefully. 6839 bool SDNode::hasPredecessor(const SDNode *N) const { 6840 SmallPtrSet<const SDNode *, 32> Visited; 6841 SmallVector<const SDNode *, 16> Worklist; 6842 return hasPredecessorHelper(N, Visited, Worklist); 6843 } 6844 6845 bool 6846 SDNode::hasPredecessorHelper(const SDNode *N, 6847 SmallPtrSetImpl<const SDNode *> &Visited, 6848 SmallVectorImpl<const SDNode *> &Worklist) const { 6849 if (Visited.empty()) { 6850 Worklist.push_back(this); 6851 } else { 6852 // Take a look in the visited set. If we've already encountered this node 6853 // we needn't search further. 6854 if (Visited.count(N)) 6855 return true; 6856 } 6857 6858 // Haven't visited N yet. Continue the search. 6859 while (!Worklist.empty()) { 6860 const SDNode *M = Worklist.pop_back_val(); 6861 for (const SDValue &OpV : M->op_values()) { 6862 SDNode *Op = OpV.getNode(); 6863 if (Visited.insert(Op).second) 6864 Worklist.push_back(Op); 6865 if (Op == N) 6866 return true; 6867 } 6868 } 6869 6870 return false; 6871 } 6872 6873 uint64_t SDNode::getConstantOperandVal(unsigned Num) const { 6874 assert(Num < NumOperands && "Invalid child # of SDNode!"); 6875 return cast<ConstantSDNode>(OperandList[Num])->getZExtValue(); 6876 } 6877 6878 const SDNodeFlags *SDNode::getFlags() const { 6879 if (auto *FlagsNode = dyn_cast<BinaryWithFlagsSDNode>(this)) 6880 return &FlagsNode->Flags; 6881 return nullptr; 6882 } 6883 6884 SDValue SelectionDAG::UnrollVectorOp(SDNode *N, unsigned ResNE) { 6885 assert(N->getNumValues() == 1 && 6886 "Can't unroll a vector with multiple results!"); 6887 6888 EVT VT = N->getValueType(0); 6889 unsigned NE = VT.getVectorNumElements(); 6890 EVT EltVT = VT.getVectorElementType(); 6891 SDLoc dl(N); 6892 6893 SmallVector<SDValue, 8> Scalars; 6894 SmallVector<SDValue, 4> Operands(N->getNumOperands()); 6895 6896 // If ResNE is 0, fully unroll the vector op. 6897 if (ResNE == 0) 6898 ResNE = NE; 6899 else if (NE > ResNE) 6900 NE = ResNE; 6901 6902 unsigned i; 6903 for (i= 0; i != NE; ++i) { 6904 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) { 6905 SDValue Operand = N->getOperand(j); 6906 EVT OperandVT = Operand.getValueType(); 6907 if (OperandVT.isVector()) { 6908 // A vector operand; extract a single element. 6909 EVT OperandEltVT = OperandVT.getVectorElementType(); 6910 Operands[j] = 6911 getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT, Operand, 6912 getConstant(i, dl, TLI->getVectorIdxTy(getDataLayout()))); 6913 } else { 6914 // A scalar operand; just use it as is. 6915 Operands[j] = Operand; 6916 } 6917 } 6918 6919 switch (N->getOpcode()) { 6920 default: { 6921 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands, 6922 N->getFlags())); 6923 break; 6924 } 6925 case ISD::VSELECT: 6926 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands)); 6927 break; 6928 case ISD::SHL: 6929 case ISD::SRA: 6930 case ISD::SRL: 6931 case ISD::ROTL: 6932 case ISD::ROTR: 6933 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0], 6934 getShiftAmountOperand(Operands[0].getValueType(), 6935 Operands[1]))); 6936 break; 6937 case ISD::SIGN_EXTEND_INREG: 6938 case ISD::FP_ROUND_INREG: { 6939 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType(); 6940 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, 6941 Operands[0], 6942 getValueType(ExtVT))); 6943 } 6944 } 6945 } 6946 6947 for (; i < ResNE; ++i) 6948 Scalars.push_back(getUNDEF(EltVT)); 6949 6950 return getNode(ISD::BUILD_VECTOR, dl, 6951 EVT::getVectorVT(*getContext(), EltVT, ResNE), Scalars); 6952 } 6953 6954 6955 /// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a 6956 /// location that is 'Dist' units away from the location that the 'Base' load 6957 /// is loading from. 6958 bool SelectionDAG::isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base, 6959 unsigned Bytes, int Dist) const { 6960 if (LD->getChain() != Base->getChain()) 6961 return false; 6962 EVT VT = LD->getValueType(0); 6963 if (VT.getSizeInBits() / 8 != Bytes) 6964 return false; 6965 6966 SDValue Loc = LD->getOperand(1); 6967 SDValue BaseLoc = Base->getOperand(1); 6968 if (Loc.getOpcode() == ISD::FrameIndex) { 6969 if (BaseLoc.getOpcode() != ISD::FrameIndex) 6970 return false; 6971 const MachineFrameInfo *MFI = getMachineFunction().getFrameInfo(); 6972 int FI = cast<FrameIndexSDNode>(Loc)->getIndex(); 6973 int BFI = cast<FrameIndexSDNode>(BaseLoc)->getIndex(); 6974 int FS = MFI->getObjectSize(FI); 6975 int BFS = MFI->getObjectSize(BFI); 6976 if (FS != BFS || FS != (int)Bytes) return false; 6977 return MFI->getObjectOffset(FI) == (MFI->getObjectOffset(BFI) + Dist*Bytes); 6978 } 6979 6980 // Handle X + C. 6981 if (isBaseWithConstantOffset(Loc)) { 6982 int64_t LocOffset = cast<ConstantSDNode>(Loc.getOperand(1))->getSExtValue(); 6983 if (Loc.getOperand(0) == BaseLoc) { 6984 // If the base location is a simple address with no offset itself, then 6985 // the second load's first add operand should be the base address. 6986 if (LocOffset == Dist * (int)Bytes) 6987 return true; 6988 } else if (isBaseWithConstantOffset(BaseLoc)) { 6989 // The base location itself has an offset, so subtract that value from the 6990 // second load's offset before comparing to distance * size. 6991 int64_t BOffset = 6992 cast<ConstantSDNode>(BaseLoc.getOperand(1))->getSExtValue(); 6993 if (Loc.getOperand(0) == BaseLoc.getOperand(0)) { 6994 if ((LocOffset - BOffset) == Dist * (int)Bytes) 6995 return true; 6996 } 6997 } 6998 } 6999 const GlobalValue *GV1 = nullptr; 7000 const GlobalValue *GV2 = nullptr; 7001 int64_t Offset1 = 0; 7002 int64_t Offset2 = 0; 7003 bool isGA1 = TLI->isGAPlusOffset(Loc.getNode(), GV1, Offset1); 7004 bool isGA2 = TLI->isGAPlusOffset(BaseLoc.getNode(), GV2, Offset2); 7005 if (isGA1 && isGA2 && GV1 == GV2) 7006 return Offset1 == (Offset2 + Dist*Bytes); 7007 return false; 7008 } 7009 7010 7011 /// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if 7012 /// it cannot be inferred. 7013 unsigned SelectionDAG::InferPtrAlignment(SDValue Ptr) const { 7014 // If this is a GlobalAddress + cst, return the alignment. 7015 const GlobalValue *GV; 7016 int64_t GVOffset = 0; 7017 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) { 7018 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType()); 7019 APInt KnownZero(PtrWidth, 0), KnownOne(PtrWidth, 0); 7020 llvm::computeKnownBits(const_cast<GlobalValue *>(GV), KnownZero, KnownOne, 7021 getDataLayout()); 7022 unsigned AlignBits = KnownZero.countTrailingOnes(); 7023 unsigned Align = AlignBits ? 1 << std::min(31U, AlignBits) : 0; 7024 if (Align) 7025 return MinAlign(Align, GVOffset); 7026 } 7027 7028 // If this is a direct reference to a stack slot, use information about the 7029 // stack slot's alignment. 7030 int FrameIdx = 1 << 31; 7031 int64_t FrameOffset = 0; 7032 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) { 7033 FrameIdx = FI->getIndex(); 7034 } else if (isBaseWithConstantOffset(Ptr) && 7035 isa<FrameIndexSDNode>(Ptr.getOperand(0))) { 7036 // Handle FI+Cst 7037 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex(); 7038 FrameOffset = Ptr.getConstantOperandVal(1); 7039 } 7040 7041 if (FrameIdx != (1 << 31)) { 7042 const MachineFrameInfo &MFI = *getMachineFunction().getFrameInfo(); 7043 unsigned FIInfoAlign = MinAlign(MFI.getObjectAlignment(FrameIdx), 7044 FrameOffset); 7045 return FIInfoAlign; 7046 } 7047 7048 return 0; 7049 } 7050 7051 /// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type 7052 /// which is split (or expanded) into two not necessarily identical pieces. 7053 std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const { 7054 // Currently all types are split in half. 7055 EVT LoVT, HiVT; 7056 if (!VT.isVector()) { 7057 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT); 7058 } else { 7059 unsigned NumElements = VT.getVectorNumElements(); 7060 assert(!(NumElements & 1) && "Splitting vector, but not in half!"); 7061 LoVT = HiVT = EVT::getVectorVT(*getContext(), VT.getVectorElementType(), 7062 NumElements/2); 7063 } 7064 return std::make_pair(LoVT, HiVT); 7065 } 7066 7067 /// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the 7068 /// low/high part. 7069 std::pair<SDValue, SDValue> 7070 SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, 7071 const EVT &HiVT) { 7072 assert(LoVT.getVectorNumElements() + HiVT.getVectorNumElements() <= 7073 N.getValueType().getVectorNumElements() && 7074 "More vector elements requested than available!"); 7075 SDValue Lo, Hi; 7076 Lo = getNode(ISD::EXTRACT_SUBVECTOR, DL, LoVT, N, 7077 getConstant(0, DL, TLI->getVectorIdxTy(getDataLayout()))); 7078 Hi = getNode(ISD::EXTRACT_SUBVECTOR, DL, HiVT, N, 7079 getConstant(LoVT.getVectorNumElements(), DL, 7080 TLI->getVectorIdxTy(getDataLayout()))); 7081 return std::make_pair(Lo, Hi); 7082 } 7083 7084 void SelectionDAG::ExtractVectorElements(SDValue Op, 7085 SmallVectorImpl<SDValue> &Args, 7086 unsigned Start, unsigned Count) { 7087 EVT VT = Op.getValueType(); 7088 if (Count == 0) 7089 Count = VT.getVectorNumElements(); 7090 7091 EVT EltVT = VT.getVectorElementType(); 7092 EVT IdxTy = TLI->getVectorIdxTy(getDataLayout()); 7093 SDLoc SL(Op); 7094 for (unsigned i = Start, e = Start + Count; i != e; ++i) { 7095 Args.push_back(getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, 7096 Op, getConstant(i, SL, IdxTy))); 7097 } 7098 } 7099 7100 // getAddressSpace - Return the address space this GlobalAddress belongs to. 7101 unsigned GlobalAddressSDNode::getAddressSpace() const { 7102 return getGlobal()->getType()->getAddressSpace(); 7103 } 7104 7105 7106 Type *ConstantPoolSDNode::getType() const { 7107 if (isMachineConstantPoolEntry()) 7108 return Val.MachineCPVal->getType(); 7109 return Val.ConstVal->getType(); 7110 } 7111 7112 bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, 7113 APInt &SplatUndef, 7114 unsigned &SplatBitSize, 7115 bool &HasAnyUndefs, 7116 unsigned MinSplatBits, 7117 bool isBigEndian) const { 7118 EVT VT = getValueType(0); 7119 assert(VT.isVector() && "Expected a vector type"); 7120 unsigned sz = VT.getSizeInBits(); 7121 if (MinSplatBits > sz) 7122 return false; 7123 7124 SplatValue = APInt(sz, 0); 7125 SplatUndef = APInt(sz, 0); 7126 7127 // Get the bits. Bits with undefined values (when the corresponding element 7128 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared 7129 // in SplatValue. If any of the values are not constant, give up and return 7130 // false. 7131 unsigned int nOps = getNumOperands(); 7132 assert(nOps > 0 && "isConstantSplat has 0-size build vector"); 7133 unsigned EltBitSize = VT.getVectorElementType().getSizeInBits(); 7134 7135 for (unsigned j = 0; j < nOps; ++j) { 7136 unsigned i = isBigEndian ? nOps-1-j : j; 7137 SDValue OpVal = getOperand(i); 7138 unsigned BitPos = j * EltBitSize; 7139 7140 if (OpVal.getOpcode() == ISD::UNDEF) 7141 SplatUndef |= APInt::getBitsSet(sz, BitPos, BitPos + EltBitSize); 7142 else if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(OpVal)) 7143 SplatValue |= CN->getAPIntValue().zextOrTrunc(EltBitSize). 7144 zextOrTrunc(sz) << BitPos; 7145 else if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(OpVal)) 7146 SplatValue |= CN->getValueAPF().bitcastToAPInt().zextOrTrunc(sz) <<BitPos; 7147 else 7148 return false; 7149 } 7150 7151 // The build_vector is all constants or undefs. Find the smallest element 7152 // size that splats the vector. 7153 7154 HasAnyUndefs = (SplatUndef != 0); 7155 while (sz > 8) { 7156 7157 unsigned HalfSize = sz / 2; 7158 APInt HighValue = SplatValue.lshr(HalfSize).trunc(HalfSize); 7159 APInt LowValue = SplatValue.trunc(HalfSize); 7160 APInt HighUndef = SplatUndef.lshr(HalfSize).trunc(HalfSize); 7161 APInt LowUndef = SplatUndef.trunc(HalfSize); 7162 7163 // If the two halves do not match (ignoring undef bits), stop here. 7164 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) || 7165 MinSplatBits > HalfSize) 7166 break; 7167 7168 SplatValue = HighValue | LowValue; 7169 SplatUndef = HighUndef & LowUndef; 7170 7171 sz = HalfSize; 7172 } 7173 7174 SplatBitSize = sz; 7175 return true; 7176 } 7177 7178 SDValue BuildVectorSDNode::getSplatValue(BitVector *UndefElements) const { 7179 if (UndefElements) { 7180 UndefElements->clear(); 7181 UndefElements->resize(getNumOperands()); 7182 } 7183 SDValue Splatted; 7184 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 7185 SDValue Op = getOperand(i); 7186 if (Op.getOpcode() == ISD::UNDEF) { 7187 if (UndefElements) 7188 (*UndefElements)[i] = true; 7189 } else if (!Splatted) { 7190 Splatted = Op; 7191 } else if (Splatted != Op) { 7192 return SDValue(); 7193 } 7194 } 7195 7196 if (!Splatted) { 7197 assert(getOperand(0).getOpcode() == ISD::UNDEF && 7198 "Can only have a splat without a constant for all undefs."); 7199 return getOperand(0); 7200 } 7201 7202 return Splatted; 7203 } 7204 7205 ConstantSDNode * 7206 BuildVectorSDNode::getConstantSplatNode(BitVector *UndefElements) const { 7207 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements)); 7208 } 7209 7210 ConstantFPSDNode * 7211 BuildVectorSDNode::getConstantFPSplatNode(BitVector *UndefElements) const { 7212 return dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements)); 7213 } 7214 7215 int32_t 7216 BuildVectorSDNode::getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, 7217 uint32_t BitWidth) const { 7218 if (ConstantFPSDNode *CN = 7219 dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements))) { 7220 bool IsExact; 7221 APSInt IntVal(BitWidth); 7222 APFloat APF = CN->getValueAPF(); 7223 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) != 7224 APFloat::opOK || 7225 !IsExact) 7226 return -1; 7227 7228 return IntVal.exactLogBase2(); 7229 } 7230 return -1; 7231 } 7232 7233 bool BuildVectorSDNode::isConstant() const { 7234 for (const SDValue &Op : op_values()) { 7235 unsigned Opc = Op.getOpcode(); 7236 if (Opc != ISD::UNDEF && Opc != ISD::Constant && Opc != ISD::ConstantFP) 7237 return false; 7238 } 7239 return true; 7240 } 7241 7242 bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) { 7243 // Find the first non-undef value in the shuffle mask. 7244 unsigned i, e; 7245 for (i = 0, e = VT.getVectorNumElements(); i != e && Mask[i] < 0; ++i) 7246 /* search */; 7247 7248 assert(i != e && "VECTOR_SHUFFLE node with all undef indices!"); 7249 7250 // Make sure all remaining elements are either undef or the same as the first 7251 // non-undef value. 7252 for (int Idx = Mask[i]; i != e; ++i) 7253 if (Mask[i] >= 0 && Mask[i] != Idx) 7254 return false; 7255 return true; 7256 } 7257 7258 #ifndef NDEBUG 7259 static void checkForCyclesHelper(const SDNode *N, 7260 SmallPtrSetImpl<const SDNode*> &Visited, 7261 SmallPtrSetImpl<const SDNode*> &Checked, 7262 const llvm::SelectionDAG *DAG) { 7263 // If this node has already been checked, don't check it again. 7264 if (Checked.count(N)) 7265 return; 7266 7267 // If a node has already been visited on this depth-first walk, reject it as 7268 // a cycle. 7269 if (!Visited.insert(N).second) { 7270 errs() << "Detected cycle in SelectionDAG\n"; 7271 dbgs() << "Offending node:\n"; 7272 N->dumprFull(DAG); dbgs() << "\n"; 7273 abort(); 7274 } 7275 7276 for (const SDValue &Op : N->op_values()) 7277 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG); 7278 7279 Checked.insert(N); 7280 Visited.erase(N); 7281 } 7282 #endif 7283 7284 void llvm::checkForCycles(const llvm::SDNode *N, 7285 const llvm::SelectionDAG *DAG, 7286 bool force) { 7287 #ifndef NDEBUG 7288 bool check = force; 7289 #ifdef XDEBUG 7290 check = true; 7291 #endif // XDEBUG 7292 if (check) { 7293 assert(N && "Checking nonexistent SDNode"); 7294 SmallPtrSet<const SDNode*, 32> visited; 7295 SmallPtrSet<const SDNode*, 32> checked; 7296 checkForCyclesHelper(N, visited, checked, DAG); 7297 } 7298 #endif // !NDEBUG 7299 } 7300 7301 void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) { 7302 checkForCycles(DAG->getRoot().getNode(), DAG, force); 7303 } 7304