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