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