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